ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ODFkMmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFhZmQ0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDIxNmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmZmI1Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFNlcnZlciBBZGFwdGVycwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNlcnZlciBhZGFwdGVycyBmb3IgdXNlIHdpdGggdGhlIEpTVCBzZXJ2ZXIgdG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzY1NzJjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGoiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc3MzcyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZjlkYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIEFkYXB0ZXJzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwMzRkOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUoyRUUgU3RhbmRhcmQgVG9vbHMgLSBTZXJ2ZXIgQWRhcHRlcnMgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTVlNzIwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbAotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTQyMzguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KU1QgU2VydmVyIEFkYXB0ZXJzIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBKU1QgU2VydmVyIEFkYXB0ZXJzLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZjlkYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIEFkYXB0ZXJzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwMzRkOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUoyRUUgU3RhbmRhcmQgVG9vbHMgLSBTZXJ2ZXIgQWRhcHRlcnMgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWIwOTcxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZmVhdHVyZXMKLXBsdWdpbnMKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWU2ODNhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2EyNDE0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDBlNTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KU1QgU2VydmVyIEFkYXB0ZXIgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlNUIHNlcnZlciB0b29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2MTA3My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ODNiY2YuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZV8xLjAuMC4qLnppcAotb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmVfMS41LjAuKi56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZTM1YmIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2QyMTZmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTE5NjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFNlcnZlciBDb3JlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SlNUIHNlcnZlciBjb3JlIGZ1bmN0aW9uYWxpdHkKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1MjZlYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY2FjdHVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZGNkN2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUoyRUUgU3RhbmRhcmQgVG9vbHMgLSBTZXJ2ZXIgQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1YWViYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SjJFRSBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDllOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQ3ZmY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KU1QgU2VydmVyIENvcmUgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIEpTVCBTZXJ2ZXIgQ29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkY2Q3Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SjJFRSBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzVhZWJhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWIwOTcxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZmVhdHVyZXMKLXBsdWdpbnMKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWIxZjE2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGNiMjY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZSwgZmVhdHVyZUBvcmcuZWNsaXBzZS5qc3Quc2VydmVyX2NvcmUuZmVhdHVyZS5zb3VyY2UKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjMjRlMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpTVCBTZXJ2ZXIgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlNUIHNlcnZlciB0b29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0ZGNlMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAKLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkMzZmMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2QyMTZmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ODQ0Y2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpTVCBTZXJ2ZXIgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KU1Qgc2VydmVyIHRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVkMmY2NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC50ZXN0cy5wZXJmb3JtYW5jZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTRkMzQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDIxNmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMmY3NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFNlcnZlciBVSQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpTVCBzZXJ2ZXIgVUkgZnVuY3Rpb25hbGl0eQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDc4YTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTM5M2Q4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SjJFRSBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBVSVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjZlNmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiODljMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUuc291cmNlID0gb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9jb3JlLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzFjODMxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFNlcnZlciBVSSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlNUIHNlcnZlciBVSS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYjczNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTM5M2Q4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SjJFRSBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBVSVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjZlNmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KMkVFIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDJkNDc3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmVfMS4wLjAuamFyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzcxOTYzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMzY0YWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SlNUIFNlcnZlciBVc2VyIERvY3VtZW50YXRpb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KU1Qgc2VydmVyIHVzZXIgZG9jdW1lbnRhdGlvbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JlYmEyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmYwOWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZmRiN2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBTZXJ2ZXIgQWRhcHRlcnMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1TZXJ2ZXIgYWRhcHRlcnMgZm9yIHVzZSB3aXRoIHRoZSBXU1Qgc2VydmVyIHRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRiMDQ1My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy40LjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNWU3MjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjZGZlZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBTZXJ2ZXIgQWRhcHRlcnMgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBTZXJ2ZXIgQWRhcHRlcnMuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGJhNjRjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIEFkYXB0ZXJzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5NTU5Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmI1Mjc1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFNlcnZlciBBZGFwdGVycyBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWIwOTcxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZmVhdHVyZXMKLXBsdWdpbnMKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzcyM2ViLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjcyNGFkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5mZWF0dXJlCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfYWRhcHRlcnMuc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZjMzZDkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgU2VydmVyIEFkYXB0ZXIgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIHNlcnZlciB0b29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4MmU5My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9hZGFwdGVycy5zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2FkYXB0ZXJzLnNkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzYzNmYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMWY5YzQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLXNyYy5pbmNsdWRlcyA9IGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlMTI4NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoIiBkZWZhdWx0PSJidWlsZC51cGRhdGUuamFyIiBiYXNlZGlyPSIuIj4KLQotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmZWF0dXJlLnRlbXAuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfS9mZWF0dXJlLnRlbXAuZm9sZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmZWF0dXJlLmRlc3RpbmF0aW9uIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJhbGwucGx1Z2lucyIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBkaXI9Ii4uL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgdGFyZ2V0PSIke3RhcmdldH0iPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImFsbC5mZWF0dXJlcyIgZGVwZW5kcz0iaW5pdCI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ1cGRhdGUuZmVhdHVyZSIgZGVwZW5kcz0iaW5pdCI+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImFsbC5jaGlsZHJlbiIgZGVwZW5kcz0iaW5pdCxhbGwuZmVhdHVyZXMsYWxsLnBsdWdpbnMsdXBkYXRlLmZlYXR1cmUiPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjaGlsZHJlbiIgaWY9ImluY2x1ZGUuY2hpbGRyZW4iPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImFsbC5jaGlsZHJlbiIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC5qYXJzIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iQnVpbGQgYWxsIHRoZSBqYXJzIGZvciB0aGUgZmVhdHVyZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2guIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGwuY2hpbGRyZW4iPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImJ1aWxkLmphcnMiLz4KLQkJPC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC5zb3VyY2VzIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGwuY2hpbGRyZW4iPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImJ1aWxkLnNvdXJjZXMiLz4KLQkJPC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC56aXBzIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGwuY2hpbGRyZW4iPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImJ1aWxkLnppcHMiLz4KLQkJPC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC51cGRhdGUuamFyIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iQnVpbGQgdGhlIGZlYXR1cmUgamFyIG9mOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaCBmb3IgYW4gdXBkYXRlIHNpdGUuIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGwuY2hpbGRyZW4iPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImJ1aWxkLnVwZGF0ZS5qYXIiLz4KLQkJPC9hbnRjYWxsPgotCQk8cHJvcGVydHkgbmFtZT0iZmVhdHVyZS5iYXNlIiB2YWx1ZT0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCQk8ZGVsZXRlIGRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iZ2F0aGVyLmJpbi5wYXJ0cyIgaW5oZXJpdEFsbD0iZmFsc2UiPgotCQkJPHBhcmFtIG5hbWU9Im5sIiB2YWx1ZT0iKiIvPgotCQkJPHBhcmFtIG5hbWU9ImFyY2giIHZhbHVlPSIqIi8+Ci0JCQk8cGFyYW0gbmFtZT0ib3MiIHZhbHVlPSIqIi8+Ci0JCQk8cGFyYW0gbmFtZT0id3MiIHZhbHVlPSIqIi8+Ci0JCQk8cGFyYW0gbmFtZT0iZmVhdHVyZS5iYXNlIiB2YWx1ZT0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCQk8L2FudGNhbGw+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7ZmVhdHVyZS5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2hfMS4wLjAuMjAwNzA1MjQxNDQyLmphciIgYmFzZWRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaF8xLjAuMC4yMDA3MDUyNDE0NDIiLz4KLQkJPGRlbGV0ZSBkaXI9IiR7ZmVhdHVyZS50ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2F0aGVyLmJpbi5wYXJ0cyIgZGVwZW5kcz0iaW5pdCIgaWY9ImZlYXR1cmUuYmFzZSI+Ci0JCTxta2RpciBkaXI9IiR7ZmVhdHVyZS5iYXNlfS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaF8xLjAuMC4yMDA3MDUyNDE0NDIiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjaGlsZHJlbiI+Ci0JCQk8cGFyYW0gbmFtZT0idGFyZ2V0IiB2YWx1ZT0iZ2F0aGVyLmJpbi5wYXJ0cyIvPgotCQkJPHBhcmFtIG5hbWU9ImRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIiB2YWx1ZT0iJHtmZWF0dXJlLmJhc2V9L3BsdWdpbnMiLz4KLQkJPC9hbnRjYWxsPgotCQk8Y29weSB0b2Rpcj0iJHtmZWF0dXJlLmJhc2V9L2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoXzEuMC4wLjIwMDcwNTI0MTQ0MiIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0iZmFsc2UiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iZmVhdHVyZS54bWwsbGljZW5zZS5odG1sLGZlYXR1cmUucHJvcGVydGllcyxlcGwtdjEwLmh0bWwsZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIJCQkvPgotCQk8L2NvcHk+Ci0JCTxlY2xpcHNlLmlkUmVwbGFjZXIgZmVhdHVyZUZpbGVQYXRoPSIke2ZlYXR1cmUuYmFzZX0vZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2hfMS4wLjAuMjAwNzA1MjQxNDQyL2ZlYXR1cmUueG1sIiAgc2VsZlZlcnNpb249IjEuMC4wLjIwMDcwNTI0MTQ0MiIgZmVhdHVyZUlkcz0iIiBwbHVnaW5JZHM9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSwxLjAuMTA3LjIwMDcwNTI0MTQ0MiwiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyb290RmlsZXMke29zfV8ke3dzfV8ke2FyY2h9Ii8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXMqXypfKiI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJyb290RmlsZXNncm91cF9ncm91cF9ncm91cCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0icm9vdEZpbGVzKl8qXyoiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iemlwLmRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IkNyZWF0ZSBhIHppcCBjb250YWluaW5nIGFsbCB0aGUgcGx1Zy1pbnMgYW5kIGZlYXR1cmVzIGZvciB0aGUgZmVhdHVyZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2guIj4KLQkJPGRlbGV0ZSBkaXI9IiR7ZmVhdHVyZS50ZW1wLmZvbGRlcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImdhdGhlci5iaW4ucGFydHMiPgotCQkJPHBhcmFtIG5hbWU9Im5sIiB2YWx1ZT0iKiIvPgotCQkJPHBhcmFtIG5hbWU9ImFyY2giIHZhbHVlPSIqIi8+Ci0JCQk8cGFyYW0gbmFtZT0iaW5jbHVkZS5jaGlsZHJlbiIgdmFsdWU9InRydWUiLz4KLQkJCTxwYXJhbSBuYW1lPSJvcyIgdmFsdWU9IioiLz4KLQkJCTxwYXJhbSBuYW1lPSJ3cyIgdmFsdWU9IioiLz4KLQkJCTxwYXJhbSBuYW1lPSJmZWF0dXJlLmJhc2UiIHZhbHVlPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPHppcCBkZXN0ZmlsZT0iJHtmZWF0dXJlLmRlc3RpbmF0aW9ufS9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaF8xLjAuMC4yMDA3MDUyNDE0NDIuYmluLmRpc3QuemlwIiBiYXNlZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9IiBmaWxlc29ubHk9ImZhbHNlIiB3aGVuZW1wdHk9InNraXAiIHVwZGF0ZT0iZmFsc2UiLz4KLQkJPGRlbGV0ZSBkaXI9IiR7ZmVhdHVyZS50ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iemlwLnNvdXJjZXMiIGRlcGVuZHM9ImluaXQiPgotCQk8ZGVsZXRlIGRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCQk8bWtkaXIgZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsLmNoaWxkcmVuIj4KLQkJCTxwYXJhbSBuYW1lPSJpbmNsdWRlLmNoaWxkcmVuIiB2YWx1ZT0idHJ1ZSIvPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImdhdGhlci5zb3VyY2VzIi8+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9L3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2guc291cmNlXzEuMC4wLjIwMDcwNTI0MTQ0Mi9zcmMiLz4KLQkJPC9hbnRjYWxsPgotCQk8emlwIGRlc3RmaWxlPSIke2ZlYXR1cmUuZGVzdGluYXRpb259L29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoXzEuMC4wLjIwMDcwNTI0MTQ0Mi5zcmMuemlwIiBiYXNlZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9IiBmaWxlc29ubHk9InRydWUiIHdoZW5lbXB0eT0ic2tpcCIgdXBkYXRlPSJmYWxzZSIvPgotCQk8ZGVsZXRlIGRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJ6aXAubG9ncyIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxkZWxldGUgZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7ZmVhdHVyZS50ZW1wLmZvbGRlcn0iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGwuY2hpbGRyZW4iIGluaGVyaXRBbGw9ImZhbHNlIj4KLQkJCTxwYXJhbSBuYW1lPSJpbmNsdWRlLmNoaWxkcmVuIiB2YWx1ZT0idHJ1ZSIvPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImdhdGhlci5sb2dzIi8+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9L3BsdWdpbnMiLz4KLQkJPC9hbnRjYWxsPgotCQk8emlwIGRlc3RmaWxlPSIke2ZlYXR1cmUuZGVzdGluYXRpb259L29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoXzEuMC4wLjIwMDcwNTI0MTQ0Mi5sb2cuemlwIiBiYXNlZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9IiBmaWxlc29ubHk9InRydWUiIHdoZW5lbXB0eT0ic2tpcCIgdXBkYXRlPSJmYWxzZSIvPgotCQk8ZGVsZXRlIGRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IkNsZWFuIHRoZSBmZWF0dXJlOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaCBvZiBhbGwgdGhlIHppcHMsIGphcnMgYW5kIGxvZ3MgY3JlYXRlZC4iPgotCQk8ZGVsZXRlIGZpbGU9IiR7ZmVhdHVyZS5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2hfMS4wLjAuMjAwNzA1MjQxNDQyLmphciIvPgotCQk8ZGVsZXRlIGZpbGU9IiR7ZmVhdHVyZS5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2hfMS4wLjAuMjAwNzA1MjQxNDQyLmJpbi5kaXN0LnppcCIvPgotCQk8ZGVsZXRlIGZpbGU9IiR7ZmVhdHVyZS5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2hfMS4wLjAuMjAwNzA1MjQxNDQyLmxvZy56aXAiLz4KLQkJPGRlbGV0ZSBmaWxlPSIke2ZlYXR1cmUuZGVzdGluYXRpb259L29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoXzEuMC4wLjIwMDcwNTI0MTQ0Mi5zcmMuemlwIi8+Ci0JCTxkZWxldGUgZGlyPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsLmNoaWxkcmVuIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJjbGVhbiIvPgotCQk8L2FudGNhbGw+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InJlZnJlc2giIGRlcGVuZHM9ImluaXQiIGlmPSJlY2xpcHNlLnJ1bm5pbmciIGRlc2NyaXB0aW9uPSJSZWZyZXNoIHRoaXMgZm9sZGVyLiI+Ci0JCTxlY2xpcHNlLmNvbnZlcnRQYXRoIGZpbGVTeXN0ZW1QYXRoPSJEOi9idWlsZHMvV29ya3NwYWNlcy9XVFAxNW1haW50ZW5hbmNlL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoLyIgcHJvcGVydHk9InJlc291cmNlUGF0aCIvPgotCQk8ZWNsaXBzZS5yZWZyZXNoTG9jYWwgcmVzb3VyY2U9IiR7cmVzb3VyY2VQYXRofSIgZGVwdGg9ImluZmluaXRlIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsLmNoaWxkcmVuIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJyZWZyZXNoIi8+Ci0JCTwvYW50Y2FsbD4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImdhdGhlci5zb3VyY2VzIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjaGlsZHJlbiI+Ci0JCQk8cGFyYW0gbmFtZT0idGFyZ2V0IiB2YWx1ZT0iZ2F0aGVyLnNvdXJjZXMiLz4KLQkJCTxwYXJhbSBuYW1lPSJkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciIgdmFsdWU9IiR7ZmVhdHVyZS50ZW1wLmZvbGRlcn0vcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC5zb3VyY2VfMS4wLjAuMjAwNzA1MjQxNDQyL3NyYyIvPgotCQk8L2FudGNhbGw+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImdhdGhlci5sb2dzIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtmZWF0dXJlLnRlbXAuZm9sZGVyfSIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImFsbC5jaGlsZHJlbiIgaW5oZXJpdEFsbD0iZmFsc2UiPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImdhdGhlci5sb2dzIi8+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke2ZlYXR1cmUudGVtcC5mb2xkZXJ9L3BsdWdpbnMiLz4KLQkJPC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NWEzNTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFNlcnZlciBDb3JlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249XAotQSBwYXRjaCBmb3IgU2VydmVyIHRvb2xzIGZyYW1ld29yayBjb3JlLiBcblwKLVRoaXMgcGF0Y2ggZml4ZXMgYSBwcm9ibGVtIHdpdGggcGVyZm9ybWFuY2Ugd2hlbiB0aGVyZSBpcyBhIGxhcmdlIG51bWJlciBvZiBwcm9qZWN0cyBcblwKLWluIGEgd29ya3NwYWNlLiBcblwKLVNlZSBidWcgMTg3MTg3IChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg3MTg3KSkgXG4KLQotCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FjYzZlYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoIgotICAgICAgbGFiZWw9IlBhdGNoIEZlYXR1cmUgZm9yIFNlcnZlciBDb3JlIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjUuNC52MjAwNzA0MTUwMTMzLS0tLS0xRzk1NUg1RzVFcCIgcGF0Y2g9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWZkN2RhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkMjE2Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjYwYTY0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBTZXJ2ZXIgQ29yZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNlcnZlciB0b29scyBmcmFtZXdvcmsgY29yZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjEyZmU0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy40LjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmRiOTFmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBTZXJ2ZXIgQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyYzhiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0OWU5Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YmY1ODIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBTZXJ2ZXIgQ29yZSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFNlcnZlciBDb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYjczNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmRiOTFmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBTZXJ2ZXIgQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyYzhiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gU2VydmVyIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZThlM2Y5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZmVhdHVyZXMKLXBsdWdpbnMKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmYyMmM2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDc2Y2U4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS53c3Quc2VydmVyX3VpLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZSwgZmVhdHVyZUBvcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZS5zb3VyY2UKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDhkNjguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgU2VydmVyIFBsdWctaW4gRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIHRoZSBXU1Qgc2VydmVyIHRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGJjODczLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ0NDU5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZV8wLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyNTZjZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2QyMTZmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YmIzOGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBTZXJ2ZXIgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XU1QgU2VydmVyIHRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0OTAyZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UudGVzdCIgdmVyc2lvbj0iMy4zLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwNmQ1ZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0Y2U0NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWI3MTBlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBTZXJ2ZXIgVXNlciBEb2N1bWVudGF0aW9uCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V1NUIHNlcnZlciB1c2VyIGRvY3VtZW50YXRpb24KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0NjhmZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmFiZmI0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjUwNTU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmVfMy4wLjAuamFyCi1zcmMuamFyCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlZjBiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSBwbHVnaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvZGVidWc9dHJ1ZQotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9wdWJsaXNoaW5nPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q1ZTE3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmU0MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIE5vdiAxMCAxNzoxMTozNSBIU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjA4NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotI1RodSBTZXAgMTMgMTU6MjU6MDYgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwqLnRlc3RzdWl0ZSwqLmRlcGxveSwqLmxvY2F0aW9uLCouZXhlY3V0aW9uLCouZGF0YXBvb2wsKi5hcnRpZmFjdCwqLmh0bWwsKi5zdmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTg0N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBGZWIgMjMgMjE6MTU6MzggRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhNjBlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1NhdCBBcHIgMjIgMTg6MzY6MTQgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MWJhOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KYXZhU2VydmVyUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNhNGM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDBiNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KYXZhIFNlcnZlciBTdXBwb3J0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotZXh0ZW5zaW9uUG9pbnRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzPVJ1bnRpbWUgQ2xhc3NwYXRoIFByb3ZpZGVycwotZXh0ZW5zaW9uUG9pbnRSdW50aW1lRmFjZXRNYXBwaW5nPVJ1bnRpbWUgRmFjZXQgTWFwcGluZ3MKLWV4dGVuc2lvblBvaW50U2VydmVyUHJvZmlsZXJzPVNlcnZlciBQcm9maWxlcnMKLQotcnVudGltZVR5cGVOYW1lPUoyRUUgUnVudGltZSBMaWJyYXJ5Ci1ydW50aW1lVHlwZURlc2NyaXB0aW9uPUEgcnVudGltZSB0aGF0IHJlcHJlc2VudHMgYSBzZXQgb2YgSjJFRSBydW50aW1lIGxpYnJhcmllcy4KLQotbW9kdWxlVHlwZUoyRUVXZWJOYW1lPUoyRUUgV2ViIG1vZHVsZQotbW9kdWxlVHlwZUoyRUVFSkJOYW1lPUoyRUUgRUpCIG1vZHVsZQotbW9kdWxlVHlwZUoyRUVSQVJOYW1lPUoyRUUgQ29ubmVjdG9yIG1vZHVsZQotbW9kdWxlVHlwZUoyRUVDbGllbnROYW1lPUoyRUUgQXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZQotbW9kdWxlVHlwZUoyRUVFQVJOYW1lPUoyRUUgRW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotbW9kdWxlVHlwZUoyRUVVdGlsaXR5TmFtZT1KMkVFIFV0aWxpdHkgamFyCi0KLWxhdW5jaGFibGVKbmRpPUpOREkgT2JqZWN0Ci1sYXVuY2hhYmxlSm5kaURlc2NyaXB0aW9uPVNpbGVudGx5IHN0YXJ0IGFuIG9iamVjdCBsb2NhdGFibGUgYnkgSk5ESS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2IxNzI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0icnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyIgc2NoZW1hPSJzY2hlbWEvcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9InJ1bnRpbWVGYWNldE1hcHBpbmdzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRSdW50aW1lRmFjZXRNYXBwaW5ncyIgc2NoZW1hPSJzY2hlbWEvcnVudGltZUZhY2V0TWFwcGluZ3MuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXJ2ZXJQcm9maWxlcnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlclByb2ZpbGVycyIgc2NoZW1hPSJzY2hlbWEvc2VydmVyUHJvZmlsZXJzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iaW50ZXJuYWxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzIiBuYW1lPSJpbnRlcm5hbFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnMiIHNjaGVtYT0ic2NoZW1hL2ludGVybmFsUnVudGltZUNvbXBvbmVudFByb3ZpZGVycy5leHNkIi8+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiPgotICAgIDxjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5jb250YWluZXIiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlVHlwZXMiPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFV2ViTmFtZSIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9ImpzdC5lamIiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFRUpCTmFtZSIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9ImpzdC5hcHBjbGllbnQiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFQ2xpZW50TmFtZSIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFUkFSTmFtZSIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9ImpzdC5lYXIiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFRUFSTmFtZSIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgIG5hbWU9IiVtb2R1bGVUeXBlSjJFRVV0aWxpdHlOYW1lIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXMiPgotICAgIDxydW50aW1lVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiCi0gICAgICAgbmFtZT0iJXJ1bnRpbWVUeXBlTmFtZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXJ1bnRpbWVUeXBlRGVzY3JpcHRpb24iCi0gICAgICAgZmFjZXRSdW50aW1lQ29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiCi0gICAgICAgZmFjZXRSdW50aW1lVmVyc2lvbj0iMS4wIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1J1bnRpbWUiPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LioiCi0gICAgICAgICB2ZXJzaW9ucz0iKiIvPgotICAgIDwvcnVudGltZVR5cGU+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzIj4KLSAgICA8cnVudGltZUNsYXNzcGF0aFByb3ZpZGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUYXJnZXQiCi0gICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5HZW5lcmljUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLSAgICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmNhY3R1cy5leHByZXNzaW9ucyIKLSAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXMuU2VydmxldFRlc3RDYXNlUHJvcGVydHlUZXN0ZXIiCi0gICAgICBwcm9wZXJ0aWVzPSJpc1NlcnZsZXRUZXN0Q2FzZSIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNhY3R1cy5leHByZXNzaW9uIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIj4KLSAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jYWN0dXMubW9kdWxlQXJ0aWZhY3RBZGFwdGVyIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXMuQ2FjdHVzTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUiCi0gICAgICBwcmlvcml0eT0iMTAiPgotICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICA8b3I+Ci0gICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCIvPgotICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQiLz4KLSAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSIvPgotICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIi8+Ci0gICAgICAgICA8L29yPgotICAgICAgPC9lbmFibGVtZW50PgotICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzIj4KLSAgICA8bGF1bmNoYWJsZUFkYXB0ZXIKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jYWN0dXMubGF1bmNoYWJsZUFkYXB0ZXIiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXMuQ2FjdHVzTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuY2xpZW50cyI+Ci0gICAgPGNsaWVudAotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuam5kaSIKLSAgICAgIG5hbWU9IiVsYXVuY2hhYmxlSm5kaSIKLSAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoYWJsZUpuZGlEZXNjcmlwdGlvbiIKLSAgICAgIHByaW9yaXR5PSItMTAwIgotICAgICAgbGF1bmNoYWJsZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkpuZGlMYXVuY2hhYmxlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KMkVFTGF1bmNoYWJsZUNsaWVudCIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLQotICAgIDxhZGFwdGVyPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIi8+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIkRmFjdG9yeSIvPgotICAgICAgPHR5cGUKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgICA8L2FkYXB0ZXI+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQsMi41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWpiIgotICAgICAgICAgdmVyc2lvbj0iMS4xLDIuMCwyLjEsMy4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQsNS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgdmVyc2lvbj0iMS4wLDEuNSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40LDUuMCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N1cHBvcnRlZD4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyI+Ci0gICAgPGRlZmF1bHQtZmFjZXRzPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiLz4KLSAgICAgIDxmYWNldCBpZD0id3N0LmpzZHQud2ViIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L2RlZmF1bHQtZmFjZXRzPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJzIj4KLSAgICA8cnVudGltZUNvbXBvbmVudFByb3ZpZGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkpSRVJ1bnRpbWVDb21wb25lbnRQcm92aWRlciIKLSAgICAgIHJ1bnRpbWVUeXBlSWRzPSIqIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KUkVSdW50aW1lQ29tcG9uZW50UHJvdmlkZXIiLz4KLSAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvaW50ZXJuYWxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvaW50ZXJuYWxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNDgxYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL2ludGVybmFsUnVudGltZUNvbXBvbmVudFByb3ZpZGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIiBpZD0icnVudGltZUNvbXBvbmVudFByb3ZpZGVycyIgbmFtZT0iUnVudGltZSBDb21wb25lbnQgUHJvdmlkZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBleHBlcmltZW50YWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBkb3duc3RyZWFtIGNvbXBvbmVudHMuCi1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgbmV3IHJ1bnRpbWUgY29tcG9uZW50cyB0byBhbiBleGlzdGluZyBmYWNldCBydW50aW1lLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lQ29tcG9uZW50UHJvdmlkZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lQ29tcG9uZW50UHJvdmlkZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZVR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBydW50aW1lIHR5cGUgaWRzIHRoYXQgdGhpcyBwcm92aWRlciBtYXkgc3VwcG9ydC4gVXNlZCBmb3IgbWVtb3J5ICZhbXA7IHBlcmZvcm1hbmNlIHJlYXNvbnMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuCi1SdW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS41LjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcnVudGltZSBjb21wb25lbnQgcHJvdmlkZXIgZXh0ZW5zaW9uIHBvaW50OgotCi0mbHQ7cHJlJmd0OwotICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lQ29tcG9uZW50UHJvdmlkZXJzJnF1b3Q7Jmd0OwotICAgICAmbHQ7cnVudGltZUNvbXBvbmVudFByb3ZpZGVyCi0gICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWVDb21wb25lbnRQcm92aWRlciZxdW90OwotICAgICAgICBydW50aW1lVHlwZUlkcz0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lLCBjb20uZXhhbXBsZTIuKiZxdW90OwotICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlUnVudGltZUNvbXBvbmVudFByb3ZpZGVyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2ImZ3Q7b3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlJmx0Oy9iJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGUwYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSIgaWQ9InJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiIG5hbWU9IlJ1bnRpbWUgQ2xhc3NwYXRoIFByb3ZpZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBuZXcgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIuIFJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVycyBwcm92aWRlIHRoZSBjbGFzc3BhdGggZm9yIEphdmEgc2VydmVyIHJ1bnRpbWVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZVR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBydW50aW1lIHR5cGUgaWRzIHRoYXQgdGhpcyBwcm92aWRlciBtYXkgc3VwcG9ydC4gVXNlZCBmb3IgbWVtb3J5ICZhbXA7IHBlcmZvcm1hbmNlIHJlYXNvbnMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuCi1SdW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyZxdW90OyZndDsKLSAgICAgJmx0O3J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcgotICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXImcXVvdDsKLSAgICAgICAgcnVudGltZVR5cGVJZHM9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZSwgY29tLmV4YW1wbGUyLiomcXVvdDsKLSAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtiJmd0O29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSZsdDsvYiZndDsgYW5kIGNvbnRhaW5zIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lRmFjZXRNYXBwaW5ncy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVGYWNldE1hcHBpbmdzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZDMzMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVGYWNldE1hcHBpbmdzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiIGlkPSJydW50aW1lRmFjZXRNYXBwaW5ncyIgbmFtZT0iUnVudGltZSBGYWNldCBNYXBwaW5ncyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIG1hcCBiZXR3ZWVuIGEgZmFjZXQgcnVudGltZSBjb21wb25lbnQgYW5kIGEgc2VydmVyIHJ1bnRpbWUgdHlwZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZUZhY2V0TWFwcGluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWVGYWNldE1hcHBpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZVR5cGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHJ1bnRpbWUgdHlwZSBpZAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWUtY29tcG9uZW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZmFjZXQgcnVudGltZSBjb21wb25lbnQgaWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZmFjZXQgcnVudGltZSBjb21wb25lbnQgdmVyc2lvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcnVudGltZSBmYWNldCBtYXBwaW5nIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUZhY2V0TWFwcGluZ3MmcXVvdDsmZ3Q7Ci0gICAgICZsdDtydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciZxdW90OwotICAgICAgICBydW50aW1lVHlwZUlkPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUuMzImcXVvdDsKLSAgICAgICAgcnVudGltZS1jb21wb25lbnQ9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciZxdW90OwotICAgICAgICB2ZXJzaW9uPSZxdW90OzMuMiZxdW90Oy8mZ3Q7Ci0gICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlclByb2ZpbGVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlclByb2ZpbGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDBiNDg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NjaGVtYS9zZXJ2ZXJQcm9maWxlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSIgaWQ9InNlcnZlclByb2ZpbGVycyIgbmFtZT0iU2VydmVyIFByb2ZpbGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBwcm9maWxpbmcgc2VydmVycy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VydmVyUHJvZmlsZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZXJ2ZXJQcm9maWxlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRlZCBuYW1lCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjbGFzcyB0aGF0IGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlNlcnZlclByb2ZpbGVyRGVsZWdhdGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQcm9maWxlckRlbGVnYXRlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuNQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzZXJ2ZXIgcHJvZmlsZXIgZXh0ZW5zaW9uIHBvaW50OgotCi0mbHQ7cHJlJmd0OwotICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJQcm9maWxlcnMmcXVvdDsmZ3Q7Ci0gICAgICZsdDtzZXJ2ZXJQcm9maWxlcgotICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5teVByb2ZpbGVyJnF1b3Q7Ci0gICAgICAgIG5hbWU9JnF1b3Q7TXkgUHJvZmlsZXImcXVvdDsKLSAgICAgICAgdm1BcmdzPSZxdW90Oy1YcGlBZ2VudCZxdW90Oy8mZ3Q7Ci0gICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9DbGFzc3BhdGhSdW50aW1lVGFyZ2V0SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9DbGFzc3BhdGhSdW50aW1lVGFyZ2V0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmJiMDE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGU7Ci0vKioKLSAqIEEgcnVudGltZSB0YXJnZXQgaGFuZGxlciB0aGF0IHN1cHBvcnRzIGNoYW5naW5nIHRoZSBjbGFzc3BhdGggb2YgdGhlCi0gKiBwcm9qZWN0IGJ5IGFkZGluZyBvbmUgb3IgbW9yZSBjbGFzc3BhdGggY29udGFpbmVycy4gUnVudGltZSBwcm92aWRlcnMKLSAqIGNhbiBleHRlbmQgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHRoZSBhYnN0cmFjdCBtZXRob2RzIHRvIHByb3ZpZGUKLSAqIHRoZSBjb3JyZWN0IGJ1aWxkIHBhdGggZm9yIHRoZWlyIHJ1bnRpbWUgdHlwZS4KLSAqIAotICogQGRlcHJlY2F0ZWQgU2hvdWxkIHVzZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUNsYXNzcGF0aFByb3ZpZGVycwotICogICAgZXh0ZW5zaW9uIHBvaW50IGluc3RlYWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzcGF0aFJ1bnRpbWVUYXJnZXRIYW5kbGVyIGV4dGVuZHMgUnVudGltZVRhcmdldEhhbmRsZXJEZWxlZ2F0ZSB7Ci0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIFJ1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGUjc2V0UnVudGltZVRhcmdldChJUHJvamVjdCwgSVJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVudGltZVRhcmdldChJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGRlcHJlY2F0ZWQgY29kZSIpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBSdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlI3JlbW92ZVJ1bnRpbWVUYXJnZXQoSVByb2plY3QsIElSdW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJ1bnRpbWVUYXJnZXQoSVByb2plY3QgcHJvamVjdCwgSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlicmFyeSBlbnRyaWVzIHRvIHRoZSBnaXZlbiBsaXN0IGZvciBldmVyeSBqYXIgZmlsZSBmb3VuZCBpbiB0aGUKLQkgKiBnaXZlbiBkaXJlY3RvcnkuIE9wdGlvbmFsbHkgc2VhcmNoIHN1YmRpcmVjdG9yaWVzIGFzIHdlbGwuCi0JICogCi0JICogQHBhcmFtIGxpc3QgYSBsaXN0Ci0JICogQHBhcmFtIGRpciBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBpbmNsdWRlU3ViZGlyZWN0b3JpZXMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaW5jbHVkZSBzdWJkaXJlY3RvcmllcywgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRMaWJyYXJ5RW50cmllcyhMaXN0IGxpc3QsIEZpbGUgZGlyLCBib29sZWFuIGluY2x1ZGVTdWJkaXJlY3RvcmllcykgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byB1c2UgZGVwcmVjYXRlZCBjb2RlIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBnaXZlbiBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyaWVzCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldERlbGVnYXRlQ2xhc3NwYXRoRW50cmllcyhJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGRlcHJlY2F0ZWQgY29kZSIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBlbnRyeSBpZHMgZm9yIHRoaXMgcnVudGltZSB0YXJnZXQgaGFuZGxlci4gVGhlc2UKLQkgKiBpZHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciBpZCB0byBjcmVhdGUgYSBuZXcgZnVsbHkKLQkgKiBxdWFsaWZpZWQgY2xhc3NwYXRoIGNvbnRhaW5lciBpZC4KLQkgKiA8cD4KLQkgKiBCeSBkZWZhdWx0LCB0aGVyZSBpcyBhIHNpbmdsZSBjbGFzc3BhdGggZW50cnkgZm9yIHRoZSBydW50aW1lLCB3aXRoIG5vCi0JICogZXh0cmEgaWQgKDxjb2RlPm5ldyBTdHJpbmdbMV08L2NvZGU+KS4gVG8gY3JlYXRlIG11bHRpcGxlIGlkcywganVzdAotCSAqIHJldHVybiBhIHN0cmluZyBhcnJheSBjb250YWluaW5nIHRoZSBpZHMuIEZvciBpbnN0YW5jZSwgdG8gaGF2ZSB0d28KLQkgKiBjbGFzc3BhdGggY29udGFpbmVycyB3aXRoIGlkcyAiaWQxIiBhbmQgImlkMiIsIHVzZQotCSAqIDxjb2RlPm5ldyBTdHJpbmdbXSB7ICJpZDEiLCAiaWQyIiB9PC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyeSBpZHMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoRW50cnlJZHMoKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0IHRoYXQgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgZm9yIHRoZSBnaXZlbiBydW50aW1lIGFuZCBpZCBiZSB1cGRhdGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gY2xhc3NwYXRoIGNvbnRhaW5lciBlbnRyaWVzLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEBwYXJhbSBlbnRyaWVzIGFuIGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyaWVzCi0JICovCi0JcHVibGljIHZvaWQgcmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShJUnVudGltZSBydW50aW1lLCBTdHJpbmcgaWQsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGRlcHJlY2F0ZWQgY29kZSIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgbGFiZWwgZm9yIHRoZSBnaXZlbiBydW50aW1lIGFuZCB0aGUgZ2l2ZW4KLQkgKiBjbGFzc3BhdGggY29udGFpbmVyIGlkIChyZXR1cm5lZCBmcm9tIGdldENsYXNzcGF0aEVudHJ5SWRzKCkpLiBUaGlzIG1ldGhvZAotCSAqIG11c3Qgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIHJlc29sdmUgdGhlIGNvbnRhaW5lciBsYWJlbCBmb3IKLQkgKiBAcGFyYW0gaWQgdGhlIGNsYXNzcGF0aCBlbnRyeSBpZAotCSAqIEByZXR1cm4gYSBjbGFzc3BhdGggY29udGFpbmVyIGxhYmVsCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDbGFzc3BhdGhDb250YWluZXJMYWJlbChJUnVudGltZSBydW50aW1lLCBTdHJpbmcgaWQpOwotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKiBAcGFyYW0gaWQgYSBjb250YWluZXIgaWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwoSVJ1bnRpbWUgcnVudGltZSwgU3RyaW5nIGlkKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyAoY3JlYXRlcyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yKSB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciB3aXRoCi0JICogdGhlIGdpdmVuIHJ1bnRpbWUgYW5kIHRoZSBnaXZlbiBjbGFzc3BhdGggY29udGFpbmVyIGlkIChyZXR1cm5lZCBmcm9tCi0JICogZ2V0Q2xhc3NwYXRoRW50cnlJZHMoKSkuIElmIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIGNhbm5vdCBiZSByZXNvbHZlZAotCSAqIChmb3IgaW5zdGFuY2UsIGlmIHRoZSBydW50aW1lIGRvZXMgbm90IGV4aXN0KSwgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgdGhlIHJ1bnRpbWUgdG8gcmVzb2x2ZSB0aGUgY29udGFpbmVyIGZvcgotCSAqIEBwYXJhbSBpZCB0aGUgY2xhc3NwYXRoIGVudHJ5IGlkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcyBmb3IgdGhlIGNvbnRhaW5lciwgb3IgbnVsbCBpZiB0aGUKLQkgKiAgIGNvbnRhaW5lciBjb3VsZCBub3QgYmUgcmVzb2x2ZWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUnVudGltZSBydW50aW1lLCBTdHJpbmcgaWQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9FSkJCZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0VKQkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2ZTg3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0VKQkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdERlbGVnYXRlOwotLyoqCi0gKiBBbiBFSkIgYmVhbi4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBwbGFubmVkZm9yIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRUpCQmVhbiBleHRlbmRzIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQl8xMSA9ICIxLjEiOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQl8yMCA9ICIyLjAiOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQl8yMSA9ICIyLjEiOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVKQl8zMCA9ICIzLjAiOwotCQotCXByaXZhdGUgU3RyaW5nIGpuZGlOYW1lOwotCXByaXZhdGUgU3RyaW5nIGludGVyZmFjZU5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGxvY2FsOwotCXByaXZhdGUgYm9vbGVhbiByZW1vdGU7Ci0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBFSkJCZWFuLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0aGF0IHRoZSBFSkIgaXMgY29udGFpbmVkIGluCi0JICogQHBhcmFtIGpuZGlOYW1lIHRoZSBKTkRJIG5hbWUgb2YgdGhlIEVKQgotCSAqIEBwYXJhbSByZW1vdGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEVKQiBoYXMgYSByZW1vdGUgaW50ZXJmYWNlLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHBhcmFtIGxvY2FsIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBFSkIgaGFzIGEgbG9jYWwgaW50ZXJmYWNlLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIEVKQkJlYW4oSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBqbmRpTmFtZSwgYm9vbGVhbiByZW1vdGUsIGJvb2xlYW4gbG9jYWwpIHsKLQkJc3VwZXIobW9kdWxlKTsKLQkJdGhpcy5qbmRpTmFtZSA9IGpuZGlOYW1lOwotCQl0aGlzLnJlbW90ZSA9IHJlbW90ZTsKLQkJdGhpcy5sb2NhbCA9IGxvY2FsOwotCQl0aGlzLnZlcnNpb24gPSAiMi4xIjsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IEVKQkJlYW4gd2l0aCBhIHNwZWNpZmljIHZlcnNpb24KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdGhhdCB0aGUgRUpCIGlzIGNvbnRhaW5lZCBpbgotCSAqIEBwYXJhbSBqbmRpTmFtZSB0aGUgSk5ESSBuYW1lIG9mIHRoZSBFSkIKLQkgKiBAcGFyYW0gcmVtb3RlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBFSkIgaGFzIGEgcmVtb3RlIGludGVyZmFjZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBwYXJhbSBsb2NhbCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgRUpCIGhhcyBhIGxvY2FsIGludGVyZmFjZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBsZXZlbCBvZiB0aGUgRUpCIHNwZWNpZmljYXRpb24gdGhhdCB0aGlzIEVKQiB1c2VzLiBVc2Ugb25lIG9mIHRoZSA8Y29kZT5FSkJfeHg8L2NvZGU+IGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgRUpCQmVhbn0KLQkgKi8KLQlwdWJsaWMgRUpCQmVhbihJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGpuZGlOYW1lLCBib29sZWFuIHJlbW90ZSwgYm9vbGVhbiBsb2NhbCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJc3VwZXIobW9kdWxlKTsKLQkJdGhpcy5qbmRpTmFtZSA9IGpuZGlOYW1lOwotCQl0aGlzLnJlbW90ZSA9IHJlbW90ZTsKLQkJdGhpcy5sb2NhbCA9IGxvY2FsOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgRUpCQmVhbiB3aXRoIGl0cyBpbnRlcmZhY2UgbmFtZS4gVGhpcyBBUEkgaXMgaW50ZW5kZWQgdG8gYmUgdXNlIGJ5IEVKQiAzLjAuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRoYXQgdGhlIEVKQiBpcyBjb250YWluZWQgaW4KLQkgKiBAcGFyYW0gam5kaU5hbWUgdGhlIEpOREkgbmFtZSBvZiB0aGUgRUpCCi0JICogQHBhcmFtIHJlbW90ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgRUpCIGhhcyBhIHJlbW90ZSBpbnRlcmZhY2UsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAcGFyYW0gbG9jYWwgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEVKQiBoYXMgYSBsb2NhbCBpbnRlcmZhY2UsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UgICAgCi0JICogQHBhcmFtIHZlcnNpb24gdGhlIGxldmVsIG9mIHRoZSBFSkIgc3BlY2lmaWNhdGlvbiB0aGF0IHRoaXMgRUpCIHVzZXMuIFVzZSBvbmUgb2YgdGhlIDxjb2RlPkVKQl94eDwvY29kZT4gY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBFSkJCZWFufQotCSAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lIHRoZSBpbnRlcmZhY2UgbmFtZSBvZiB0aGUgRUpCCi0JICovCi0KLQlwdWJsaWMgRUpCQmVhbihJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGpuZGlOYW1lLCBib29sZWFuIHJlbW90ZSwgYm9vbGVhbiBsb2NhbCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7Ci0JCXN1cGVyKG1vZHVsZSk7Ci0JCXRoaXMuam5kaU5hbWUgPSBqbmRpTmFtZTsKLQkJdGhpcy5yZW1vdGUgPSByZW1vdGU7Ci0JCXRoaXMubG9jYWwgPSBsb2NhbDsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5pbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZW1wdHkgRUpCQmVhbi4KLQkgKi8KLQlwdWJsaWMgRUpCQmVhbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKTkRJIG5hbWUgb2YgdGhlIEVKQi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBKTkRJIG5hbWUgb2YgdGhlIEVKQgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sm5kaU5hbWUoKSB7Ci0JCXJldHVybiBqbmRpTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEVKQiBoYXMgYSByZW1vdGUgaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEVKQiBoYXMgYSByZW1vdGUgaW50ZXJmYWNlLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUmVtb3RlSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gcmVtb3RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgRUpCIGhhcyBhIGxvY2FsIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBFSkIgaGFzIGEgbG9jYWwgaW50ZXJmYWNlLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTG9jYWxJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBsb2NhbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGV2ZWwgb2YgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIEVKQgotCSAqCi0JICogQHJldHVybiB0aGUgbGV2ZWwgb2YgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIEVKQgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgZWpiTmFtZTsKLQkJLy8gRUpCIDIuMCBkb24ndCBoYXZlIGFuIGludGVmYWNlIG5hbWUsIGJ1dCB0aGV5IHNldCB0aGUgam5kaSBuYW1lCi0JCWlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgIShpbnRlcmZhY2VOYW1lLmxlbmd0aCgpPD0wKSl7Ci0JCQllamJOYW1lID0gaW50ZXJmYWNlTmFtZTsKLQkJfQotCQllbHNlewotCQkJZWpiTmFtZSA9IGpuZGlOYW1lOwotCQl9Ci0JCXJldHVybiBOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdEVKQiwgZWpiTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZGVzZXJpYWxpemUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKFN0cmluZyBzKSB7Ci0JCWludCBpbmQgPSBzLmluZGV4T2YoIi8vIik7Ci0JCXN1cGVyLmRlc2VyaWFsaXplKHMuc3Vic3RyaW5nKDAsIGluZCkpOwotCQlpZiAoJ1QnID09IHMuY2hhckF0KGluZCsyKSkKLQkJCWxvY2FsID0gdHJ1ZTsKLQkJZWxzZQotCQkJbG9jYWwgPSBmYWxzZTsKLQkJaWYgKCdUJyA9PSBzLmNoYXJBdChpbmQrMykpCi0JCQlyZW1vdGUgPSB0cnVlOwotCQllbHNlCi0JCQlyZW1vdGUgPSBmYWxzZTsKLQkJam5kaU5hbWUgPSBzLnN1YnN0cmluZyhpbmQrNCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjc2VyaWFsaXplKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHNlcmlhbGl6ZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5zZXJpYWxpemUoKSk7Ci0JCXNiLmFwcGVuZCgiLy8iKTsKLQkJaWYgKGxvY2FsKQotCQkJc2IuYXBwZW5kKCJUIik7Ci0JCWVsc2UKLQkJCXNiLmFwcGVuZCgiRiIpOwotCQlpZiAocmVtb3RlKQotCQkJc2IuYXBwZW5kKCJUIik7Ci0JCWVsc2UKLQkJCXNiLmFwcGVuZCgiRiIpOwotCQlzYi5hcHBlbmQoam5kaU5hbWUpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lIG9mIGludGVyZmFjZSByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdCAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKCkgewotCQlyZXR1cm4gaW50ZXJmYWNlTmFtZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9GYWNldFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvRmFjZXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWRjNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9GYWNldFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gZmFjZXQgcnVudGltZXMgYW5kIHNlcnZlciBydW50aW1lcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBzdGF0aWMgbWVtYmVycy4KLSAqIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9yIGluc3RhbnRpYXRlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0VXRpbCB7Ci0JLyoqCi0JICogU3RhdGljIHV0aWxpdHkgY2xhc3MgLSBjYW5ub3QgY3JlYXRlIGFuIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRmFjZXRVdGlsKCkgewotCQkvLyBjYW4ndCBjcmVhdGUKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgcnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZmFjZXQgcnVudGltZSwgb3IgbnVsbAotCSAqIGlmIG5vbmUgY291bGQgYmUgZm91bmQuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBmYWNldCBydW50aW1lCi0JICogQHJldHVybiB0aGUgc2VydmVyIHJ1bnRpbWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZmFjZXQgcnVudGltZSwgb3IKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNvdWxkIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgZ2V0UnVudGltZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIHJ1bnRpbWUpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5mYWNldHMuRmFjZXRVdGlsLmdldFJ1bnRpbWUocnVudGltZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjZXQgcnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc2VydmVyIHJ1bnRpbWUsIG9yIG51bGwKLQkgKiBpZiBub25lIGNvdWxkIGJlIGZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIGEgc2VydmVyIHJ1bnRpbWUKLQkgKiBAcmV0dXJuIHRoZSBmYWNldCBydW50aW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHNlcnZlciBydW50aW1lLCBvcgotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgY291bGQgYmUgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIGdldFJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLmZhY2V0cy5GYWNldFV0aWwuZ2V0UnVudGltZShydW50aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHRoZSBmYWNldHMgb24gYSBwcm9qZWN0IGFyZSBzdXBwb3J0ZWQgYnkgYSBnaXZlbiBzZXJ2ZXIuIFJldHVybnMKLQkgKiBhbiBPSyBzdGF0dXMgaWYgdGhlIHNlcnZlcidzIHJ1bnRpbWUgc3VwcG9ydHMgdGhlIHByb2plY3QncyBmYWNldHMsIGFuZCBhbgotCSAqIEVSUk9SIHN0YXR1cyAod2l0aCBtZXNzYWdlKSBpZiBpdCBkb2Vzbid0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIE9LIHN0YXR1cyBpZiB0aGUgc2VydmVyJ3MgcnVudGltZSBzdXBwb3J0cyB0aGUgcHJvamVjdCdzIGZhY2V0cywgYW5kIGFuCi0JICogICAgRVJST1Igc3RhdHVzICh3aXRoIG1lc3NhZ2UpIGlmIGl0IGRvZXNuJ3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgdmVyaWZ5RmFjZXRzKElQcm9qZWN0IHByb2plY3QsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzLkZhY2V0VXRpbC52ZXJpZnlGYWNldHMocHJvamVjdCwgc2VydmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JQXBwbGljYXRpb25DbGllbnRNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUFwcGxpY2F0aW9uQ2xpZW50TW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTcwZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JQXBwbGljYXRpb25DbGllbnRNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0vKioKLSAqIEEgSjJFRSBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFwcGxpY2F0aW9uQ2xpZW50TW9kdWxlIGV4dGVuZHMgSUoyRUVNb2R1bGUgewotCS8vIGludGVudGlvbmFsbHkgZW1wdHkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lDb25uZWN0b3JNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUNvbm5lY3Rvck1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODM2NzI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUNvbm5lY3Rvck1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLS8qKgotICogQSBKMkVFIGNvbm5lY3RvciBtb2R1bGUuCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29ubmVjdG9yTW9kdWxlIGV4dGVuZHMgSUoyRUVNb2R1bGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBhcyBhbiBhcnJheSBvZiBhYnNvbHV0ZSBJUGF0aHMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcwotCSAqLwotCXB1YmxpYyBJUGF0aFtdIGdldENsYXNzcGF0aCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUVKQk1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JRUpCTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MTA2NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JRUpCTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgSjJFRSBFSkIgbW9kdWxlLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVKQk1vZHVsZSBleHRlbmRzIElKMkVFTW9kdWxlIHsKLQkvLyBpbnRlbnRpb25hbGx5IGVtcHR5Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JRW50ZXJwcmlzZUFwcGxpY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lFbnRlcnByaXNlQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VhMWQ3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lFbnRlcnByaXNlQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgSjJFRSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIChFQVIgZmlsZSkuCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRW50ZXJwcmlzZUFwcGxpY2F0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBFQVIuIFRoZSByZXR1cm5lZCBtb2R1bGVzIHdpbGwKLQkgKiBlaXRoZXIgYmUgSjJFRSBtb2R1bGVzICh3aGljaCB3aWxsIGJlIGFkYXB0YWJsZSB0byBJSjJFRU1vZHVsZSkgb3IKLQkgKiB1dGlsaXR5IGphcnMgY29udGFpbmVkIGluIHRoZSBFQVIuCi0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIG1vZHVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkkgb2YgdGhlIGdpdmVuIG1vZHVsZSB3aXRoaW4gdGhpcyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUgd2l0aGluIHRoaXMgYXBwbGljYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBVUkkgb2YgdGhlIGdpdmVuIG1vZHVsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIFVSSSBjb3VsZAotCSAqICAgIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKElNb2R1bGUgbW9kdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVycyBmb3IgdGhlIHJlc291cmNlcyBpbiB0aGlzIG1vZHVsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcmVzb3VyY2UgZm9sZGVycwotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0UmVzb3VyY2VGb2xkZXJzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JSjJFRU1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JSjJFRU1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGQ5NzRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUoyRUVNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotLyoqCi0gKiBBIEoyRUUgbW9kdWxlIHRoYXQgY2FuIGJlIGRlcGxveWVkIHRvIGEgc2VydmVyLgotICogCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSjJFRU1vZHVsZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXJzIGZvciB0aGUgcmVzb3VyY2VzIGluIHRoaXMgbW9kdWxlLiBSZXR1cm5zIGFuIGVtcHR5Ci0JICogYXJyYXkgaWYgdGhpcyBpcyBhIGJpbmFyeSBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJlc291cmNlIGZvbGRlcnMKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lcltdIGdldFJlc291cmNlRm9sZGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXJzIGNvbnRhaW5pbmcgSmF2YSBvdXRwdXQgaW4gdGhpcyBtb2R1bGUuIFJldHVybnMgYW4KLQkgKiBlbXB0eSBhcnJheSBpZiB0aGlzIGlzIGEgYmluYXJ5IG1vZHVsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgSmF2YSBvdXRwdXQgZm9sZGVycwotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0SmF2YU91dHB1dEZvbGRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgYmluYXJ5ICh6aXBwZWQpIG1vZHVsZSwgYW5kCi0JICogZmFsc2UgaWYgaXQgaXMgZXhwYW5kZWQuCi0JICogCi0JICogPHA+SWYgdHJ1ZSwgbWVtYmVycygpIHNob3VsZCByZXR1cm4gb25seSBhIHNpbmdsZSBlbGVtZW50IC0KLQkgKiB0aGUgYmluYXJ5IChqYXIgb3IgemlwIGZpbGUpIHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mCi0JICogdGhpcyBtb2R1bGUuIChhIHNpbmdsZSBJTW9kdWxlUmVzb3VyY2UsIGUuZy4KLQkgKiBteWVqYi5qYXIpIEFsc28sIGdldExvY2F0aW9uKCkgc2hvdWxkIHJldHVybiB0aGUgZnVsbCBwYXRoCi0JICogdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgYmluYXJ5IGl0c2VsZi4gKGUuZy4KLQkgKiBjOlx0ZW1wXG15ZWpiLmphcik8L3A+Ci0JICogCi0JICogPHA+SWYgZmFsc2UsIG1lbWJlcnMoKSBzaG91bGQgcmV0dXJuIHRoZSBlbnRpcmUgY29udGVudHMKLQkgKiBvZiB0aGUgbW9kdWxlLCBzdGFydGluZyBhdCB0aGUgcm9vdC4gVGhlcmUgc2hvdWxkIGJlIG5vCi0JICogcHJlY2VlZGluZyBkaXJlY3Rvcnkgc3RydWN0dXJlLiAoYW4gYXJyYXkgb2YKLQkgKiBJTW9kdWxlUmVzb3VyY2VzLCBlLmcuIGluZGV4Lmh0bWwsIFdFQi1JTkYvd2ViLnhtbCwKLQkgKiAuLi4pIEluIHRoaXMgY2FzZSwgZ2V0TG9jYXRpb24oKSBzaG91bGQgcmV0dXJuIHRoZSBwYXRoIHRvCi0JICogdGhlIHJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgdGhlc2UgcmVzb3VyY2VzLjwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUphdmFSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lKYXZhUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTUxNjkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUphdmFSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIGEgc2VydmVyIHRoYXQgY29udGFpbnMgYSBKYXZhIHJ1bnRpbWUuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhUnVudGltZSB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBWTSBpbnN0YWxsIChpbnN0YWxsZWQgSlJFKSB0aGF0IHRoaXMgcnVudGltZSBpcyB1c2luZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IFZNIGluc3RhbGwKLQkgKi8KLQlwdWJsaWMgSVZNSW5zdGFsbCBnZXRWTUluc3RhbGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJ1bnRpbWUgaXMgdXNpbmcgdGhlIGRlZmF1bHQgSlJFLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJ1bnRpbWUgaXMgdXNpbmcgdGhlIGRlZmF1bHQgSlJFLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNpbmdEZWZhdWx0SlJFKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JSmF2YVJ1bnRpbWVXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JSmF2YVJ1bnRpbWVXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmM2MjdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUphdmFSdW50aW1lV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYSBzZXJ2ZXIgdGhhdCBjb250YWlucyBhIEphdmEgcnVudGltZS4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFSdW50aW1lV29ya2luZ0NvcHkgZXh0ZW5kcyBJSmF2YVJ1bnRpbWUgewotCS8qKgotCSAqIFNldCB0aGUgVk0gaW5zdGFsbCAoaW5zdGFsbGVkIEpSRSkgdGhhdCB0aGlzIHJ1bnRpbWUgaXMgdXNpbmcuCi0JICogVXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgRWNsaXBzZSBkZWZhdWx0IEpSRS4KLQkgKiAKLQkgKiBAcGFyYW0gdm1JbnN0YWxsIHRoZSBWTSBpbnN0YWxsIHRvIHVzZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZNSW5zdGFsbChJVk1JbnN0YWxsIHZtSW5zdGFsbCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JVXRpbGl0eU1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JVXRpbGl0eU1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDEzZjY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSVV0aWxpdHlNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotLyoqCi0gKiBBIEoyRUUgdXRpbGl0eSBtb2R1bGUgdGhhdCBjYW4gYmUgZGVwbG95ZWQgdG8gYSBzZXJ2ZXIuCi0gKiAKLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBwbGFubmVkZm9yIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVdGlsaXR5TW9kdWxlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGZvbGRlcnMgZm9yIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJlc291cmNlIGZvbGRlcnMKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lcltdIGdldFJlc291cmNlRm9sZGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXJzIGNvbnRhaW5pbmcgSmF2YSBvdXRwdXQgaW4gdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIEphdmEgb3V0cHV0IGZvbGRlcnMKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lcltdIGdldEphdmFPdXRwdXRGb2xkZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIGJpbmFyeSAoemlwcGVkKSBtb2R1bGUsIGFuZAotCSAqIGZhbHNlIGlmIGl0IGlzIGV4cGFuZGVkLgotCSAqIAotCSAqIDxwPklmIHRydWUsIG1lbWJlcnMoKSBzaG91bGQgcmV0dXJuIG9ubHkgYSBzaW5nbGUgZWxlbWVudCAtCi0JICogdGhlIGJpbmFyeSAoamFyIG9yIHppcCBmaWxlKSB0aGF0IGNvbnRhaW5zIHRoZSBjb250ZW50cyBvZgotCSAqIHRoaXMgbW9kdWxlLiAoYSBzaW5nbGUgSU1vZHVsZVJlc291cmNlLCBlLmcuCi0JICogbXllamIuamFyKSBBbHNvLCBnZXRMb2NhdGlvbigpIHNob3VsZCByZXR1cm4gdGhlIGZ1bGwgcGF0aAotCSAqIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGJpbmFyeSBpdHNlbGYuIChlLmcuCi0JICogYzpcdGVtcFxteWVqYi5qYXIpPC9wPgotCSAqIAotCSAqIDxwPklmIGZhbHNlLCBtZW1iZXJzKCkgc2hvdWxkIHJldHVybiB0aGUgZW50aXJlIGNvbnRlbnRzCi0JICogb2YgdGhlIG1vZHVsZSwgc3RhcnRpbmcgYXQgdGhlIHJvb3QuIFRoZXJlIHNob3VsZCBiZSBubwotCSAqIHByZWNlZWRpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZS4gKGFuIGFycmF5IG9mCi0JICogSU1vZHVsZVJlc291cmNlcywgZS5nLiBpbmRleC5odG1sLCBXRUItSU5GL3dlYi54bWwsCi0JICogLi4uKSBJbiB0aGlzIGNhc2UsIGdldExvY2F0aW9uKCkgc2hvdWxkIHJldHVybiB0aGUgcGF0aCB0bwotCSAqIHRoZSByb290IGZvbGRlciBjb250YWluaW5nIHRoZXNlIHJlc291cmNlcy48L3A+Ci0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCaW5hcnkoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lXZWJNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSVdlYk1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjIyMDYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSVdlYk1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBBIEoyRUUgd2ViIG1vZHVsZS4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBwbGFubmVkZm9yIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJNb2R1bGUgZXh0ZW5kcyBJSjJFRU1vZHVsZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGV4dCByb290IG9mIHRoZSBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZXh0Um9vdCgpOwotCQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZXh0IHJvb3Qgb2YgdGhlIG1vZHVsZS4gSWYgdGhlIHRoZSB3ZWJNb2R1bGUgYmVsb25ncyB0byBhbiBlYXJNb2R1bGUsIHRoZSBjb250ZXh0IHJvb3Qgd2l0aCBoaWdoZXIKLQkgKiBwcmVzZWRlbmNlIHdpbGwgYmUgcmV0dXJuZWQuICAgCi0JICogCi0JICogQHBhcmFtIGVhck1vZHVsZSBUaGUgRUFSTW9kdWxlIGlmIGV4aXN0LCBpZiBub3QgbnVsbAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFJvb3QoSU1vZHVsZSBlYXJNb2R1bGUpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHV0aWxpdHkgbW9kdWxlcyBjb250YWluZWQgd2l0aGluIHRoaXMgV0FSLgotCSAqCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIG1vZHVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkkgb2YgdGhlIGdpdmVuIGNvbnRhaW5lZCBtb2R1bGUuCi0JICoKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHJldHVybiB0aGUgVVJJIG9mIHRoZSBnaXZlbiBtb2R1bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBVUkkgY291bGQKLQkgKiAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSSShJTW9kdWxlIG1vZHVsZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9KbmRpTGF1bmNoYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9KbmRpTGF1bmNoYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjUzMDRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSm5kaUxhdW5jaGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLS8qKgotICogQSByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QgaW4gSk5ESSB0aGF0IGNhbiBiZSB0ZXN0ZWQgb24gYSBzZXJ2ZXIuCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAzLjAKLSAqLwotcHVibGljIGNsYXNzIEpuZGlMYXVuY2hhYmxlIHsKLQlwcml2YXRlIFByb3BlcnRpZXMgcHJvcHM7Ci0JcHJpdmF0ZSBTdHJpbmcgam5kaU5hbWU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IHRoYXQgaXMgbGF1bmNoYWJsZSB2aWEgSk5ESS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcHMgdGhlIEpOREkgcHJvcGVydGllcyByZXF1aXJlZCB0byBjb25uZWN0IHRvIHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gam5kaU5hbWUgdGhlIEpOREkgbmFtZSBvZiB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIEpuZGlMYXVuY2hhYmxlKFByb3BlcnRpZXMgcHJvcHMsIFN0cmluZyBqbmRpTmFtZSkgewotCQl0aGlzLmpuZGlOYW1lID0gam5kaU5hbWU7Ci0JCXRoaXMucHJvcHMgPSBwcm9wczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKTkRJIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gY29ubmVjdCB0byB0aGUgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIEpOREkgcHJvcGVydGllcyByZXF1aXJlZCB0byBjb25uZWN0IHRvIHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSk5ESSBuYW1lIG9mIHRoZSBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgSk5ESSBuYW1lIG9mIHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lKCkgewotCQlyZXR1cm4gam5kaU5hbWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSm5kaU9iamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9KbmRpT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMmU5MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9KbmRpT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdERlbGVnYXRlOwotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCBpbiBKTkRJIHRoYXQgY2FuIGJlIHRlc3RlZCBvbiBhIHNlcnZlci4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBwbGFubmVkZm9yIDMuMAotICovCi1wdWJsaWMgY2xhc3MgSm5kaU9iamVjdCBleHRlbmRzIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgewotCXByaXZhdGUgU3RyaW5nIGpuZGlOYW1lOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBpbiBKTkRJLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0aGF0IHRoZSBvYmplY3QgaXMgY29udGFpbmVkIGluCi0JICogQHBhcmFtIGpuZGlOYW1lIHRoZSBKTkRJIG5hbWUgb2YgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyBKbmRpT2JqZWN0KElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgam5kaU5hbWUpIHsKLQkJc3VwZXIobW9kdWxlKTsKLQkJdGhpcy5qbmRpTmFtZSA9IGpuZGlOYW1lOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBlbXB0eSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IGluIEpOREkuCi0JICovCi0JcHVibGljIEpuZGlPYmplY3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKTkRJIG5hbWUgb2YgdGhlIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBKTkRJIG5hbWUgb2YgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sm5kaU5hbWUoKSB7Ci0JCXJldHVybiBqbmRpTmFtZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdEpOREksIGpuZGlOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSNkZXNlcmlhbGl6ZShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZGVzZXJpYWxpemUoU3RyaW5nIHMpIHsKLQkJaW50IGluZCA9IHMuaW5kZXhPZigiLy8iKTsKLQkJc3VwZXIuZGVzZXJpYWxpemUocy5zdWJzdHJpbmcoMCwgaW5kKSk7Ci0JCWpuZGlOYW1lID0gcy5zdWJzdHJpbmcoaW5kKzIpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI3NlcmlhbGl6ZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBzZXJpYWxpemUoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIuc2VyaWFsaXplKCkpOwotCQlzYi5hcHBlbmQoIi8vIik7Ci0JCXNiLmFwcGVuZChqbmRpTmFtZSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1B1Ymxpc2hVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1B1Ymxpc2hVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGExNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9QdWJsaXNoVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLkphdmFTZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2VEZWx0YTsKLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIGFuIGFzc29ydG1lbnQgb2YgdXNlZnVsIGZpbGUgbWV0aG9kcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBzdGF0aWMgbWVtYmVycy4KLSAqIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9yIGluc3RhbnRpYXRlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IEFkb3B0ZXJzIHNob3VsZCB1c2UgdGhlIGVxdWl2YWxlbnQgY2xhc3MgaW4KLSAqIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsIGluc3RlYWQuIFRoaXMgY2xhc3Mgd2lsbCBldmVudHVhbGx5Ci0gKiBiZSBkZXByZWNhdGVkLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHVibGlzaFV0aWwgewotCS8vIHNpemUgb2YgdGhlIGJ1ZmZlcgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVIgPSA2NTUzNjsKLQotCS8vIHRoZSBidWZmZXIKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYnVmID0gbmV3IGJ5dGVbQlVGRkVSXTsKLQotCS8qKgotCSAqIFB1Ymxpc2hVdGlsIGNhbm5vdCBiZSBjcmVhdGVkLiBVc2Ugc3RhdGljIG1ldGhvZHMuCi0JICovCi0JcHJpdmF0ZSBQdWJsaXNoVXRpbCgpIHsKLQkJLy8gY2FuJ3QgY3JlYXRlCi0JfQotCi0JLyoqCi0JICogQ29weSBhIGZpbGUgZnJvbSBhIHRvIGIuIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtIGFmdGVyIHVzZS4KLQkgKgotCSAqIEBwYXJhbSBpbiBqYXZhLmlvLklucHV0U3RyZWFtCi0JICogQHBhcmFtIHRvIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZGVwcmVjYXRlZCBVbnVzZWQgLSB3aWxsIGJlIHJlbW92ZWQuCi0JICogQHJldHVybiBhIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjb3B5RmlsZShJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIHRvKSB7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQkKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRvKTsKLQkJCQotCQkJaW50IGF2YWlsID0gaW4ucmVhZChidWYpOwotCQkJd2hpbGUgKGF2YWlsID4gMCkgewotCQkJCW91dC53cml0ZShidWYsIDAsIGF2YWlsKTsKLQkJCQlhdmFpbCA9IGluLnJlYWQoYnVmKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY29weWluZyBmaWxlIiwgZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3B5aW5nRmlsZSwgbmV3IFN0cmluZ1tdIHt0bywgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNtYXJ0IGNvcHkgdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIG9ubHkgcmV0dXJucyBhIHNpbmdsZSBlcnJvciBpbiB0aGUgY2FzZSBvZiBmYWlsdXJlLiBVc2UgcHVibGlzaFNtYXJ0KCkgaW5zdGVhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc21hcnRDb3B5KElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXNbXSBzdGF0dXMgPSBQdWJsaXNoVXRpbC5wdWJsaXNoU21hcnQocmVzb3VyY2VzLCBwYXRoLCBtb25pdG9yKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5sZW5ndGggPiAwKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgYSBkZWx0YSBwdWJsaXNoLgotCSAqIAotCSAqIEBwYXJhbSBraW5kCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBvbmx5IHJldHVybnMgYSBzaW5nbGUgZXJyb3IgaW4gdGhlIGNhc2Ugb2YgZmFpbHVyZS4gVXNlIHB1Ymxpc2hEZWx0YSgpIGluc3RlYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZURlbHRhKGludCBraW5kLCBJUGF0aCBwYXRoLCBJTW9kdWxlUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RhdHVzW10gc3RhdHVzID0gUHVibGlzaFV0aWwucHVibGlzaERlbHRhKGRlbHRhLCBwYXRoLCBudWxsKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5sZW5ndGggPiAwKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBmaWxlCi0JICogQGRlcHJlY2F0ZWQgZG9lcyBub3QgZmFpbCBvciByZXR1cm4gc3RhdHVzIGlmIGRlbGV0ZSBkb2Vzbid0IHdvcmsKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGVsZXRlRmlsZShJUGF0aCBwYXRoLCBJTW9kdWxlRmlsZSBmaWxlKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBVQkxJU0hJTkcsICJEZWxldGluZzogIiArIGZpbGUuZ2V0TmFtZSgpICsgIiBmcm9tICIgKyBwYXRoLnRvU3RyaW5nKCkpOwotCQlJUGF0aCBwYXRoMiA9IHBhdGguYXBwZW5kKGZpbGUuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpLmFwcGVuZChmaWxlLmdldE5hbWUoKSk7Ci0JCXBhdGgyLnRvRmlsZSgpLmRlbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIG9ubHkgcmV0dXJucyBhIHNpbmdsZSBlcnJvciBpbiB0aGUgY2FzZSBvZiBmYWlsdXJlLiBVc2UgcHVibGlzaEZ1bGwoKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHkoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXNbXSBzdGF0dXMgPSBQdWJsaXNoVXRpbC5wdWJsaXNoRnVsbChyZXNvdXJjZXMsIHBhdGgsIG51bGwpOwotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmxlbmd0aCA+IDApCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXNbMF0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgemlwIGZpbGUgY29udGFpbmluZyB0aGUgZ2l2ZW4gbW9kdWxlIHJlc291cmNlcy4gRGVsZXRlcyB0aGUgZXhpc3RpbmcgZmlsZQotCSAqIChhbmQgZG9lc24ndCBjcmVhdGUgYSBuZXcgb25lKSBpZiByZXNvdXJjZXMgaXMgbnVsbCBvciBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogQHBhcmFtIHppcFBhdGgKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlWmlwRmlsZShJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIHppcFBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0YXR1c1tdIHN0YXR1cyA9IFB1Ymxpc2hVdGlsLnB1Ymxpc2haaXAocmVzb3VyY2VzLCB6aXBQYXRoLCBudWxsKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5sZW5ndGggPiAwKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byByZWN1cnNpdmVseSBkZWxldGUgYSBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gZGlyIGEgZGlyZWN0b3J5Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaFV0aWwuZGVsZXRlRGlyZWN0b3J5KGRpciwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogU21hcnQgY29weSB0aGUgZ2l2ZW4gbW9kdWxlIHJlc291cmNlcyB0byB0aGUgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzIGFuIGFycmF5IG9mIG1vZHVsZSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gcGF0aCBhbiBleHRlcm5hbCBwYXRoIHRvIGNvcHkgdG8KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cyAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoU21hcnQoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hVdGlsLnB1Ymxpc2hTbWFydChyZXNvdXJjZXMsIHBhdGgsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhIGRlbHRhIHB1Ymxpc2guCi0JICogCi0JICogQHBhcmFtIGRlbHRhIGEgbW9kdWxlIHJlc291cmNlIGRlbHRhCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gcHVibGlzaCB0bwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzW10gcHVibGlzaERlbHRhKElNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaFV0aWwucHVibGlzaERlbHRhKGRlbHRhLCBwYXRoLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgYSBkZWx0YSBwdWJsaXNoLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YSBhIG1vZHVsZSByZXNvdXJjZSBkZWx0YQotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHB1Ymxpc2ggdG8KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1c1tdIHB1Ymxpc2hEZWx0YShJTW9kdWxlUmVzb3VyY2VEZWx0YSBkZWx0YSwgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoVXRpbC5wdWJsaXNoRGVsdGEoZGVsdGEsIHBhdGgsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2ggdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGggYSBwYXRoIHRvIHB1Ymxpc2ggdG8KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1c1tdIHB1Ymxpc2hGdWxsKElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoVXRpbC5wdWJsaXNoRnVsbChyZXNvdXJjZXMsIHBhdGgsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgemlwIGZpbGUgY29udGFpbmluZyB0aGUgZ2l2ZW4gbW9kdWxlIHJlc291cmNlcy4gRGVsZXRlcyB0aGUgZXhpc3RpbmcgZmlsZQotCSAqIChhbmQgZG9lc24ndCBjcmVhdGUgYSBuZXcgb25lKSBpZiByZXNvdXJjZXMgaXMgbnVsbCBvciBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzIGFuIGFycmF5IG9mIG1vZHVsZSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB3aGVyZSB0aGUgemlwIGZpbGUgc2hvdWxkIGJlIGNyZWF0ZWQgCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoWmlwKElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoVXRpbC5wdWJsaXNoWmlwKHJlc291cmNlcywgcGF0aCwgbW9uaXRvcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZlYTJjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBY2Nlc3NSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSmF2YVNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlhNTE1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotLyoqCi0gKiBBIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIHByb3ZpZGVzIHRoZSBjbGFzc3BhdGggZm9yIGEgSmF2YSBzZXJ2ZXIgcnVudGltZS4KLSAqIFRoaXMgcHJvdmlkZXIgaXMgc2NvcGVkIGJ5IHJ1bnRpbWUgdHlwZSBhbmQgbWF5IHByb3ZpZGUgdGhlIGNsYXNzcGF0aCBmb3IgbXVsdGlwbGUKLSAqIHJ1bnRpbWUgaW5zdGFuY2VzLgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBwbGFubmVkZm9yIDMuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUgewotCXByb3RlY3RlZCBjbGFzcyBTb3VyY2VBdHRhY2htZW50VXBkYXRlIHsKLQkJU3RyaW5nIHJ1bnRpbWVJZDsKLQkJSVBhdGggZW50cnk7Ci0JCUlQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoOwotCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGg7Ci0JCUlDbGFzc3BhdGhBdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzOwotCX0KLQotCXByaXZhdGUgTGlzdDxTb3VyY2VBdHRhY2htZW50VXBkYXRlPiBzb3VyY2VBdHRhY2htZW50czsKLQotCXByaXZhdGUgU3RyaW5nIGV4dGVuc2lvbklkOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJUGF0aD4gcnVudGltZVBhdGhNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQYXRoPigpOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJQ2xhc3NwYXRoRW50cnlbXT4gcHJldmlvdXNDbGFzc3BhdGggPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElDbGFzc3BhdGhFbnRyeVtdPigpOwotCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlKCkgewotCQkvLyBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBjbGFzc3BhdGggcHJvdmlkZXIgd2l0aCBpdHMgbGlmZS1sb25nIGlkLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIEBwYXJhbSBpZCB0aGUgZXh0ZW5zaW9uIGlkCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgaWQpIHsKLQkJZXh0ZW5zaW9uSWQgPSBpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyAoY3JlYXRlcyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yKSB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciB3aXRoCi0JICogdGhlIGdpdmVuIHJ1bnRpbWUgYW5kIHRoZSBnaXZlbiBjbGFzc3BhdGggY29udGFpbmVyIGlkIChyZXR1cm5lZCBmcm9tCi0JICogZ2V0Q2xhc3NwYXRoRW50cnlJZHMoKSkuIElmIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIGNhbm5vdCBiZSByZXNvbHZlZAotCSAqIChmb3IgaW5zdGFuY2UsIGlmIHRoZSBydW50aW1lIGRvZXMgbm90IGV4aXN0KSwgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgdGhlIHJ1bnRpbWUgdG8gcmVzb2x2ZSB0aGUgY29udGFpbmVyIGZvcgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBjb250YWluZXIsIG9yIG51bGwgaWYgdGhlCi0JICogICBjb250YWluZXIgY291bGQgbm90IGJlIHJlc29sdmVkCi0JICogQGRlcHJlY2F0ZWQgdXNlIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXIoSVByb2plY3QsIElSdW50aW1lKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXIoSVJ1bnRpbWUgcnVudGltZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyAoY3JlYXRlcyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yKSB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciB3aXRoCi0JICogdGhlIGdpdmVuIHJ1bnRpbWUgYW5kIHRoZSBnaXZlbiBjbGFzc3BhdGggY29udGFpbmVyIGlkIChyZXR1cm5lZCBmcm9tCi0JICogZ2V0Q2xhc3NwYXRoRW50cnlJZHMoKSkuIElmIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIGNhbm5vdCBiZSByZXNvbHZlZAotCSAqIChmb3IgaW5zdGFuY2UsIGlmIHRoZSBydW50aW1lIGRvZXMgbm90IGV4aXN0KSwgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gcmVzb2x2ZQotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIHJlc29sdmUgdGhlIGNvbnRhaW5lciBmb3IKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGUgY29udGFpbmVyLCBvciBudWxsIGlmIHRoZQotCSAqICAgY29udGFpbmVyIGNvdWxkIG5vdCBiZSByZXNvbHZlZAotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElQcm9qZWN0IHByb2plY3QsIElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMKLQkgKiBAZGVwcmVjYXRlZCBzaG91bGQgdXNlIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXJJbXBsKElQcm9qZWN0LCBJUnVudGltZSkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVySW1wbChJUnVudGltZSBydW50aW1lKSB7Ci0JCXJldHVybiByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVySW1wbChudWxsLCBydW50aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBjbGFzc3BhdGggY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcwotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVySW1wbChJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLQkJcnVudGltZVBhdGhNYXAucHV0KHJ1bnRpbWUuZ2V0SWQoKSwgcnVudGltZS5nZXRMb2NhdGlvbigpKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IHJlc29sdmVDbGFzc3BhdGhDb250YWluZXIocHJvamVjdCwgcnVudGltZSk7Ci0JCWlmIChlbnRyaWVzID09IG51bGwpCi0JCQllbnRyaWVzID0gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihydW50aW1lKTsKLQkJCi0JCWlmIChlbnRyaWVzID09IG51bGwpCi0JCQllbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLQkJCi0JCWlmIChzb3VyY2VBdHRhY2htZW50cyA9PSBudWxsKQotCQkJbG9hZCgpOwotCQkKLQkJaW50IHNpemUgPSBlbnRyaWVzLmxlbmd0aDsKLQkJaW50IHNpemUyID0gc291cmNlQXR0YWNobWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJU291cmNlQXR0YWNobWVudFVwZGF0ZSBzYXUgPSBzb3VyY2VBdHRhY2htZW50cy5nZXQoaik7Ci0JCQkJaWYgKHNhdS5ydW50aW1lSWQuZXF1YWxzKHJ1bnRpbWUuZ2V0SWQoKSkgJiYgc2F1LmVudHJ5LmVxdWFscyhlbnRyaWVzW2ldLmdldFBhdGgoKSkpIHsKLQkJCQkJZW50cmllc1tpXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShlbnRyaWVzW2ldLmdldFBhdGgoKSwgc2F1LnNvdXJjZUF0dGFjaG1lbnRQYXRoLCBzYXUuc291cmNlQXR0YWNobWVudFJvb3RQYXRoLCBuZXcgSUFjY2Vzc1J1bGVbMF0sIHNhdS5hdHRyaWJ1dGVzLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlTdHJpbmcga2V5ID0gcHJvamVjdC5nZXROYW1lKCkgKyAiLyIgKyBydW50aW1lLmdldElkKCk7Ci0JCWlmICghcHJldmlvdXNDbGFzc3BhdGguY29udGFpbnNLZXkoa2V5KSkKLQkJCXByZXZpb3VzQ2xhc3NwYXRoLnB1dChrZXksIGVudHJpZXMpOwotCQllbHNlIHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIHByZXZpb3VzRW50cmllcyA9IHByZXZpb3VzQ2xhc3NwYXRoLmdldChrZXkpOwotCQkJCi0JCQlpZiAoKHByZXZpb3VzRW50cmllcyA9PSBudWxsKSB8fCAocHJldmlvdXNFbnRyaWVzLmxlbmd0aCAhPSBlbnRyaWVzLmxlbmd0aCkpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJDbGFzc3BhdGggdXBkYXRlOiAiICsga2V5ICsgIiAiICsgZW50cmllcyk7Ci0JCQkJcHJldmlvdXNDbGFzc3BhdGgucHV0KGtleSwgZW50cmllcyk7Ci0JCQkJCi0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuU0VSVkVSX0NPTlRBSU5FUik7Ci0JCQkJcGF0aCA9IHBhdGguYXBwZW5kKGV4dGVuc2lvbklkKS5hcHBlbmQocnVudGltZS5nZXRJZCgpKTsKLQkJCQl0cnkgewotCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJCUphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcihwYXRoLCBuZXcgSUphdmFQcm9qZWN0W10geyBqYXZhUHJvamVjdCB9LAotCQkJCQkJCW5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW10geyBudWxsIH0sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciB1cGRhdGluZyBjbGFzc3BhdGgiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBlbnRyaWVzOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgY2hhbmdlcyBpbiB0aGUgcnVudGltZSBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlCi0JICogY2xhc3NwYXRoIHdhcyByZXNvbHZlZCB3aGljaCBtYXkgYWZmZWN0IHRoZSBjbGFzc3BhdGgsIGFuZCBmYWxzZSBvdGhlcndpc2UuIFRoaXMKLQkgKiBtZXRob2QgaXMgdXNlZCB0byBjaGVjayBwcm9qZWN0cyB3aGVuIGEgcnVudGltZSBjaGFuZ2VzIGFuZCBhdXRvbWF0aWNhbGx5IHJlYnVpbGQKLQkgKiB0aGVtIGlmIG5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbGFzc3BhdGggbWF5IGNoYW5nZSBkdWUgdG8gYSBjaGFuZ2UgaW4gdGhlIHJ1bnRpbWUsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gY2hhbmdlcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1J1bnRpbWVDbGFzc3BhdGhDaGFuZ2VkKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJdHJ5IHsKLQkJCUlQYXRoIHBhdGggPSBydW50aW1lUGF0aE1hcC5nZXQocnVudGltZS5nZXRJZCgpKTsKLQkJCXJldHVybiAocGF0aCAhPSBudWxsICYmICFwYXRoLmVxdWFscyhydW50aW1lLmdldExvY2F0aW9uKCkpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphckZpbGVzKEZpbGUgZGlyLCBMaXN0PElDbGFzc3BhdGhFbnRyeT4gbGlzdCwgYm9vbGVhbiBpbmNsdWRlU3ViZGlyZWN0b3JpZXMpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJaWYgKGluY2x1ZGVTdWJkaXJlY3RvcmllcykKLQkJCWRlcHRoID0gMjsKLQkJYWRkSmFyRmlsZXMoZGlyLCBsaXN0LCBkZXB0aCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXJGaWxlcyhGaWxlIGRpciwgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGxpc3QsIGludCBkZXB0aCkgewotCQlpZiAoZGlyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKEZpbGUgZmlsZSA6IGZpbGVzKSB7Ci0JCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSAmJiBkZXB0aCA+IDApIHsKLQkJCQkJYWRkSmFyRmlsZXMoZmlsZSwgbGlzdCwgZGVwdGggLSAxKTsKLQkJCQl9IGVsc2UgaWYgKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoIi5qYXIiKSB8fCBmaWxlLmdldEFic29sdXRlUGF0aCgpLmVuZHNXaXRoKCIuemlwIikpIHsKLQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQlsaXN0LmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocGF0aCwgbnVsbCwgbnVsbCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBsaWJyYXJ5IGVudHJpZXMgdG8gdGhlIGdpdmVuIGxpc3QgZm9yIGV2ZXJ5IGphciBmaWxlIGZvdW5kIGluIHRoZQotCSAqIGdpdmVuIGRpcmVjdG9yeS4gT3B0aW9uYWxseSBzZWFyY2ggc3ViZGlyZWN0b3JpZXMgYXMgd2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdCBhIGxpc3QKLQkgKiBAcGFyYW0gZGlyIGEgZGlyZWN0b3J5Ci0JICogQHBhcmFtIGluY2x1ZGVTdWJkaXJlY3RvcmllcyA8Y29kZT50cnVlPC9jb2RlPiB0byBpbmNsdWRlIHN1YmRpcmVjdG9yaWVzLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZExpYnJhcnlFbnRyaWVzKExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBsaXN0LCBGaWxlIGRpciwgYm9vbGVhbiBpbmNsdWRlU3ViZGlyZWN0b3JpZXMpIHsKLQkJaWYgKGRpciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlhZGRKYXJGaWxlcyhkaXIsIGxpc3QsIGluY2x1ZGVTdWJkaXJlY3Rvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogUmVxdWVzdCB0aGF0IHRoZSBjbGFzc3BhdGggY29udGFpbmVyIGZvciB0aGUgZ2l2ZW4gcnVudGltZSBhbmQgaWQgYmUgdXBkYXRlZAotCSAqIHdpdGggdGhlIGdpdmVuIGNsYXNzcGF0aCBjb250YWluZXIgZW50cmllcy4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKiBAcGFyYW0gZW50cmllcyBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUoSVJ1bnRpbWUgcnVudGltZSwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcykgewotCQkvLyBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBzYXZlIHRoZSBzb3VyY2UgcGF0aCBlbnRyaWVzCi0JCWlmIChydW50aW1lID09IG51bGwgfHwgZW50cmllcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJLy8gZmluZCB0aGUgc291cmNlIGF0dGFjaG1lbnRzCi0JCXNvdXJjZUF0dGFjaG1lbnRzID0gbmV3IEFycmF5TGlzdDxTb3VyY2VBdHRhY2htZW50VXBkYXRlPigpOwotCQkKLQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBlbnRyaWVzKSB7Ci0JCQlpZiAoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSAhPSBudWxsIHx8IGVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpICE9IG51bGwpIHsKLQkJCQlTb3VyY2VBdHRhY2htZW50VXBkYXRlIHNhdSA9IG5ldyBTb3VyY2VBdHRhY2htZW50VXBkYXRlKCk7Ci0JCQkJc2F1LnJ1bnRpbWVJZCA9IHJ1bnRpbWUuZ2V0SWQoKTsKLQkJCQlzYXUuZW50cnkgPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJc2F1LnNvdXJjZUF0dGFjaG1lbnRQYXRoID0gZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKLQkJCQlzYXUuc291cmNlQXR0YWNobWVudFJvb3RQYXRoID0gZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCk7Ci0JCQkJc2F1LmF0dHJpYnV0ZXMgPSBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKTsKLQkJCQlzb3VyY2VBdHRhY2htZW50cy5hZGQoc2F1KTsKLQkJCX0KLQkJfQotCQlzYXZlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBzb3VyY2UgYXR0YWNobWVudCBpbmZvLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkKCkgewotCQlzb3VyY2VBdHRhY2htZW50cyA9IG5ldyBBcnJheUxpc3Q8U291cmNlQXR0YWNobWVudFVwZGF0ZT4oKTsKLQkJCi0JCVN0cmluZyBpZCA9IGV4dGVuc2lvbklkOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBKYXZhU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChpZCArICIueG1sIikudG9PU1N0cmluZygpOwotCQlpZiAoIShuZXcgRmlsZShmaWxlbmFtZSkpLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGZpbGVuYW1lKTsKLQkJCQotCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oInNvdXJjZS1hdHRhY2htZW50Iik7Ci0JCQlmb3IgKElNZW1lbnRvIGNoaWxkIDogY2hpbGRyZW4pIHsKLQkJCQl0cnkgewotCQkJCQlTb3VyY2VBdHRhY2htZW50VXBkYXRlIHNhdSA9IG5ldyBTb3VyY2VBdHRhY2htZW50VXBkYXRlKCk7Ci0JCQkJCXNhdS5ydW50aW1lSWQgPSBjaGlsZC5nZXRTdHJpbmcoInJ1bnRpbWUtaWQiKTsKLQkJCQkJU3RyaW5nIHRlbXAgPSBjaGlsZC5nZXRTdHJpbmcoImVudHJ5Iik7Ci0JCQkJCWlmICh0ZW1wICE9IG51bGwpCi0JCQkJCQlzYXUuZW50cnkgPSBuZXcgUGF0aCh0ZW1wKTsKLQkJCQkJdGVtcCA9IGNoaWxkLmdldFN0cmluZygic291cmNlLWF0dGFjaG1lbnQtcGF0aCIpOwotCQkJCQlpZiAodGVtcCAhPSBudWxsKQotCQkJCQkJc2F1LnNvdXJjZUF0dGFjaG1lbnRQYXRoID0gbmV3IFBhdGgodGVtcCk7Ci0JCQkJCXRlbXAgPSBjaGlsZC5nZXRTdHJpbmcoInNvdXJjZS1hdHRhY2htZW50LXJvb3QtcGF0aCIpOwotCQkJCQlpZiAodGVtcCAhPSBudWxsKQotCQkJCQkJc2F1LnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCA9IG5ldyBQYXRoKHRlbXApOwotCQkJCQlJTWVtZW50b1tdIGF0dHJDaGlsZHJlbiA9IGNoaWxkLmdldENoaWxkcmVuKCJhdHRyaWJ1dGUiKTsKLQkJCQkJaWYgKGF0dHJDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc2l6ZTIgPSBhdHRyQ2hpbGRyZW4ubGVuZ3RoOwotCQkJCQkJc2F1LmF0dHJpYnV0ZXMgPSBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtzaXplMl07Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJCQlTdHJpbmcgbmFtZSA9IGF0dHJDaGlsZHJlbltqXS5nZXRTdHJpbmcoIm5hbWUiKTsKLQkJCQkJCQlTdHJpbmcgdmFsdWUgPSBhdHRyQ2hpbGRyZW5bal0uZ2V0U3RyaW5nKCJ2YWx1ZSIpOwotCQkJCQkJCXNhdS5hdHRyaWJ1dGVzW2pdID0gSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzb3VyY2VBdHRhY2htZW50cy5hZGQoc2F1KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgc291cmNlIGF0dGFjaG1lbnQ6ICIgKyBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgc291cmNlIHBhdGggaW5mbyIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBzb3VyY2UgYXR0YWNobWVudCBpbmZvLgotCSAqLwotCXByaXZhdGUgdm9pZCBzYXZlKCkgewotCQlpZiAoc291cmNlQXR0YWNobWVudHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGlkID0gZXh0ZW5zaW9uSWQ7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IEphdmFTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKGlkICsgIi54bWwiKS50b09TU3RyaW5nKCk7Ci0JCXRyeSB7Ci0JCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgiY2xhc3NwYXRoIik7Ci0KLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc291cmNlQXR0YWNobWVudHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlTb3VyY2VBdHRhY2htZW50VXBkYXRlIHNhdSA9IChTb3VyY2VBdHRhY2htZW50VXBkYXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJzb3VyY2UtYXR0YWNobWVudCIpOwotCQkJCWNoaWxkLnB1dFN0cmluZygicnVudGltZS1pZCIsIHNhdS5ydW50aW1lSWQpOwotCQkJCWlmIChzYXUuZW50cnkgIT0gbnVsbCkKLQkJCQkJY2hpbGQucHV0U3RyaW5nKCJlbnRyeSIsIHNhdS5lbnRyeS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJCWlmIChzYXUuc291cmNlQXR0YWNobWVudFBhdGggIT0gbnVsbCkKLQkJCQkJY2hpbGQucHV0U3RyaW5nKCJzb3VyY2UtYXR0YWNobWVudC1wYXRoIiwgc2F1LnNvdXJjZUF0dGFjaG1lbnRQYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQkJaWYgKHNhdS5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGggIT0gbnVsbCkKLQkJCQkJY2hpbGQucHV0U3RyaW5nKCJzb3VyY2UtYXR0YWNobWVudC1yb290LXBhdGgiLCBzYXUuc291cmNlQXR0YWNobWVudFJvb3RQYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQkJaWYgKHNhdS5hdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQkJZm9yIChJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHIgOiBzYXUuYXR0cmlidXRlcykgewotCQkJCQkJSU1lbWVudG8gYXR0ckNoaWxkID0gY2hpbGQuY3JlYXRlQ2hpbGQoImF0dHJpYnV0ZSIpOwotCQkJCQkJYXR0ckNoaWxkLnB1dFN0cmluZygibmFtZSIsIGF0dHIuZ2V0TmFtZSgpKTsKLQkJCQkJCWF0dHJDaGlsZC5wdXRTdHJpbmcoInZhbHVlIiwgYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJbWVtZW50by5zYXZlVG9GaWxlKGZpbGVuYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHNhdmluZyBzb3VyY2UgcGF0aCBpbmZvIiwgZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJQcm9maWxlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1NlcnZlclByb2ZpbGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZmMGRjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1NlcnZlclByb2ZpbGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNUnVubmVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSmF2YVNlcnZlclBsdWdpbjsKLS8qKgotICogQSBzZXJ2ZXIgcHJvZmlsZXIgZGVsZWdhdGUuCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJQcm9maWxlckRlbGVnYXRlIHsKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgc2VydmVyIHByb2ZpbGVyIGRlbGVnYXRlLiBUaGlzIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQcm9maWxlckRlbGVnYXRlKCkgewotCQkvLyBpZ25vcmUKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgdGhlIEphdmEgbGF1bmNoIGNvbmZpZ3VyYXRpb24gYWJvdXQgdG8gYmUgcnVuIHRvIHN1cHBvcnQgcHJvZmlsaW5nLgotCSAqIFZNIGFyZ3Mgb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiBiZSBzZXQgdG8gYWxsb3cgcHJvZmlsaW5nLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2ggdGhlIGxhdW5jaAotCSAqIEBwYXJhbSB2bUluc3RhbGwgdGhlIHZtIGluc3RhbGwgYmVpbmcgcnVuIGFnYWluc3QKLQkgKiBAcGFyYW0gdm1Db25maWcgdGhlIGNvbmZpZ3VyYXRpb24gdG8gcHJvY2VzcwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gZHVyaW5nIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzKElMYXVuY2ggbGF1bmNoLCBJVk1JbnN0YWxsIHZtSW5zdGFsbCwgVk1SdW5uZXJDb25maWd1cmF0aW9uIHZtQ29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUHJvY2Vzc2VzIHRoZSBKYXZhIGxhdW5jaCBjb25maWd1cmF0aW9uIGFib3V0IHRvIGJlIHJ1biB0byBzdXBwb3J0IHByb2ZpbGluZy4KLQkgKiBWTSBhcmdzIG9yIGVudmlyb25tZW50IHZhcmlhYmxlcyBjYW4gYmUgc2V0IHRvIGFsbG93IHByb2ZpbGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoIHRoZSBsYXVuY2gKLQkgKiBAcGFyYW0gdm1JbnN0YWxsIHRoZSB2bSBpbnN0YWxsIGJlaW5nIHJ1biBhZ2FpbnN0Ci0JICogQHBhcmFtIHZtQ29uZmlnIHRoZSBjb25maWd1cmF0aW9uIHRvIHByb2Nlc3MKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgYXJlIG5vIHByb2ZpbGVycyBjb25maWd1cmVkIG9yIHRoZXJlIGlzIGEgcHJvYmxlbQotCSAqICAgY29uZmlndXJpbmcgdGhlIGxhdW5jaAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVQcm9maWxpbmcoSUxhdW5jaCBsYXVuY2gsIElWTUluc3RhbGwgdm1JbnN0YWxsLCBWTVJ1bm5lckNvbmZpZ3VyYXRpb24gdm1Db25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlKYXZhU2VydmVyUGx1Z2luLmNvbmZpZ3VyZVByb2ZpbGluZyhsYXVuY2gsIHZtSW5zdGFsbCwgdm1Db25maWcsIG1vbml0b3IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1NlcnZsZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2NjNGRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0RGVsZWdhdGU7Ci0vKioKLSAqIEEgSjJFRSBTZXJ2bGV0LgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0IGV4dGVuZHMgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCXByaXZhdGUgU3RyaW5nIGFsaWFzOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIHJlZmVyZW5jZSB0byBhIHNlcnZsZXQuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRoYXQgdGhlIHNlcnZsZXQgaXMgY29udGFpbmVkIGluCi0JICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmxldAotCSAqIEBwYXJhbSBhbGlhcyB0aGUgc2VydmxldCdzIGFsaWFzCi0JICovCi0JcHVibGljIFNlcnZsZXQoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBhbGlhcykgewotCQlzdXBlcihtb2R1bGUpOwotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJdGhpcy5hbGlhcyA9IGFsaWFzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBlbXB0eSBzZXJ2bGV0LgotCSAqLwotCXB1YmxpYyBTZXJ2bGV0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmxldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2bGV0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNlcnZsZXQncyBhbGlhcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2bGV0J3MgYWxpYXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgewotCQlyZXR1cm4gYWxpYXM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3RTZXJ2bGV0LCBjbGFzc05hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI2Rlc2VyaWFsaXplKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShTdHJpbmcgcykgewotCQlpbnQgaW5kID0gcy5pbmRleE9mKCIvLyIpOwotCQlzdXBlci5kZXNlcmlhbGl6ZShzLnN1YnN0cmluZygwLCBpbmQpKTsKLQkJcyA9IHMuc3Vic3RyaW5nKGluZCsyKTsKLQkJaW5kID0gcy5pbmRleE9mKCIvLyIpOwotCQljbGFzc05hbWUgPSBzLnN1YnN0cmluZygwLCBpbmQpOwotCQlhbGlhcyA9IHMuc3Vic3RyaW5nKGluZCsyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSNzZXJpYWxpemUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgc2VyaWFsaXplKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnNlcmlhbGl6ZSgpKTsKLQkJc2IuYXBwZW5kKCIvLyIpOwotCQlzYi5hcHBlbmQoY2xhc3NOYW1lKTsKLQkJc2IuYXBwZW5kKCIvLyIpOwotCQlzYi5hcHBlbmQoYWxpYXMpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2bGV0IFttb2R1bGU9IiArIGdldE1vZHVsZSgpICsgIiwgY2xhc3M9IiArIGNsYXNzTmFtZSArICIsIGFsaWFzPSIgKyBhbGlhcyArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9HZW5lcmljUnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9HZW5lcmljUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjRmY2FhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNSdW50aW1lIGV4dGVuZHMgUnVudGltZURlbGVnYXRlIGltcGxlbWVudHMgSUdlbmVyaWNSdW50aW1lLCBJR2VuZXJpY1J1bnRpbWVXb3JraW5nQ29weSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQgPSAidm0taW5zdGFsbC10eXBlLWlkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZNX0lOU1RBTExfSUQgPSAidm0taW5zdGFsbC1pZCI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZ2VuZXJpYyBydW50aW1lLgotCSAqLwotCXB1YmxpYyBHZW5lcmljUnVudGltZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9UWVBFX0lELCAoU3RyaW5nKW51bGwpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Vk1JbnN0YWxsSWQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKW51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJ1bnRpbWUgaXMgdXNpbmcgdGhlIGRlZmF1bHQgSlJFLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJ1bnRpbWUgaXMgdXNpbmcgdGhlIGRlZmF1bHQgSlJFLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2luZ0RlZmF1bHRKUkUoKSB7Ci0JCXJldHVybiBnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUdlbmVyaWNSdW50aW1lI2dldFZNSW5zdGFsbCgpCi0JICovCi0JcHVibGljIElWTUluc3RhbGwgZ2V0Vk1JbnN0YWxsKCkgewotCQlpZiAoZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgPT0gbnVsbCkKLQkJCXJldHVybiBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0JCXRyeSB7Ci0JCQlJVk1JbnN0YWxsVHlwZSB2bUluc3RhbGxUeXBlID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZShnZXRWTUluc3RhbGxUeXBlSWQoKSk7Ci0JCQlJVk1JbnN0YWxsW10gdm1JbnN0YWxscyA9IHZtSW5zdGFsbFR5cGUuZ2V0Vk1JbnN0YWxscygpOwotCQkJU3RyaW5nIGlkID0gZ2V0Vk1JbnN0YWxsSWQoKTsKLQkJCWZvciAoSVZNSW5zdGFsbCB2bUluc3QgOiB2bUluc3RhbGxzKSB7Ci0JCQkJaWYgKGlkLmVxdWFscyh2bUluc3QuZ2V0SWQoKSkpCi0JCQkJCXJldHVybiB2bUluc3Q7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBSdW50aW1lRGVsZWdhdGUjdmFsaWRhdGUoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlKCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCQotCQlJUnVudGltZSBydW50aW1lID0gZ2V0UnVudGltZSgpOwotCi0JCUlQYXRoIHBhdGggPSBydW50aW1lLmdldExvY2F0aW9uKCk7Ci0JCWlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckxvY2F0aW9uLCBudWxsKTsKLQkJZWxzZSBpZiAoZ2V0Vk1JbnN0YWxsKCkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckpSRSwgbnVsbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkjc2V0Vk1JbnN0YWxsKElWTUluc3RhbGwpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vk1JbnN0YWxsKElWTUluc3RhbGwgdm1JbnN0YWxsKSB7Ci0JCWlmICh2bUluc3RhbGwgPT0gbnVsbCkgewotCQkJc2V0Vk1JbnN0YWxsKG51bGwsIG51bGwpOwotCQl9IGVsc2UKLQkJCXNldFZNSW5zdGFsbCh2bUluc3RhbGwuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCksIHZtSW5zdGFsbC5nZXRJZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWTUluc3RhbGwoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGlkKSB7Ci0JCWlmICh0eXBlSWQgPT0gbnVsbCkKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgKFN0cmluZyludWxsKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9UWVBFX0lELCB0eXBlSWQpOwotCQkKLQkJaWYgKGlkID09IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKW51bGwpOwotCQllbHNlCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCBpZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9HZW5lcmljUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0dlbmVyaWNSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyYmI2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0dlbmVyaWNSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIgZXh0ZW5kcyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSB7Ci0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlI3Jlc29sdmVDbGFzc3BhdGhDb250YWluZXIoSVByb2plY3QsIElSdW50aW1lKQotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElQcm9qZWN0IHByb2plY3QsIElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJSVBhdGggaW5zdGFsbFBhdGggPSBydW50aW1lLmdldExvY2F0aW9uKCk7Ci0JCQotCQlpZiAoaW5zdGFsbFBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5WzBdOwotCQkKLQkJTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKLQkJYWRkTGlicmFyeUVudHJpZXMobGlzdCwgaW5zdGFsbFBhdGgudG9GaWxlKCksIGZhbHNlKTsKLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2xpc3Quc2l6ZSgpXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0dlbmVyaWNSdW50aW1lVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWZiYjExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZHMgZm9yIHRoZSBnZW5lcmljIEoyRUUgcnVudGltZS4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNSdW50aW1lVXRpbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRV9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSI7Ci0KLQkvKioKLQkgKiBDYW5ub3QgY3JlYXRlIEdlbmVyaWNSdW50aW1lVXRpbCAtIHVzZSBzdGF0aWMgbWV0aG9kcy4KLQkgKi8KLQlwcml2YXRlIEdlbmVyaWNSdW50aW1lVXRpbCgpIHsKLQkJLy8gY2FuJ3QgY3JlYXRlCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcnVudGltZSBpcyBhIGdlbmVyaWMgSjJFRSBydW50aW1lLCBhbmQKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLiBUaGUgcnVudGltZSBtYXkgbm90IGJlIG51bGwuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHZW5lcmljSjJFRVJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgewotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0JCXJldHVybiAocnVudGltZS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwgJiYKLQkJCXJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpLnN0YXJ0c1dpdGgoUlVOVElNRV9UWVBFX0lEKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JR2VuZXJpY1J1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUdlbmVyaWNSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGJkMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JR2VuZXJpY1J1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUphdmFSdW50aW1lOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJR2VuZXJpY1J1bnRpbWUgZXh0ZW5kcyBJSmF2YVJ1bnRpbWUgewotCS8vIG5vIGFkZGl0aW9uYWwgbWV0aG9kcwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JR2VuZXJpY1J1bnRpbWVXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JR2VuZXJpY1J1bnRpbWVXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmMxOTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklKYXZhUnVudGltZVdvcmtpbmdDb3B5OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJR2VuZXJpY1J1bnRpbWVXb3JraW5nQ29weSBleHRlbmRzIElHZW5lcmljUnVudGltZSwgSUphdmFSdW50aW1lV29ya2luZ0NvcHkgewotCS8vIG5vIG5ldyBtZXRob2RzCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTWVtZW50by5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBkMWYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIEludGVyZmFjZSB0byBhIG1lbWVudG8gdXNlZCBmb3Igc2F2aW5nIHRoZSBpbXBvcnRhbnQgc3RhdGUgb2YgYW4gb2JqZWN0Ci0gKiBpbiBhIGZvcm0gdGhhdCBjYW4gYmUgcGVyc2lzdGVkIGluIHRoZSBmaWxlIHN5c3RlbS4KLSAqIDxwPgotICogTWVtZW50b3Mgd2VyZSBkZXNpZ25lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGluIG1pbmQ6Ci0gKiA8b2w+Ci0gKiAgPGxpPkNlcnRhaW4gb2JqZWN0cyBuZWVkIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgcGxhdGZvcm0gc2Vzc2lvbnMuCi0gKiAgICA8L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgYW4gYXBwcm9wcmlhdGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtaWdodCBub3QKLSAqICAgIGJlIGF2YWlsYWJsZS4gSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBza2lwIGFuIG9iamVjdCBpbiB0aGlzIGNhc2UuPC9saT4KLSAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgdGhlIG9iamVjdCBtYXkgYmUKLSAqICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2hlbiB0aGUgb2JqZWN0IHdhcyBvcmlnaW5hbGx5IHNhdmVkLiBJZiBzbywgdGhlCi0gKiAgICBuZXcgY2xhc3Mgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIGZvcm0gb2YgdGhlIGRhdGEuPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1lbWVudG9zIG1lZXQgdGhlc2UgcmVxdWlyZW1lbnRzIGJ5IHByb3ZpZGluZyBzdXBwb3J0IGZvciBzdG9yaW5nIGEKLSAqIG1hcHBpbmcgb2YgYXJiaXRyYXJ5IHN0cmluZyBrZXlzIHRvIHByaW1pdGl2ZSB2YWx1ZXMsIGFuZCBieSBhbGxvd2luZwotICogbWVtZW50b3MgdG8gaGF2ZSBvdGhlciBtZW1lbnRvcyBhcyBjaGlsZHJlbiAoYXJyYW5nZWQgaW50byBhIHRyZWUpLgotICogQSByb2J1c3QgZXh0ZXJuYWwgc3RvcmFnZSBmb3JtYXQgYmFzZWQgb24gWE1MIGlzIHVzZWQuCi0gKiA8L3A+PHA+Ci0gKiBUaGUga2V5IGZvciBhbiBhdHRyaWJ1dGUgbWF5IGJlIGFueSBhbHBoYSBudW1lcmljIHZhbHVlLiAgSG93ZXZlciwgdGhlCi0gKiB2YWx1ZSBvZiA8Y29kZT5UQUdfSUQ8L2NvZGU+IGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVtZW50byB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBvZiB0aGlzIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcwotCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50bwotCSAqIEBzZWUgI2dldENoaWxkCi0JICogQHNlZSAjZ2V0Q2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBpZC4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGlkCi0JICogQHJldHVybiB0aGUgZmlyc3QgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gdHlwZQotCSAqLwotCXB1YmxpYyBJTWVtZW50byBnZXRDaGlsZChTdHJpbmcgdHlwZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW4gdHlwZSBpZC4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGlkCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBjaGlsZHJlbiB3aXRoIHRoZSBnaXZlbiB0eXBlCi0JICovCi0JcHVibGljIElNZW1lbnRvW10gZ2V0Q2hpbGRyZW4oU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSB3YXMgbm90IGZvdW5kIG9yIHdhcyBmb3VuZAotCSAqICBidXQgd2FzIG5vdCBhbiBpbnRlZ2VyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBzdHJpbmcuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KMkVFTGF1bmNoYWJsZUNsaWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KMkVFTGF1bmNoYWJsZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2ZhNTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSjJFRUxhdW5jaGFibGVDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkpuZGlMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5DbGllbnREZWxlZ2F0ZTsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEoyRUVMYXVuY2hhYmxlQ2xpZW50IGV4dGVuZHMgQ2xpZW50RGVsZWdhdGUgewotCS8qCi0JICogQHNlZSBDbGllbnREZWxlZ2F0ZSNzdXBwb3J0cyhJTGF1bmNoYWJsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlKSB7Ci0JCXJldHVybiAobGF1bmNoYWJsZSBpbnN0YW5jZW9mIEpuZGlMYXVuY2hhYmxlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ2xpZW50RGVsZWdhdGUjbGF1bmNoKElMYXVuY2hhYmxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTGF1bmNoIGxhdW5jaCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJKTkRJIGNsaWVudCBsYXVuY2hlZCIpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0oyRUVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0oyRUVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYmY4ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KMkVFVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklFbnRlcnByaXNlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklKMkVFTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBkZWFsaW5nIHdpdGggSjJFRSBtb2R1bGVzLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRVV0aWwgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfTU9EVUxFID0gImpzdC5lYXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFID0gImpzdC53ZWIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU1vZHVsZVtdIEVNUFRZX0xJU1QgPSBuZXcgSU1vZHVsZVswXTsKLQlwcml2YXRlIHN0YXRpYyBNYXA8SU1vZHVsZSwgTGlzdDxJTW9kdWxlPj4gZWFyQ2FjaGU7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwPElKMkVFTW9kdWxlLCBMaXN0PElNb2R1bGU+PiBlYXJDYWNoZTI7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwPElNb2R1bGUsIExpc3Q8SU1vZHVsZT4+IHdlYkNhY2hlOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNhY2hlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMgdGhhdCB0aGUgbW9kdWxlIGlzIGNvbnRhaW5lZCB3aXRoaW4uCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIEoyRUUgbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZVtdIGdldEVudGVycHJpc2VBcHBsaWNhdGlvbnMoSUoyRUVNb2R1bGUgbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHNob3VsZFVzZUNhY2hlKCkpIHsKLQkJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IGVhckNhY2hlMi5nZXQobW9kdWxlKTsKLQkJCWlmIChsaXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXSk7IAotCQl9Ci0JCQotCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKEVBUl9NT0RVTEUpOwotCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKElNb2R1bGUgbW9kdWxlMiA6IG1vZHVsZXMpIHsKLQkJCQlJRW50ZXJwcmlzZUFwcGxpY2F0aW9uIGVhciA9IChJRW50ZXJwcmlzZUFwcGxpY2F0aW9uKSBtb2R1bGUyLmxvYWRBZGFwdGVyKElFbnRlcnByaXNlQXBwbGljYXRpb24uY2xhc3MsIG1vbml0b3IpOwotCQkJCWlmIChlYXIgIT0gbnVsbCkgewotCQkJCQlJTW9kdWxlW10gbW9kdWxlczIgPSBlYXIuZ2V0TW9kdWxlcygpOwotCQkJCQlpZiAobW9kdWxlczIgIT0gbnVsbCkgewotCQkJCQkJZm9yIChJTW9kdWxlIG0gOiBtb2R1bGVzMikgewotCQkJCQkJCWlmIChtb2R1bGUuZXF1YWxzKG0ubG9hZEFkYXB0ZXIoSUoyRUVNb2R1bGUuY2xhc3MsIG1vbml0b3IpKSkKLQkJCQkJCQkJbGlzdC5hZGQobW9kdWxlMik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElNb2R1bGVbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucyB0aGF0IHRoZSBtb2R1bGUgaXMgY29udGFpbmVkIHdpdGhpbi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgSjJFRSBtb2R1bGUgb3IgdXRpbGl0eSBtb2R1bGUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIGVudGVycHJpc2UgYXBwbGljYXRpb25zCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlW10gZ2V0RW50ZXJwcmlzZUFwcGxpY2F0aW9ucyhJTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChzaG91bGRVc2VDYWNoZSgpKSB7Ci0JCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBlYXJDYWNoZS5nZXQobW9kdWxlKTsKLQkJCWlmIChsaXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXSk7IAotCQl9Ci0JCQotCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKEVBUl9NT0RVTEUpOwotCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKElNb2R1bGUgbW9kdWxlMiA6IG1vZHVsZXMpIHsKLQkJCQlJRW50ZXJwcmlzZUFwcGxpY2F0aW9uIGVhciA9IChJRW50ZXJwcmlzZUFwcGxpY2F0aW9uKSBtb2R1bGUyLmxvYWRBZGFwdGVyKElFbnRlcnByaXNlQXBwbGljYXRpb24uY2xhc3MsIG1vbml0b3IpOwotCQkJCWlmIChlYXIgIT0gbnVsbCkgewotCQkJCQlJTW9kdWxlW10gbW9kdWxlczIgPSBlYXIuZ2V0TW9kdWxlcygpOwotCQkJCQlpZiAobW9kdWxlczIgIT0gbnVsbCkgewotCQkJCQkJZm9yIChJTW9kdWxlIG0gOiBtb2R1bGVzMikgewotCQkJCQkJCWlmIChtb2R1bGUuZXF1YWxzKG0pKQotCQkJCQkJCQlsaXN0LmFkZChtb2R1bGUyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSU1vZHVsZVtsaXN0LnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdlYiBtb2R1bGVzIHRoYXQgdGhlIHV0aWxpdHkgbW9kdWxlIGlzIGNvbnRhaW5lZCB3aXRoaW4uCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIHV0aWxpdHkgbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiB3ZWIgbW9kdWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZVtdIGdldFdlYk1vZHVsZXMoSU1vZHVsZSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoc2hvdWxkVXNlQ2FjaGUoKSkgewotCQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gd2ViQ2FjaGUuZ2V0KG1vZHVsZSk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKQotCQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSU1vZHVsZVtsaXN0LnNpemUoKV0pOwotCQl9Ci0JCQotCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKFdFQl9NT0RVTEUpOwotCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKElNb2R1bGUgbW9kdWxlMiA6IG1vZHVsZXMpIHsKLQkJCQlJV2ViTW9kdWxlIHdlYiA9IChJV2ViTW9kdWxlKSBtb2R1bGUyLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG1vbml0b3IpOwotCQkJCWlmICh3ZWIgIT0gbnVsbCkgewotCQkJCQlJTW9kdWxlW10gbW9kdWxlczIgPSB3ZWIuZ2V0TW9kdWxlcygpOwotCQkJCQlpZiAobW9kdWxlczIgIT0gbnVsbCkgewotCQkJCQkJZm9yIChJTW9kdWxlIG0gOiBtb2R1bGVzMikgewotCQkJCQkJCWlmIChtb2R1bGUuZXF1YWxzKG0pKQotCQkJCQkJCQlsaXN0LmFkZChtb2R1bGUyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSU1vZHVsZVtsaXN0LnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbENhY2hlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQllYXJDYWNoZSA9IG5ldyBIYXNoTWFwPElNb2R1bGUsIExpc3Q8SU1vZHVsZT4+KCk7Ci0JCWVhckNhY2hlMiA9IG5ldyBIYXNoTWFwPElKMkVFTW9kdWxlLCBMaXN0PElNb2R1bGU+PigpOwotCQl3ZWJDYWNoZSA9IG5ldyBIYXNoTWFwPElNb2R1bGUsIExpc3Q8SU1vZHVsZT4+KCk7Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhFQVJfTU9EVUxFKTsKLQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotCQkJZm9yIChJTW9kdWxlIG1vZHVsZTIgOiBtb2R1bGVzKSB7Ci0JCQkJSUVudGVycHJpc2VBcHBsaWNhdGlvbiBlYXIgPSAoSUVudGVycHJpc2VBcHBsaWNhdGlvbikgbW9kdWxlMi5sb2FkQWRhcHRlcihJRW50ZXJwcmlzZUFwcGxpY2F0aW9uLmNsYXNzLCBtb25pdG9yKTsKLQkJCQlpZiAoZWFyICE9IG51bGwpIHsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gZWFyLmdldE1vZHVsZXMoKTsKLQkJCQkJaWYgKG1vZHVsZXMyICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSU1vZHVsZSBtbSA6IG1vZHVsZXMyKSB7Ci0JCQkJCQkJTGlzdDxJTW9kdWxlPiBtID0gZWFyQ2FjaGUuZ2V0KG1tKTsKLQkJCQkJCQlpZiAobSA9PSBudWxsKSB7Ci0JCQkJCQkJCW0gPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KDIpOwotCQkJCQkJCQllYXJDYWNoZS5wdXQobW0sIG0pOwotCQkJCQkJCX0KLQkJCQkJCQltLmFkZChtb2R1bGUyKTsKLQkJCQkJCQkKLQkJCQkJCQlJSjJFRU1vZHVsZSBtb2QgPSAoSUoyRUVNb2R1bGUpIG1tLmxvYWRBZGFwdGVyKElKMkVFTW9kdWxlLmNsYXNzLCBtb25pdG9yKTsKLQkJCQkJCQlpZiAobW9kICE9IG51bGwpIHsKLQkJCQkJCQkJbSA9IGVhckNhY2hlMi5nZXQobW9kKTsKLQkJCQkJCQkJaWYgKG0gPT0gbnVsbCkgewotCQkJCQkJCQkJbSA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oMik7Ci0JCQkJCQkJCQllYXJDYWNoZTIucHV0KG1vZCwgbSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJbS5hZGQobW9kdWxlMik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQltb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKFdFQl9NT0RVTEUpOwotCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKElNb2R1bGUgbW9kdWxlMiA6IG1vZHVsZXMpIHsKLQkJCQlJV2ViTW9kdWxlIHdlYiA9IChJV2ViTW9kdWxlKSBtb2R1bGUyLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG1vbml0b3IpOwotCQkJCWlmICh3ZWIgIT0gbnVsbCkgewotCQkJCQlJTW9kdWxlW10gbW9kdWxlczIgPSB3ZWIuZ2V0TW9kdWxlcygpOwotCQkJCQlpZiAobW9kdWxlczIgIT0gbnVsbCkgewotCQkJCQkJZm9yIChJTW9kdWxlIG1tIDogbW9kdWxlczIpIHsKLQkJCQkJCQlMaXN0PElNb2R1bGU+IG0gPSB3ZWJDYWNoZS5nZXQobW0pOwotCQkJCQkJCWlmIChtID09IG51bGwpIHsKLQkJCQkJCQkJbSA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oMik7Ci0JCQkJCQkJCXdlYkNhY2hlLnB1dChtbSwgbSk7Ci0JCQkJCQkJfQotCQkJCQkJCW0uYWRkKG1vZHVsZTIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaG91bGRVc2VDYWNoZSgpIHsKLQkJU3RyaW5nIHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIkoyRUVjYWNoZSIpOwotCQlpZiAocyA9PSBudWxsIHx8ICIiLmVxdWFscyhzKSB8fCAiZmFsc2UiLmVxdWFscyhzKSkgewotCQkJd2ViQ2FjaGUgPSBudWxsOwotCQkJZWFyQ2FjaGUgPSBudWxsOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChjYWNoZSA9PSBudWxsIHx8ICFjYWNoZS5lcXVhbHMocykpIHsKLQkJCWNhY2hlID0gczsKLQkJCWZpbGxDYWNoZShudWxsKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KUkVSdW50aW1lQ29tcG9uZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSlJFUnVudGltZUNvbXBvbmVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YWZhZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KUkVSdW50aW1lQ29tcG9uZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBKUkVSdW50aW1lQ29tcG9uZW50UHJvdmlkZXIgZXh0ZW5kcyBSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gZ2V0UnVudGltZUNvbXBvbmVudHMoSVJ1bnRpbWUgcnVudGltZSkgewotCQkvLyBkZWZpbmUgSlJFIGNvbXBvbmVudAotCQlJSmF2YVJ1bnRpbWUgamF2YVJ1bnRpbWUgPSAoSUphdmFSdW50aW1lKSBydW50aW1lLmxvYWRBZGFwdGVyKElKYXZhUnVudGltZS5jbGFzcywgbnVsbCk7Ci0JCWlmIChqYXZhUnVudGltZSAhPSBudWxsKSB7Ci0JCSAgICBmaW5hbCBJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IGphdmFSdW50aW1lLmdldFZNSW5zdGFsbCgpOwotCQkgICAgZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmMgPSBTdGFuZGFyZEpyZVJ1bnRpbWVDb21wb25lbnQuY3JlYXRlKCB2bUluc3RhbGwgKTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCByYyApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0phdmFTZXJ2ZXJQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSmF2YVNlcnZlclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmUwNWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSmF2YVNlcnZlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5WTVJ1bm5lckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLS8qKgotICogVGhlIG1haW4gc2VydmVyIHRvb2xpbmcgcGx1Z2luIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVNlcnZlclBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLyoqCi0JICogSmF2YSBzZXJ2ZXIgcGx1Z2luIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSI7Ci0KLQkvLyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwotCXByaXZhdGUgc3RhdGljIEphdmFTZXJ2ZXJQbHVnaW4gc2luZ2xldG9uOwotCi0JLy8JY2FjaGVkIGNvcHkgb2YgYWxsIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVycwotCXByaXZhdGUgc3RhdGljIExpc3Q8UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlcj4gcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyczsKLQotCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBzZXJ2ZXIgcHJvZmlsZXJzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTZXJ2ZXJQcm9maWxlcj4gc2VydmVyUHJvZmlsZXJzOwotCQotCS8vIHJ1bnRpbWUgbGlzdGVuZXIKLQlwcml2YXRlIHN0YXRpYyBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIHJ1bnRpbWVMaXN0ZW5lcjsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgSmF2YVNlcnZlclBsdWdpbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVNlcnZlclBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJc2luZ2xldG9uID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICoKLQkgKiBAcmV0dXJuIGEgc2luZ2xldG9uIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhU2VydmVyUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLQkJcnVudGltZUxpc3RlbmVyID0gbmV3IElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW50aW1lQWRkZWQoSVJ1bnRpbWUgcnVudGltZSkgewotCQkJCWhhbmRsZVJ1bnRpbWVDaGFuZ2UocnVudGltZSwgMCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVDaGFuZ2VkKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJCQloYW5kbGVSdW50aW1lQ2hhbmdlKHJ1bnRpbWUsIDEpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW50aW1lUmVtb3ZlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCQkJaGFuZGxlUnVudGltZUNoYW5nZShydW50aW1lLCAyKTsKLQkJCX0KLQkJfTsKLQkJCi0JCVNlcnZlckNvcmUuYWRkUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKHJ1bnRpbWVMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dDIpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXJ2ZXJDb3JlLnJlbW92ZVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcihydW50aW1lTGlzdGVuZXIpOwotCQlzdXBlci5zdG9wKGNvbnRleHQyKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgYSBydW50aW1lIGNoYW5nZSBieSBwb3RlbnRpYWxseSB1cGRhdGluZyB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSdW50aW1lQ2hhbmdlKGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsIGZpbmFsIGludCBhY3QpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBvc3NpYmxlIHJ1bnRpbWUgY2hhbmdlOiAiICsgcnVudGltZSk7Ci0JCQotCQlpZiAocnVudGltZS5nZXRSdW50aW1lVHlwZSgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlmaW5hbCBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIHJjcHcgPSBmaW5kUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSk7Ci0JCWlmIChyY3B3ICE9IG51bGwgJiYgKHJjcHcuaGFzUnVudGltZUNsYXNzcGF0aENoYW5nZWQocnVudGltZSkgfHwgYWN0ICE9IDEpKSB7Ci0JCQlmaW5hbCBJUGF0aCBzZXJ2ZXJDb250YWluZXJQYXRoID0gbmV3IFBhdGgoUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5TRVJWRVJfQ09OVEFJTkVSKQotCQkJCS5hcHBlbmQocmNwdy5nZXRJZCgpKS5hcHBlbmQocnVudGltZS5nZXRJZCgpKTsKLQkJCQotCQkJY2xhc3MgUmVidWlsZFJ1bnRpbWVSZWZlcmVuY2VzSm9iIGV4dGVuZHMgSm9iIHsKLQkJCQlwdWJsaWMgUmVidWlsZFJ1bnRpbWVSZWZlcmVuY2VzSm9iKCkgewotCQkJCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy51cGRhdGVDbGFzc3BhdGhDb250YWluZXJzLCBydW50aW1lLmdldE5hbWUoKSkpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCQkJaWYgKHByb2plY3RzICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSVByb2plY3QgcHJvamVjdCA6IHByb2plY3RzKSB7Ci0JCQkJCQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWlmICghcHJvamVjdC5pc05hdHVyZUVuYWJsZWQoSmF2YUNvcmUuTkFUVVJFX0lEKSkKLQkJCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjZSA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCQkJCQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgY3AgOiBjZSkgewotCQkJCQkJCQkJCWlmIChjcC5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUikgewotCQkJCQkJCQkJCQlpZiAoc2VydmVyQ29udGFpbmVyUGF0aC5pc1ByZWZpeE9mKGNwLmdldFBhdGgoKSkpCi0JCQkJCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJDbGFzc3BhdGggY2hhbmdlIG9uOiAiICsgcHJvamVjdCArICIgIiArIGZvdW5kKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCQkJCQkJSVJ1bnRpbWUgcnVudGltZTIgPSBydW50aW1lOwotCQkJCQkJCQkJCWlmIChhY3QgPT0gMikKLQkJCQkJCQkJCQkJcnVudGltZTIgPSBudWxsOwotCQkJCQkJCQkJCVJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gbmV3IFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIocHJvamVjdCwKLQkJCQkJCQkJCQkJCXNlcnZlckNvbnRhaW5lclBhdGgsIHJjcHcsIHJ1bnRpbWUyLCBydW50aW1lLmdldElkKCkpOwotCQkJCQkJCQkJCUphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcihzZXJ2ZXJDb250YWluZXJQYXRoLCBuZXcgSUphdmFQcm9qZWN0W10geyBqYXZhUHJvamVjdCB9LAotCQkJCQkJCQkJCQkJbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7Y29udGFpbmVyfSwgbnVsbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgdXBkYXRlIGNsYXNzcGF0aCBjb250YWluZXIiLCBlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJfQotCQkJUmVidWlsZFJ1bnRpbWVSZWZlcmVuY2VzSm9iIGpvYiA9IG5ldyBSZWJ1aWxkUnVudGltZVJlZmVyZW5jZXNKb2IoKTsKLQkJCWpvYi5zY2hlZHVsZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBsb2dnaW5nLgotCSAqCi0JICogQHBhcmFtIHN0YXR1cyBhIHN0YXR1cwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1zZykgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaW5zdGFuY2VzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZQotCSAqIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGluc3RhbmNlcwotCSAqICAgICAgICAge0BsaW5rIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyW10gZ2V0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpIHsKLQkJaWYgKHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMgPT0gbnVsbCkKLQkJCWxvYWRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzKCk7Ci0JCQotCQlSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyW10gcnRoID0gbmV3IFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXJbcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycy5zaXplKCldOwotCQlydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLnRvQXJyYXkocnRoKTsKLQkJcmV0dXJuIHJ0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBydW50aW1lIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24gcnVudGltZQotCSAqIGNsYXNzcGF0aCBwcm92aWRlcnMgKHtAbGluayAjZ2V0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpfSkgZm9yIHRoZSBvbmUgd2l0aAotCSAqIGEgbWF0Y2hpbmcgcnVudGltZSB0eXBlLgotCSAqIFRoZSBydW50aW1lVHlwZSBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gcnVudGltZVR5cGUgYSBydW50aW1lIHR5cGUKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgIHRoZXJlIGlzIG5vIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIHRoYXQgc3VwcG9ydHMgdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIGZpbmRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCWlmIChydW50aW1lVHlwZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0JCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzID09IG51bGwpCi0JCQlsb2FkUnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyID0gKFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuc3VwcG9ydHNSdW50aW1lVHlwZShydW50aW1lVHlwZSkpCi0JCQkJcmV0dXJuIHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBydW50aW1lIHR5cGUgaWQsCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlcnMgKHtAbGluayAjZ2V0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpfSkgZm9yIHRoZSBvbmUKLQkgKiB3aXRoIGEgbWF0Y2hpbmcgcnVudGltZSB0eXBlIGlkLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIGEgcnVudGltZSB0eXBlIGlkCi0JICogQHJldHVybiB0aGUgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICB0aGVyZSBpcyBubyBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciBmaW5kUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyQnlTdXBwb3J0KFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzID09IG51bGwpCi0JCQlsb2FkUnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyID0gKFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuc3VwcG9ydHNSdW50aW1lVHlwZShpZCkpCi0JCQkJcmV0dXJuIHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93biBydW50aW1lCi0JICogY2xhc3NwYXRoIHByb3ZpZGVycyAoe0BsaW5rICNnZXRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzKCl9KSBmb3IgdGhlIG9uZSB3aXRoCi0JICogYSBtYXRjaGluZyBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpZCAoe0BsaW5rIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIjZ2V0SWQoKX0pLgotCSAqIFRoZSBpZCBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGlkCi0JICogQHJldHVybiB0aGUgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICB0aGVyZSBpcyBubyBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB3aXRoIHRoZSBnaXZlbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciBmaW5kUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzID09IG51bGwpCi0JCQlsb2FkUnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyID0gKFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpZC5lcXVhbHMocnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmdldElkKCkpKQotCQkJCXJldHVybiBydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXJzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzKCkgewotCQlpZiAocnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPi0gTG9hZGluZyAucnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAicnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyIpOwotCQkKLQkJTGlzdDxSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyPihjZi5sZW5ndGgpOwotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNmKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyKGNlKSk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyczogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyczogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyA9IGxpc3Q7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPC0gRG9uZSBsb2FkaW5nIC5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBzZXJ2ZXIgcHJvZmlsZXIgaW5zdGFuY2VzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBzZXJ2ZXIgcHJvZmlsZXIgaW5zdGFuY2VzCi0JICogICAge0BsaW5rIFNlcnZlclByb2ZpbGVyfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyUHJvZmlsZXJbXSBnZXRTZXJ2ZXJQcm9maWxlcnMoKSB7Ci0JCWlmIChzZXJ2ZXJQcm9maWxlcnMgPT0gbnVsbCkKLQkJCWxvYWRTZXJ2ZXJQcm9maWxlcnMoKTsKLQkJCi0JCVNlcnZlclByb2ZpbGVyW10gc3AgPSBuZXcgU2VydmVyUHJvZmlsZXJbc2VydmVyUHJvZmlsZXJzLnNpemUoKV07Ci0JCXNlcnZlclByb2ZpbGVycy50b0FycmF5KHNwKTsKLQkJcmV0dXJuIHNwOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHNlcnZlciBwcm9maWxlcnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZFNlcnZlclByb2ZpbGVycygpIHsKLQkJaWYgKHNlcnZlclByb2ZpbGVycyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPi0gTG9hZGluZyAuc2VydmVyUHJvZmlsZXJzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJzZXJ2ZXJQcm9maWxlcnMiKTsKLQkJCi0JCUxpc3Q8U2VydmVyUHJvZmlsZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNlcnZlclByb2ZpbGVyPihjZi5sZW5ndGgpOwotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNmKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBTZXJ2ZXJQcm9maWxlcihjZSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIiAgTG9hZGVkIHNlcnZlclByb2ZpbGVyOiAiICsgY2UuZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBzZXJ2ZXJQcm9maWxlcjogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJc2VydmVyUHJvZmlsZXJzID0gbGlzdDsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLnNlcnZlclByb2ZpbGVycyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZVByb2ZpbGluZyhJTGF1bmNoIGxhdW5jaCwgSVZNSW5zdGFsbCB2bUluc3RhbGwsIFZNUnVubmVyQ29uZmlndXJhdGlvbiB2bUNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVNlcnZlclByb2ZpbGVyW10gc3AgPSBKYXZhU2VydmVyUGx1Z2luLmdldFNlcnZlclByb2ZpbGVycygpOwotCQlpZiAoc3AgPT0gbnVsbCB8fCBzcC5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTm9Qcm9maWxlciwgbnVsbCkpOwotCQkKLQkJc3BbMF0ucHJvY2VzcyhsYXVuY2gsIHZtSW5zdGFsbCwgdm1Db25maWcsIG1vbml0b3IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0xhdW5jaENvbmZpZ3VyYXRpb25VdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0xhdW5jaENvbmZpZ3VyYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZmUxNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9MYXVuY2hDb25maWd1cmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hDb25maWd1cmF0aW9uVXRpbCB7Ci0JLyoqCi0JICogR2V0cyB0aGUgY2xhc3NwYXRoIGZyb20gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIG9mIHRoZSBnaXZlbiBzZXJ2ZXIuCi0JICogSWYgY3JlYXRlIGlzIGZhbHNlLCBpdCB3aWxsIHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogKGkuZS4gdGhlIHNlcnZlciBoYXMgbm90IGJlZW4gcnVuIGJlZm9yZSkgSWYgY3JlYXRlIGlzIHRydWUsIGl0IHdpbGwgY3JlYXRlCi0JICogYSBsYXVuY2ggY29uZmlndXJhdGlvbiBpZiBvbmUgZG9lcyBub3QgZXhpc3QuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyCi0JICogQHBhcmFtIGNyZWF0ZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBydW50aW1lIGNsYXNzcGF0aCBlbnRyaWVzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JLypwdWJsaWMgc3RhdGljIElSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGgoSVNlcnZlciBzZXJ2ZXIsIGJvb2xlYW4gY3JlYXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gc2VydmVyLmdldExhdW5jaENvbmZpZ3VyYXRpb24oY3JlYXRlLCBtb25pdG9yKTsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gSmF2YVJ1bnRpbWUuY29tcHV0ZVVucmVzb2x2ZWRSdW50aW1lQ2xhc3NwYXRoKGNvbmZpZyk7Ci0JfSovCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBjbGFzc3BhdGggb24gdGhlIGdpdmVuIHNlcnZlcidzIGxhdW5jaCBjb25maWd1cmF0aW9uLgotCSAqCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEBwYXJhbSBjbGFzc3BhdGgKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQkvKnB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDbGFzc3BhdGgoSVNlcnZlciBzZXJ2ZXIsIElSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBzZXJ2ZXIuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbih0cnVlLCBtb25pdG9yKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IGNvbmZpZy5nZXRXb3JraW5nQ29weSgpOwotCQl3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVGQVVMVF9DTEFTU1BBVEgsIGZhbHNlKTsKLQkKLQkJTGlzdCBtZW1lbnRvcyA9IG5ldyBBcnJheUxpc3QoY2xhc3NwYXRoLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwotCQkJbWVtZW50b3MuYWRkKGVudHJ5LmdldE1lbWVudG8oKSk7Ci0JCX0KLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0NMQVNTUEFUSCwgbWVtZW50b3MpOwotCQl3Yy5kb1NhdmUoKTsKLQl9Ki8KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmZWVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JKUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoQ29udGFpbmVyRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoQ29udGFpbmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lclVuYm91bmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGluZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3B5aW5nRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNyZWF0aW5nWmlwRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRlbGV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJlbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJlYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vUnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckZhY2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGVsZXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb3RBRGlyZWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTWtkaXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdFNlcnZsZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RFSkI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RKTkRJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0Q2FjdHVzVGVzdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbk1vZGlmeU1vZHVsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1Byb2ZpbGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBodHRwUG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclBvcnRJblVzZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQgKyAiLmludGVybmFsLk1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YzZjZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1jbGFzc3BhdGhDb250YWluZXJEZXNjcmlwdGlvbj1TZXJ2ZXIgTGlicmFyeQotY2xhc3NwYXRoQ29udGFpbmVyPXswfSBbezF9XQotY2xhc3NwYXRoQ29udGFpbmVyVW5ib3VuZD17MH0gW3sxfV0gKHVuYm91bmQpCi0KLWVycm9yTG9jYXRpb249SW52YWxpZCBsb2NhdGlvbi4KLWVycm9ySlJFPUludmFsaWQgSlJFLgotCi1jb3B5aW5nVGFzaz1Db3B5aW5nIGZyb20gezB9IHRvIHsxfQotZGVsZXRpbmdUYXNrPURlbGV0aW5nIHswfQotZXJyb3JDb3B5aW5nRmlsZT1FcnJvciBjb3B5aW5nIGZpbGUgezB9OiB7MX0KLWVycm9yQ3JlYXRpbmdaaXBGaWxlPUVycm9yIGNyZWF0aW5nIHppcCBmaWxlIHswfTogezF9Ci1lcnJvckRlbGV0ZT1Db3VsZCBub3QgZGVsZXRlIHByZXZpb3VzIGNvcHksIHdoaWNoIG1heSBiZSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLgotZXJyb3JSZW5hbWU9Q291bGQgbm90IHJlcGxhY2Ugd2l0aCB0ZW1wIGZpbGUgezB9LgotZXJyb3JSZWFkaW5nPUVycm9yIHJlYWRpbmcgZmlsZSB7MH0KLWVycm9yTm9SdW50aW1lPUNhbm5vdCB2ZXJpZnkgZmFjZXRzIGJlY2F1c2UgdGhlcmUgaXMgbm8gcnVudGltZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci4KLWVycm9yRmFjZXQ9UHJvamVjdCBmYWNldCB7MH0gdmVyc2lvbiB7MX0gaXMgbm90IHN1cHBvcnRlZC4KLWVycm9yRGVsZXRpbmc9Q291bGQgbm90IGRlbGV0ZSB7MH0uIE1heSBiZSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLgotZXJyb3JOb3RBRGlyZWN0b3J5PUNvdWxkIG5vdCBkZWxldGUgezB9IHNpbmNlIGl0IGlzIG5vdCBhIGRpcmVjdG9yeS4KLWVycm9yTWtkaXI9Q291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgezB9LgotCi11cGRhdGVDbGFzc3BhdGhDb250YWluZXJzPVVwZGF0aW5nIGNsYXNzcGF0aCBjb250YWluZXIgZm9yIHswfQotCi1hcnRpZmFjdFNlcnZsZXQ9U2VydmxldCB7MH0KLWFydGlmYWN0RUpCPUVKQiB7MH0KLWFydGlmYWN0Sk5EST1KTkRJIHswfQotYXJ0aWZhY3RDYWN0dXNUZXN0PUNhY3R1cyB0ZXN0IHswfQotCi1jYW5Nb2RpZnlNb2R1bGVzPVdlYiBtb2R1bGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXJ2ZXIuCi1lcnJvck5vUHJvZmlsZXI9Q291bGQgbm90IGxhdW5jaCBpbiBwcm9maWxpbmcgbW9kZSBiZWNhdXNlIG5vIHByb2ZpbGVycyBhcmUgY29uZmlndXJlZC4KLWVycm9yUHVibGlzaD1BbiBlcnJvciBvY2N1cmVkIGR1cmluZyBwdWJsaXNoaW5nLgotaHR0cFBvcnQ9SFRUUCBQb3J0Ci1lcnJvclBvcnRJblVzZT1Qb3J0IHswfSByZXF1aXJlZCBieSB7MX0gaXMgYWxyZWFkeSBpbiB1c2UuIFRoZSBzZXJ2ZXIgbWF5IGFscmVhZHkgYmUgcnVubmluZyBpbiBhbm90aGVyIHByb2Nlc3MsIG9yIGEgc3lzdGVtIHByb2Nlc3MgbWF5IGJlIHVzaW5nIHRoZSBwb3J0LiBcCi0gIFRvIHN0YXJ0IHRoaXMgc2VydmVyIHlvdSB3aWxsIG5lZWQgdG8gc3RvcCB0aGUgb3RoZXIgcHJvY2VzcyBvciBjaGFuZ2UgdGhlIHBvcnQgbnVtYmVyKHMpLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQ5OWQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0vKioKLSAqIFByb2dyZXNzIE1vbml0b3IgdXRpbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFByb2dyZXNzVXRpbCB7Ci0JLyoqCi0JICogUHJvZ3Jlc3NVdGlsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBQcm9ncmVzc1V0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmFsaWQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1wcm9ncmVzcyBtb25pdG9yIHdpdGggdGhlIGdpdmVuIGFtb3VudCBvbiB0aGUKLQkgKiBjdXJyZW50IHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSB0aWNrcyBpbnQKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFN1Yk1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIE51bGxQcm9ncmVzc01vbml0b3IpCi0JCQlyZXR1cm4gbW9uaXRvcjsKLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1wcm9ncmVzcyBtb25pdG9yIHdpdGggdGhlIGdpdmVuIGFtb3VudCBvbiB0aGUKLQkgKiBjdXJyZW50IHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSB0aWNrcyBhIG51bWJlciBvZiB0aWNrcwotCSAqIEBwYXJhbSBzdHlsZSBhIHN0eWxlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzLCBpbnQgc3R5bGUpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIE51bGxQcm9ncmVzc01vbml0b3IpCi0JCQlyZXR1cm4gbW9uaXRvcjsKLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MsIHN0eWxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0YjA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIgaW1wbGVtZW50cyBJQ2xhc3NwYXRoQ29udGFpbmVyIHsKLQkvKioKLQkgKiBUaGUgc2VydmVyIGNvbnRhaW5lciBpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfQ09OVEFJTkVSID0gSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQgKyAiLmNvbnRhaW5lciI7Ci0KLQlwcml2YXRlIElQYXRoIHBhdGg7Ci0JcHJpdmF0ZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIGRlbGVnYXRlOwotCXByaXZhdGUgSVJ1bnRpbWUgcnVudGltZTsKLQlwcml2YXRlIFN0cmluZyBydW50aW1lSWQ7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJ1bnRpbWUgY2xhc3NwYXRoIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBkZWxlZ2F0ZQotCSAqIEBwYXJhbSBydW50aW1lCi0JICogQGRlcHJlY2F0ZWQgc2hvdWxkIHVzZSB0aGUgY29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIGEgcHJvamVjdAotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyKElQYXRoIHBhdGgsIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgZGVsZWdhdGUsIElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCQl0aGlzLnJ1bnRpbWUgPSBydW50aW1lOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lIGNsYXNzcGF0aCBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBkZWxlZ2F0ZQotCSAqIEBwYXJhbSBydW50aW1lCi0JICogQHBhcmFtIHJ1bnRpbWVJZAotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHBhdGgsIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgZGVsZWdhdGUsIElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBydW50aW1lSWQpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCQl0aGlzLnJ1bnRpbWUgPSBydW50aW1lOwotCQl0aGlzLnJ1bnRpbWVJZCA9IHJ1bnRpbWVJZDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lciNnZXRDbGFzc3BhdGhFbnRyaWVzKCkKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0Q2xhc3NwYXRoRW50cmllcygpIHsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IG51bGw7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsICYmIHJ1bnRpbWUgIT0gbnVsbCkKLQkJCWVudHJpZXMgPSBkZWxlZ2F0ZS5yZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVySW1wbChwcm9qZWN0LCBydW50aW1lKTsKLQkJCi0JCWlmIChlbnRyaWVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLQkJCi0JCXJldHVybiBlbnRyaWVzOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gTkxTLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoQ29udGFpbmVyLCBydW50aW1lVHlwZS5nZXROYW1lKCksIHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gTkxTLmJpbmQoTWVzc2FnZXMuY2xhc3NwYXRoQ29udGFpbmVyVW5ib3VuZCwgTWVzc2FnZXMuY2xhc3NwYXRoQ29udGFpbmVyRGVzY3JpcHRpb24sIHJ1bnRpbWVJZCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4gSUNsYXNzcGF0aENvbnRhaW5lci5LX0FQUExJQ0FUSU9OOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyI2dldFBhdGgoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCVJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIgcmNjID0gKFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIpIG9iajsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwgJiYgIWRlbGVnYXRlLmVxdWFscyhyY2MuZGVsZWdhdGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCAmJiByY2MucnVudGltZSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiAhcnVudGltZS5lcXVhbHMocmNjLnJ1bnRpbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHJ1bnRpbWVJZCAhPSBudWxsICYmICFydW50aW1lSWQuZXF1YWxzKHJjYy5ydW50aW1lSWQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHByb2plY3QgPT0gbnVsbCAmJiByY2MucHJvamVjdCAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhcHJvamVjdC5lcXVhbHMocmNjLnByb2plY3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHBhdGggIT0gbnVsbCAmJiAhcGF0aC5lcXVhbHMocmNjLnBhdGgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTdjZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciBleHRlbmRzIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIHsKLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJaWYgKGNvbnRhaW5lclBhdGguc2VnbWVudCgwKS5lcXVhbHMoUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5TRVJWRVJfQ09OVEFJTkVSKSkgewotCQkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgZGVsZWdhdGUgPSBudWxsOwotCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBudWxsOwotCQkJCVN0cmluZyBydW50aW1lSWQgPSBudWxsOwotCQkJCWlmIChjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpID4gMikgewotCQkJCQlkZWxlZ2F0ZSA9IEphdmFTZXJ2ZXJQbHVnaW4uZmluZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcihjb250YWluZXJQYXRoLnNlZ21lbnQoMSkpOwotCQkJCQkKLQkJCQkJcnVudGltZUlkID0gY29udGFpbmVyUGF0aC5zZWdtZW50KDIpOwotCQkJCQlpZiAocnVudGltZUlkICE9IG51bGwpCi0JCQkJCQlydW50aW1lID0gU2VydmVyQ29yZS5maW5kUnVudGltZShydW50aW1lSWQpOwotCQkJCX0KLQkJCQlSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyKHByb2plY3QuZ2V0UHJvamVjdCgpLCBjb250YWluZXJQYXRoLCBkZWxlZ2F0ZSwgcnVudGltZSwgcnVudGltZUlkKTsKLQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgbmV3IElKYXZhUHJvamVjdFtdIHtwcm9qZWN0fSwgbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7Y29udGFpbmVyfSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIjZ2V0RGVzY3JpcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gTWVzc2FnZXMuY2xhc3NwYXRoQ29udGFpbmVyRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyI2NhblVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXIoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyI3JlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXJTdWdnZXN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJaWYgKGNvbnRhaW5lclBhdGguc2VnbWVudCgwKS5lcXVhbHMoUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5TRVJWRVJfQ09OVEFJTkVSKSkgewotCQkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgZGVsZWdhdGUgPSBudWxsOwotCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBudWxsOwotCQkJCWlmIChjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpID4gMikgewotCQkJCQlkZWxlZ2F0ZSA9IEphdmFTZXJ2ZXJQbHVnaW4uZmluZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcihjb250YWluZXJQYXRoLnNlZ21lbnQoMSkpOwotCQkJCQlTdHJpbmcgcnVudGltZUlkID0gY29udGFpbmVyUGF0aC5zZWdtZW50KDIpOwotCQkJCQlpZiAocnVudGltZUlkICE9IG51bGwpCi0JCQkJCQlydW50aW1lID0gU2VydmVyQ29yZS5maW5kUnVudGltZShydW50aW1lSWQpOwotCQkJCQlkZWxlZ2F0ZS5yZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKHJ1bnRpbWUsIGNvbnRhaW5lclN1Z2dlc3Rpb24uZ2V0Q2xhc3NwYXRoRW50cmllcygpKTsKLQkJCQkJLy9KYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgbmV3IElKYXZhUHJvamVjdFtdIHsgcHJvamVjdCB9LAotCQkJCQkvLwkJbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7IGNvbnRhaW5lclN1Z2dlc3Rpb24gfSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCXVwZGF0ZUNsYXNzcGF0aChydW50aW1lLCBjb250YWluZXJQYXRoLCBjb250YWluZXJTdWdnZXN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlQ2xhc3NwYXRoKGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsIGZpbmFsIElQYXRoIGNvbnRhaW5lclBhdGgsIGZpbmFsIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyU3VnZ2VzdGlvbikgewotCQljbGFzcyBVcGRhdGVDbGFzc3BhdGhKb2IgZXh0ZW5kcyBKb2IgewotCQkJcHVibGljIFVwZGF0ZUNsYXNzcGF0aEpvYigpIHsKLQkJCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy51cGRhdGVDbGFzc3BhdGhDb250YWluZXJzLCBydW50aW1lLmdldE5hbWUoKSkpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwotCQkJfQotCi0JCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCQlMaXN0PElKYXZhUHJvamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUphdmFQcm9qZWN0PigpOwotCQkJCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSVByb2plY3QgcHJvamVjdCA6IHByb2plY3RzKSB7Ci0JCQkJCQlpZiAocHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWlmICghcHJvamVjdC5pc05hdHVyZUVuYWJsZWQoSmF2YUNvcmUuTkFUVVJFX0lEKSkKLQkJCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCQkKLQkJCQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCQkJCQkKLQkJCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjZSA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCQkJCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBjcCA6IGNlKSB7Ci0JCQkJCQkJCQlpZiAoY3AuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKLQkJCQkJCQkJCQlpZiAoY29udGFpbmVyUGF0aC5pc1ByZWZpeE9mKGNwLmdldFBhdGgoKSkpCi0JCQkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQ2xhc3NwYXRoIGNoYW5nZSBvbjogIiArIHByb2plY3QgKyAiICIgKyBmb3VuZCk7Ci0JCQkJCQkJCQotCQkJCQkJCQlpZiAoZm91bmQpCi0JCQkJCQkJCQlsaXN0LmFkZChqYXZhUHJvamVjdCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHVwZGF0ZSBjbGFzc3BhdGggY29udGFpbmVyIiwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQkJaWYgKHNpemUgPiAwKSB7Ci0JCQkJCUlKYXZhUHJvamVjdFtdIGphdmFQcm9qZWN0cyA9IG5ldyBJSmF2YVByb2plY3Rbc2l6ZV07Ci0JCQkJCWxpc3QudG9BcnJheShqYXZhUHJvamVjdHMpOwotCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyW10gY29udGFpbmVycyA9IG5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW3NpemVdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJCWNvbnRhaW5lcnNbaV0gPSBjb250YWluZXJTdWdnZXN0aW9uOwotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCUphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcihjb250YWluZXJQYXRoLCBqYXZhUHJvamVjdHMsIGNvbnRhaW5lcnMsIG1vbml0b3IpOwotCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJCQlyZXR1cm4gam1lLmdldFN0YXR1cygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9Ci0JCVVwZGF0ZUNsYXNzcGF0aEpvYiBqb2IgPSBuZXcgVXBkYXRlQ2xhc3NwYXRoSm9iKCk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciNnZXRDb21wYXJpc29uSUQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb21wYXJpc29uSUQoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKGNvbnRhaW5lclBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIGNvbnRhaW5lclBhdGgudG9Qb3J0YWJsZVN0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhYWZlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBTdXBwb3J0IGZvciBhbGwgc2VydmVyIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNsYXNzcGF0aFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIgaW1wbGVtZW50cyBJQ2xhc3NwYXRoUHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgV0VCX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCJqc3Qud2ViIik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBFSkJfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoImpzdC5lamIiKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEVBUl9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgianN0LmVhciIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgVVRJTElUWV9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgianN0LnV0aWxpdHkiKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IENPTk5FQ1RPUl9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgianN0LmNvbm5lY3RvciIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgQVBQX0NMSUVOVF9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgianN0LmFwcGNsaWVudCIpOwotCi0JcHJpdmF0ZSBJUnVudGltZUNvbXBvbmVudCByYzsKLQotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIoSVJ1bnRpbWVDb21wb25lbnQgcmMpIHsKLQkJdGhpcy5yYyA9IHJjOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENsYXNzcGF0aEVudHJpZXMoSVByb2plY3RGYWNldFZlcnNpb24gZnYpIHsKLQkJSVByb2plY3RGYWNldCBwZiA9IGZ2LmdldFByb2plY3RGYWNldCgpOwotCQlpZiAocGYgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYgKHBmLmVxdWFscyhXRUJfRkFDRVQpIHx8IHBmLmVxdWFscyhFSkJfRkFDRVQpIHx8IHBmLmVxdWFscyhFQVJfRkFDRVQpIHx8Ci0JCQkJcGYuZXF1YWxzKFVUSUxJVFlfRkFDRVQpIHx8IHBmLmVxdWFscyhDT05ORUNUT1JfRkFDRVQpIHx8IHBmLmVxdWFscyhBUFBfQ0xJRU5UX0ZBQ0VUKSkgewotCQkJU3RyaW5nIHJ1bnRpbWVUeXBlSWQgPSByYy5nZXRQcm9wZXJ0eSgidHlwZS1pZCIpOwotCQkJU3RyaW5nIHJ1bnRpbWVJZCA9IHJjLmdldFByb3BlcnR5KCJpZCIpOwotCQkJaWYgKHJ1bnRpbWVUeXBlSWQgPT0gbnVsbCB8fCBydW50aW1lSWQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgcmNwdyA9IEphdmFTZXJ2ZXJQbHVnaW4uZmluZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckJ5U3VwcG9ydChydW50aW1lVHlwZUlkKTsKLQkJCWlmIChyY3B3ICE9IG51bGwpIHsKLQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5TRVJWRVJfQ09OVEFJTkVSKTsKLQkJCQlwYXRoID0gcGF0aC5hcHBlbmQocmNwdy5nZXRJZCgpKS5hcHBlbmQocnVudGltZUlkKTsKLQkJCQlJQ2xhc3NwYXRoRW50cnkgY3BlbnRyeSA9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KHBhdGgpOwotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNwZW50cnkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElDbGFzc3BhdGhQcm92aWRlci5jbGFzcyB9OwotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlLCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQkJSVJ1bnRpbWVDb21wb25lbnQgcmMgPSAoSVJ1bnRpbWVDb21wb25lbnQpIGFkYXB0YWJsZTsKLQkJCXJldHVybiBuZXcgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKHJjKTsKLQkJfQotCi0JCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQkJcmV0dXJuIEFEQVBURVJfVFlQRVM7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmY2Q2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lIHRhcmdldCBoYW5kbGVyLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcmRlci4KLQkgKgotCSAqIEByZXR1cm4gdGhlIG9yZGVyCi0JICovCi0JcHVibGljIGludCBnZXRPcmRlcigpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm9yZGVyIik7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChvKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVHlwZUlkcygpIHsKLQkJdHJ5IHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkcyIpLCAiLCIpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKLQkJCQkJbGlzdC5hZGQoc3RyLnRyaW0oKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocyk7Ci0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBwYXJzZSBydW50aW1lIHR5cGUgaWRzOiAiICsgZWxlbWVudCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIHJlc291cmNlIHR5cGUgKGdpdmVuIGJ5IHRoZQotCSAqIGlkKSBjYW4gYmUgb3BlbmVkIHdpdGggdGhpcyBlZGl0b3IuIFRoaXMgcmVzdWx0IGlzIGJhc2VkIG9uCi0JICogdGhlIHJlc3VsdCBvZiB0aGUgZ2V0U2VydmVyUmVzb3VyY2VzKCkgbWV0aG9kLgotCSAqCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlIGEgcnVudGltZSB0eXBlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSdW50aW1lVHlwZShJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJaWYgKHJ1bnRpbWVUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBwb3J0c1J1bnRpbWVUeXBlKHJ1bnRpbWVUeXBlLmdldElkKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIHJlc291cmNlIHR5cGUgKGdpdmVuIGJ5IHRoZQotCSAqIGlkKSBjYW4gYmUgb3BlbmVkIHdpdGggdGhpcyBlZGl0b3IuIFRoaXMgcmVzdWx0IGlzIGJhc2VkIG9uCi0JICogdGhlIHJlc3VsdCBvZiB0aGUgZ2V0U2VydmVyUmVzb3VyY2VzKCkgbWV0aG9kLgotCSAqCi0JICogQHBhcmFtIGlkIGEgcnVudGltZSB0eXBlIGlkCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSdW50aW1lVHlwZShTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCVN0cmluZ1tdIHMgPSBnZXRSdW50aW1lVHlwZUlkcygpOwotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJZm9yIChTdHJpbmcgc3MgOiBzKSB7Ci0JCQlpZiAoc3MuZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBzcy5sZW5ndGgoKSAmJiBpZC5zdGFydHNXaXRoKHNzLnN1YnN0cmluZygwLCBzcy5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhzcykpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogTG9hZHMgdGhlIGRlbGVnYXRlIGNsYXNzLgotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGUgPSAoUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQlkZWxlZ2F0ZS5pbml0aWFsaXplKGdldElkKCkpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlI3Jlc29sdmVDbGFzc3BhdGhDb250YWluZXJJbXBsKElQcm9qZWN0LCBJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwoSVByb2plY3QgcHJvamVjdCwgSVJ1bnRpbWUgcnVudGltZSkgewotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5yZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVySW1wbChwcm9qZWN0LCBydW50aW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSNyZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElSdW50aW1lLCBJQ2xhc3NwYXRoRW50cnlbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElSdW50aW1lIHJ1bnRpbWUsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWdldERlbGVnYXRlKCkucmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShydW50aW1lLCBlbnRyaWVzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlI2hhc1J1bnRpbWVDbGFzc3BhdGhDaGFuZ2VkKElSdW50aW1lKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1J1bnRpbWVDbGFzc3BhdGhDaGFuZ2VkKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLmhhc1J1bnRpbWVDbGFzc3BhdGhDaGFuZ2VkKHJ1bnRpbWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlclsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRQcm92aWRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRQcm92aWRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OGU0ZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzLlJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGU7Ci0vKioKLSAqIEEgcnVudGltZSBjb21wb25lbnQgcHJvdmlkZXIgY2FuIHByb3ZpZGUgYWRkaXRpb25hbCBydW50aW1lIGNvbXBvbmVudHMgZm9yIGEgZmFjZXQgcnVudGltZS4KLSAqIFRoaXMgcHJvdmlkZXIgaXMgc2NvcGVkIGJ5IHJ1bnRpbWUgdHlwZSBhbmQgbWF5IHByb3ZpZGUgY29tcG9uZW50cyBmb3IgbXVsdGlwbGUKLSAqIHJ1bnRpbWUgaW5zdGFuY2VzLgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5pbnRlcm5hbFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICogQHBsYW5uZWRmb3IgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZSBleHRlbmRzIFJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUgewotCS8vIG5vdGhpbmcgYWRkZWQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQyNGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlciB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFJ1bnRpbWVDb21wb25lbnRQcm92aWRlckRlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJ1bnRpbWUgY29tcG9uZW50IGhhbmRsZXIuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVHlwZUlkcygpIHsKLQkJdHJ5IHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkcyIpLCAiLCIpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKLQkJCQkJbGlzdC5hZGQoc3RyLnRyaW0oKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocyk7Ci0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBwYXJzZSBydW50aW1lIHR5cGUgaWRzOiAiICsgZWxlbWVudCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIHJlc291cmNlIHR5cGUgKGdpdmVuIGJ5IHRoZQotCSAqIGlkKSBjYW4gYmUgb3BlbmVkIHdpdGggdGhpcyBlZGl0b3IuIFRoaXMgcmVzdWx0IGlzIGJhc2VkIG9uCi0JICogdGhlIHJlc3VsdCBvZiB0aGUgZ2V0U2VydmVyUmVzb3VyY2VzKCkgbWV0aG9kLgotCSAqCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlIGEgcnVudGltZSB0eXBlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSdW50aW1lVHlwZShJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJaWYgKHJ1bnRpbWVUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBpZCA9IHJ1bnRpbWVUeXBlLmdldElkKCk7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nW10gcyA9IGdldFJ1bnRpbWVUeXBlSWRzKCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlmb3IgKFN0cmluZyBzcyA6IHMpIHsKLQkJCWlmIChzcy5lbmRzV2l0aCgiKiIpKSB7Ci0JCQkJaWYgKGlkLmxlbmd0aCgpID49IHNzLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgoc3Muc3Vic3RyaW5nKDAsIHNzLmxlbmd0aCgpIC0gMSkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoaWQuZXF1YWxzKHNzKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBMb2FkcyB0aGUgZGVsZWdhdGUgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIFJ1bnRpbWVDb21wb25lbnRQcm92aWRlckRlbGVnYXRlIGdldERlbGVnYXRlKCkgewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUjZ2V0UnVudGltZUNvbXBvbmVudHMoSVJ1bnRpbWUpCi0JICovCi0JcHVibGljIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGdldENvbXBvbmVudHMoSVJ1bnRpbWUgcnVudGltZSkgewotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5nZXRSdW50aW1lQ29tcG9uZW50cyhydW50aW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlclsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVGYWNldE1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUZhY2V0TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmNkMDQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUZhY2V0TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZUZhY2V0TWFwcGluZyB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lIGZhY2V0IG1hcHBpbmcuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgUnVudGltZUZhY2V0TWFwcGluZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lVHlwZUlkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJ1bnRpbWVUeXBlSWQiKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVDb21wb25lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgicnVudGltZS1jb21wb25lbnQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlJ1bnRpbWVGYWNldE1hcHBpbmdbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJQcm9maWxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJQcm9maWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWIzMDAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHJvZmlsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1SdW5uZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQcm9maWxlckRlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclByb2ZpbGVyIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgcHJvZmlsZXIuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyUHJvZmlsZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQkvKgotCSAqIExvYWRzIHRoZSBkZWxlZ2F0ZSBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCWlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChTZXJ2ZXJQcm9maWxlckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBTd2l0Y2ggdG8gbmV3IEFQSSB2aWEgVE9ETwotCSAqIEByZXR1cm4gdGhlIFZNIGFyZ3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZNQXJncygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvY2VzcyhJTGF1bmNoIGxhdW5jaCwgSVZNSW5zdGFsbCB2bUluc3RhbGwsIFZNUnVubmVyQ29uZmlndXJhdGlvbiB2bUNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlTZXJ2ZXJQcm9maWxlckRlbGVnYXRlIGRlbCA9IGdldERlbGVnYXRlKCk7Ci0JCQlpZiAoZGVsICE9IG51bGwpCi0JCQkJZGVsLnByb2Nlc3MobGF1bmNoLCB2bUluc3RhbGwsIHZtQ29uZmlnLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgY2UpOwotCQkJdGhyb3cgY2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNlcnZlclByb2ZpbGVyWyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDcwYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCS8qKgotCSAqIENvbmZpZyB0cmFjaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTkZJRyA9IDA7Ci0JLyoqCi0JICogV2FybmluZyB0cmFjaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFdBUk5JTkcgPSAxOwotCS8qKgotCSAqIFNldmVyZSB0cmFjaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNFVkVSRSA9IDI7Ci0JLyoqCi0JICogRmluZXN0IHRyYWNpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVNUID0gMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBQVUJMSVNISU5HID0gNDsKLQotCXByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IGxvZ2dlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotCS8qKgotCSAqIFRyYWNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBUcmFjZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgewotCQlUcmFjZS50cmFjZShsZXZlbCwgcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIFN0cmluZwotCSAqIEBwYXJhbSB0IFRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChsZXZlbCA9PSBTRVZFUkUpIHsKLQkJCWlmICghbG9nZ2VkLmNvbnRhaW5zKHMpKSB7Ci0JCQkJSmF2YVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCBzLCB0KSk7Ci0JCQkJbG9nZ2VkLmFkZChzKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCFKYXZhU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybjsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbihKYXZhU2VydmVyUGx1Z2luLlBMVUdJTl9JRCArICIgIiArIHMpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1hNTE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZjE0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1hNTE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLS8qKgotICogQSBNZW1lbnRvIGlzIGEgY2xhc3MgaW5kZXBlbmRlbnQgY29udGFpbmVyIGZvciBwZXJzaXN0ZW5jZQotICogaW5mby4gIEl0IGlzIGEgcmVmbGVjdGlvbiBvZiAzIHN0b3JhZ2UgcmVxdWlyZW1lbnRzLgotICoKLSAqIDEpICAgV2UgbmVlZCB0aGUgYWJpbGl0eSB0byBwZXJzaXN0IGFuIG9iamVjdCBhbmQgcmVzdG9yZSBpdC4gIAotICogMikgICBUaGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtYXkgYmUgYWJzZW50LiAgSWYgc28gd2Ugd291bGQgCi0gKiAgICAgIGxpa2UgdG8gc2tpcCB0aGUgb2JqZWN0IGFuZCBrZWVwIHJlYWRpbmcuIAotICogMykgICBUaGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtYXkgY2hhbmdlLiAgSWYgc28gdGhlIG5ldyBjbGFzcyAKLSAqICAgICAgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIHBlcnNpc3RlbmNlIGluZm8uCi0gKgotICogV2UgY291bGQgYXNrIHRoZSBvYmplY3RzIHRvIHNlcmlhbGl6ZSB0aGVtc2VsdmVzIGludG8gYW4gCi0gKiBPYmplY3RPdXRwdXRTdHJlYW0sIERhdGFPdXRwdXRTdHJlYW0sIG9yIEhhc2h0YWJsZS4gIEhvd2V2ZXIgCi0gKiBhbGwgb2YgdGhlc2UgYXBwcm9hY2hlcyBmYWlsIHRvIG1lZXQgdGhlIHNlY29uZCByZXF1aXJlbWVudC4KLSAqCi0gKiBNZW1lbnRvIHN1cHBvcnRzIGJpbmFyeSBwZXJzaXN0YW5jZSB3aXRoIGEgdmVyc2lvbiBJRC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTE1lbWVudG8gaW1wbGVtZW50cyBJTWVtZW50byB7Ci0JcHJpdmF0ZSBEb2N1bWVudCBmYWN0b3J5OwotCXByaXZhdGUgRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogQW5zd2VyIGEgbWVtZW50byBmb3IgdGhlIGRvY3VtZW50IGFuZCBlbGVtZW50LiAgRm9yIHNpbXBsaWNpdHkKLQkgKiB5b3Ugc2hvdWxkIHVzZSBjcmVhdGVSZWFkUm9vdCBhbmQgY3JlYXRlV3JpdGVSb290IHRvIGNyZWF0ZSB0aGUgaW5pdGlhbAotCSAqIG1lbWVudG9zIG9uIGEgZG9jdW1lbnQuCi0JICovCi0JcHJpdmF0ZSBYTUxNZW1lbnRvKERvY3VtZW50IGRvYywgRWxlbWVudCBlbCkgewotCQlmYWN0b3J5ID0gZG9jOwotCQllbGVtZW50ID0gZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNjcmVhdGVDaGlsZChTdHJpbmcpCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIERvY3VtZW50IGZyb20gYSBSZWFkZXIgYW5kIGFuc3dlciBhIHJvb3QgbWVtZW50byBmb3IgcmVhZGluZyAKLQkgKiBhIGRvY3VtZW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIFhNTE1lbWVudG8gY3JlYXRlUmVhZFJvb3QoSW5wdXRTdHJlYW0gaW4pIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlkb2N1bWVudCA9IHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsKLQkJCU5vZGUgbm9kZSA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZG9jdW1lbnQsIChFbGVtZW50KSBub2RlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciB3cml0aW5nIGEgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHR5cGUgYSB0eXBlCi0JICogQHJldHVybiBhIG1lbWVudG8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNTE1lbWVudG8gY3JlYXRlV3JpdGVSb290KFN0cmluZyB0eXBlKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50OwotCQl0cnkgewotCQkJZG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgZWxlbWVudCk7ICAgICAgICAgICAgCi0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBJTWVtZW50byBnZXRDaGlsZChTdHJpbmcgdHlwZSkgewotCQkvLyBHZXQgdGhlIG5vZGVzLgotCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCi0JCS8vIEZpbmQgdGhlIGZpcnN0IG5vZGUgd2hpY2ggaXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUuCi0JCWZvciAoaW50IG5YID0gMDsgblggPCBzaXplOyBuWCArKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShuWCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQyID0gKEVsZW1lbnQpbm9kZTsKLQkJCQlpZiAoZWxlbWVudDIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHModHlwZSkpCi0JCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBlbGVtZW50Mik7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gQSBjaGlsZCB3YXMgbm90IGZvdW5kLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gW10gZ2V0Q2hpbGRyZW4oU3RyaW5nIHR5cGUpIHsKLQkJLy8gR2V0IHRoZSBub2Rlcy4KLQkJTm9kZUxpc3Qgbm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBuZXcgSU1lbWVudG9bMF07Ci0JCi0JCS8vIEV4dHJhY3QgZWFjaCBub2RlIHdpdGggZ2l2ZW4gdHlwZS4KLQkJTGlzdDxFbGVtZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxFbGVtZW50PihzaXplKTsKLQkJZm9yIChpbnQgblggPSAwOyBuWCA8IHNpemU7IG5YICsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5YKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgZWxlbWVudDIgPSAoRWxlbWVudClub2RlOwotCQkJCWlmIChlbGVtZW50Mi5nZXROb2RlTmFtZSgpLmVxdWFscyh0eXBlKSkKLQkJCQkJbGlzdC5hZGQoZWxlbWVudDIpOwotCQkJfQotCQl9Ci0JCi0JCS8vIENyZWF0ZSBhIG1lbWVudG8gZm9yIGVhY2ggbm9kZS4KLQkJc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlJTWVtZW50byBbXSByZXN1bHRzID0gbmV3IElNZW1lbnRvW3NpemVdOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHNpemU7IHggKyspIHsKLQkJCXJlc3VsdHNbeF0gPSBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBsaXN0LmdldCh4KSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAKLQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBhIG1lbWVudG8gZnJvbSB0aGUgZ2l2ZW4gZmlsZW5hbWUuCi0JICoKLQkgKiBAcGFyYW0gZmlsZW5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEByZXR1cm4gYSBtZW1lbnRvCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWVtZW50byBsb2FkTWVtZW50byhTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSkpOwotCQkJcmV0dXJuIFhNTE1lbWVudG8uY3JlYXRlUmVhZFJvb3QoaW4pOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGlzIE1lbWVudG8gdG8gYSBXcml0ZXIuCi0JICogCi0JICogQHBhcmFtIG9zIGFuIG91dHB1dCBzdHJlYW0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zKTsKLQkJU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZmFjdG9yeSk7Ci0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsICJVVEYtOCIpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59aW5kZW50LWFtb3VudCIsICIyIik7Ci0JCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgKElPRXhjZXB0aW9uKSAobmV3IElPRXhjZXB0aW9uKCkuaW5pdENhdXNlKGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtZW1lbnRvIHRvIHRoZSBnaXZlbiBmaWxlLgotCSAqCi0JICogQHBhcmFtIGZpbGVuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlVG9GaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZU91dHB1dFN0cmVhbSB3ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXcgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSk7Ci0JCQlzYXZlKHcpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl3LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTGF1bmNoYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTGF1bmNoYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTJmNDQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL0NhY3R1c0xhdW5jaGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYW5pZWwgUi4gU29tZXJmaWVsZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWN0dXNMYXVuY2hhYmxlIHsKLQlwcml2YXRlIFN0cmluZyBmUHJvamVjdG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzTmFtZTsKLQlwcml2YXRlIFN0cmluZyBmVGVzdE5hbWU7Ci0JcHJpdmF0ZSBVUkwgZkNhY3R1c1VSTDsKLQotCXB1YmxpYyBDYWN0dXNMYXVuY2hhYmxlKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHRlc3ROYW1lLCBVUkwgY2FjdHVzVVJMKSB7Ci0JCWZQcm9qZWN0bmFtZSA9IHByb2plY3ROYW1lOwotCQlmQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQlmVGVzdE5hbWUgPSB0ZXN0TmFtZTsKLQkJZkNhY3R1c1VSTCA9IGNhY3R1c1VSTDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRlc3RDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBmQ2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7Ci0JCXJldHVybiBmVGVzdE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0bmFtZTsKLQl9Ci0KLQlwdWJsaWMgVVJMIGdldENhY3R1c1VSTCgpIHsKLQkJcmV0dXJuIGZDYWN0dXNVUkw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL0NhY3R1c0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL0NhY3R1c0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4ZjZmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVVSTFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5MYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2FjdHVzTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSBleHRlbmRzIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgewotCXB1YmxpYyBPYmplY3QgZ2V0TGF1bmNoYWJsZShJU2VydmVyIHNlcnZlciwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2R1bGVBcnRpZmFjdCBpbnN0YW5jZW9mIFdlYlRlc3RhYmxlUmVzb3VyY2UpIHsKLQkJCVdlYlRlc3RhYmxlUmVzb3VyY2UgcmVzb3VyY2UgPSAoV2ViVGVzdGFibGVSZXNvdXJjZSkgbW9kdWxlQXJ0aWZhY3Q7Ci0JCQlVUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpIHNlcnZlci5nZXRBZGFwdGVyKElVUkxQcm92aWRlci5jbGFzcykpCi0JCQkJCS5nZXRNb2R1bGVSb290VVJMKHJlc291cmNlLmdldE1vZHVsZSgpKTsKLQkJCQotCQkJU3RyaW5nIHVybFN0cmluZyA9IHVybC50b1N0cmluZygpOwotCQkJaWYgKHVybFN0cmluZy5lbmRzV2l0aCgiLyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcuc3Vic3RyaW5nKDAsIHVybFN0cmluZy5sZW5ndGgoKSAtIDEpKTsKLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIGxhdW5jaGFibGUiLCBlKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBDYWN0dXNMYXVuY2hhYmxlKHJlc291cmNlLmdldFByb2plY3ROYW1lKCksCi0JCQkJCXJlc291cmNlLmdldENsYXNzTmFtZSgpLCByZXNvdXJjZS5nZXRUZXN0TmFtZSgpLCB1cmwpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhMjgxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYW5pZWwgUi4gU29tZXJmaWVsZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2FjdHVzTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfVEVTVF9DQVNFX1RZUEUgPSAib3JnLmFwYWNoZS5jYWN0dXMuU2VydmxldFRlc3RDYXNlIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9NRVRIT0QgPSAic3VpdGUiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0xBU1NfTkFNRSA9ICJqdW5pdC5mcmFtZXdvcmsuVGVzdCI7Ci0KLQlwdWJsaWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSAiIjsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElNZXRob2QpIHsKLQkJCUlNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIG9iajsKLQkJCW1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCW9iaiA9IG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBvYmopLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCVN0cmluZyB0ZXN0Q2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lRm9yVHlwZShyZXNvdXJjZSk7Ci0JCQlpZiAodGVzdENsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gbmV3IFdlYlRlc3RhYmxlUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSksIGZhbHNlLAotCQkJCQkJcHJvamVjdE5hbWUsIHRlc3RDbGFzc05hbWUsIG1ldGhvZE5hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWVGb3JUeXBlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYgKCEiamF2YSIuZXF1YWxzKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSkgJiYgISJjbGFzcyIuZXF1YWxzKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCQlpZiAocGF0aCA9PSBudWxsIHx8ICFwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwcm9qZWN0LmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQkJaWYgKCFqYXZhUHJvamVjdC5pc09wZW4oKSkKLQkJCQlqYXZhUHJvamVjdC5vcGVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCi0JCQkvLyBvdXRwdXQgbG9jYXRpb24gbWF5IG5vdCBiZSBvbiBjbGFzc3BhdGgKLQkJCUlQYXRoIG91dHB1dFBhdGggPSBqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJaWYgKG91dHB1dFBhdGggIT0gbnVsbAotCQkJCQkmJiAiY2xhc3MiLmVxdWFscyhwYXRoLmdldEZpbGVFeHRlbnNpb24oKSkgJiYgb3V0cHV0UGF0aC5pc1ByZWZpeE9mKHBhdGgpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgY291bnQgPSBvdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpOwotCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoY291bnQpOwotCQkJfQotCQkJCi0JCQkvLyByZW1vdmUgaW5pdGlhbCBwYXJ0IG9mIGNsYXNzcGF0aAotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NQYXRoRW50cnkgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJCWlmIChjbGFzc1BhdGhFbnRyeSAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBjbGFzc1BhdGhFbnRyeS5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJSVBhdGggY2xhc3NQYXRoID0gY2xhc3NQYXRoRW50cnlbaV0uZ2V0UGF0aCgpOwotCQkJCQlpZiAoY2xhc3NQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQkJCWludCBjb3VudCA9IGNsYXNzUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoY291bnQpOwotCQkJCQkJaSArPSBzaXplOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBnZXQgamF2YSBlbGVtZW50Ci0JCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBqYXZhUHJvamVjdC5maW5kRWxlbWVudChwYXRoKTsKLQkJCUlUeXBlW10gdHlwZXMgPSBnZXRUeXBlcyhqYXZhRWxlbWVudCk7Ci0JCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJCWludCBzaXplMiA9IHR5cGVzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKLQkJCQkJaWYgKGhhc1N1cGVyY2xhc3ModHlwZXNbaV0pIHx8IGhhc1N1aXRlTWV0aG9kKHR5cGVzW2ldKSkKLQkJCQkJCXJldHVybiB0eXBlc1tpXS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJVbmV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1N1aXRlTWV0aG9kKElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJTWV0aG9kW10gbWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOwotCQlpbnQgc2l6ZSA9IG1ldGhvZHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpLmxlbmd0aCA9PSAwICYmIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhTVUlURV9NRVRIT0QpKSB7Ci0JCQkJU3RyaW5nIHJldHVyblR5cGUgPSBnZXRGdWxseVF1YWxpZmllZFR5cGVGb3JNYW5nbGVkVHlwZShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCB0eXBlKTsKLQkJCQlpZiAoVEVTVF9DTEFTU19OQU1FLmVxdWFscyhyZXR1cm5UeXBlKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElUeXBlW10gZ2V0VHlwZXMoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgIT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50KS5nZXRBbGxUeXBlcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1N1cGVyY2xhc3MoSVR5cGUgdHlwZSkgewotCQl0cnkgewotCQkJSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobnVsbCk7Ci0JCQlJVHlwZVtdIHN1cGVyQ2xhc3NlcyA9IGhpZXJhcmNoeS5nZXRBbGxTdXBlcmNsYXNzZXModHlwZSk7Ci0JCQlpbnQgc2l6ZSA9IHN1cGVyQ2xhc3Nlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChTRVJWTEVUX1RFU1RfQ0FTRV9UWVBFLmVxdWFscyhzdXBlckNsYXNzZXNbaV0uZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlNb2R1bGUgZGVwbG95YWJsZSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoImpzdC53ZWIiKSkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlkZXBsb3lhYmxlID0gKElNb2R1bGUpIG5leHQ7Ci0JCQkJaWYgKGRlcGxveWFibGUuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQkJcmV0dXJuIGRlcGxveWFibGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZUZvck1hbmdsZWRUeXBlKFN0cmluZyB0eXBlLAotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXR5cGUgPSBTaWduYXR1cmUudG9TdHJpbmcodHlwZSk7Ci0JCXJldHVybiBnZXRGdWxseVF1YWxpZmllZFR5cGVGb3JUeXBlKHR5cGUsIGRlY2xhcmluZ1R5cGUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGVGb3JUeXBlKFN0cmluZyB0eXBlLCBJVHlwZSBkZWNsYXJpbmdUeXBlKQotCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdW10gcmVzb2x2ZWRUeXBlcyA9IGRlY2xhcmluZ1R5cGUucmVzb2x2ZVR5cGUodHlwZSk7Ci0JCS8vIEFyZSB0aGVyZSBsZWdpdCBjYXNlcyB3aGVyZSB0aGlzIHdvdWxkIG5vdCBiZSB0aGUgY2FzZT8gV2UgbWlnaHQgbmVlZCB0byBjaGVjawotCQkvLyBmb3IgdGhpcyBhbmQgYm9tYiBvdXQgaWYgdGhlIHR5cGUgY2Fubm90IGJlIHVuYW1iaWdpb3VzbHkgcmVzb2x2ZWQKLQkJaWYgKHJlc29sdmVkVHlwZXMubGVuZ3RoICE9IDEpCi0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiVGhlIHR5cGUgY2Fubm90IGJlIHVuYW1iaWdpb3VzbHkgcmVzb2x2ZWQuIE5lZWQgdG8gaGFuZGxlIHRoaXMgY2FzZSIpOwotCQlTdHJpbmdbXSByZXNvbHZlZFR5cGUgPSByZXNvbHZlZFR5cGVzWzBdOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc29sdmVkVHlwZS5sZW5ndGggLSAxOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQocmVzb2x2ZWRUeXBlW2ldKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJy4nKTsKLQkJfQotCi0JCWJ1ZmZlci5hcHBlbmQocmVzb2x2ZWRUeXBlW3Jlc29sdmVkVHlwZS5sZW5ndGggLSAxXSk7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9TZXJ2bGV0VGVzdENhc2VQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvU2VydmxldFRlc3RDYXNlUHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczNzA0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9TZXJ2bGV0VGVzdENhc2VQcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhbmllbCBSLiBTb21lcmZpZWxkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLmNhY3R1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRUZXN0Q2FzZVByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0lTX1NFUlZMRVRfVEVTVF9DQVNFID0gImlzU2VydmxldFRlc3RDYXNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TVVBFUkNMQVNTX05BTUUgPSAib3JnLmFwYWNoZS5jYWN0dXMuU2VydmxldFRlc3RDYXNlIjsKLQotCXB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBudWxsOwotCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlqYXZhRWxlbWVudCA9IChJSmF2YUVsZW1lbnQpICgoSUFkYXB0YWJsZSkgcmVjZWl2ZXIpLmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKLQkJfQotCQlpZiAoamF2YUVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKCFqYXZhRWxlbWVudC5leGlzdHMoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QKLQkJCQl8fCBqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290Ci0JCQkJfHwgamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoamF2YUVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKFBST1BFUlRZX0lTX1NFUlZMRVRfVEVTVF9DQVNFLmVxdWFscyhtZXRob2QpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gaXNTZXJ2bGV0VGVzdENhc2UoamF2YUVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTZXJ2bGV0VGVzdENhc2UoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJSVR5cGUgdGVzdFR5cGUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQ7Ci0JCQkJdGVzdFR5cGUgPSBjdS5nZXRUeXBlKFNpZ25hdHVyZS5nZXRRdWFsaWZpZXIoY3UuZ2V0RWxlbWVudE5hbWUoKSkpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNsYXNzRmlsZSkKLQkJCQl0ZXN0VHlwZSA9ICgoSUNsYXNzRmlsZSkgZWxlbWVudCkuZ2V0VHlwZSgpOwotCQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKQotCQkJCXRlc3RUeXBlID0gKElUeXBlKSBlbGVtZW50OwotCQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIpCi0JCQkJdGVzdFR5cGUgPSAoKElNZW1iZXIpIGVsZW1lbnQpLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJCQotCQkJaWYgKHRlc3RUeXBlICE9IG51bGwgJiYgdGVzdFR5cGUuZXhpc3RzKCkgJiYgaXNUZXN0T3JTdWl0ZSh0ZXN0VHlwZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjaGVja2luZyBpc1NlcnZsZXQiLCBlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHRlc3RUeXBlCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIGEgdGVzdCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVGVzdE9yU3VpdGUoSVR5cGUgdGVzdFR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJVHlwZVtdIHR5cGVzID0gdGVzdFR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldEFsbFN1cGVyY2xhc3Nlcyh0ZXN0VHlwZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0eXBlc1tpXS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoVEVTVF9TVVBFUkNMQVNTX05BTUUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9XZWJUZXN0YWJsZVJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9XZWJUZXN0YWJsZVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNjg3M2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvV2ViVGVzdGFibGVSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhbmllbCBSLiBTb21lcmZpZWxkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLmNhY3R1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdERlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgV2ViVGVzdGFibGVSZXNvdXJjZSBleHRlbmRzIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgewotCXByaXZhdGUgYm9vbGVhbiBmU2VydmxldElzQ29uZmlndXJlZDsKLQlwcml2YXRlIFN0cmluZyBmQ2xhc3NOYW1lOwotCXByaXZhdGUgU3RyaW5nIGZUZXN0TmFtZTsKLQlwcml2YXRlIFN0cmluZyBmUHJvamVjdE5hbWU7Ci0KLQlwdWJsaWMgV2ViVGVzdGFibGVSZXNvdXJjZShJTW9kdWxlIG1vZHVsZSwgYm9vbGVhbiBzZXJ2bGV0SXNDb25maWd1cmVkLAotCQkJU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIobW9kdWxlKTsKLQkJZlNlcnZsZXRJc0NvbmZpZ3VyZWQgPSBzZXJ2bGV0SXNDb25maWd1cmVkOwotCQlmQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQlmVGVzdE5hbWUgPSB0ZXN0TmFtZTsKLQkJZlByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0JfQotCi0JcHVibGljIFdlYlRlc3RhYmxlUmVzb3VyY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZsZXRDb25maWd1cmVkKCkgewotCQlyZXR1cm4gZlNlcnZsZXRJc0NvbmZpZ3VyZWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBmQ2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7Ci0JCXJldHVybiBmVGVzdE5hbWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3RDYWN0dXNUZXN0LCBmVGVzdE5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI2Rlc2VyaWFsaXplKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShTdHJpbmcgcykgewotCQlpbnQgaW5kID0gcy5pbmRleE9mKCIvLyIpOwotCQlzdXBlci5kZXNlcmlhbGl6ZShzLnN1YnN0cmluZygwLCBpbmQpKTsKLQkJcyA9IHMuc3Vic3RyaW5nKGluZCsyKTsKLQkJaW5kID0gcy5pbmRleE9mKCIvLyIpOwotCQlmUHJvamVjdE5hbWUgPSBzLnN1YnN0cmluZygwLCBpbmQpOwotCQkKLQkJcyA9IHMuc3Vic3RyaW5nKGluZCsyKTsKLQkJaW5kID0gcy5pbmRleE9mKCIvLyIpOwotCQlmQ2xhc3NOYW1lID0gcy5zdWJzdHJpbmcoMCwgaW5kKTsKLQkJCi0JCWlmICgnVCcgPT0gcy5jaGFyQXQoaW5kKzIpKQotCQkJZlNlcnZsZXRJc0NvbmZpZ3VyZWQgPSB0cnVlOwotCQllbHNlCi0JCQlmU2VydmxldElzQ29uZmlndXJlZCA9IGZhbHNlOwotCQlmVGVzdE5hbWUgPSBzLnN1YnN0cmluZyhpbmQrMyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjc2VyaWFsaXplKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHNlcmlhbGl6ZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5zZXJpYWxpemUoKSk7Ci0JCXNiLmFwcGVuZCgiLy8iKTsKLQkJc2IuYXBwZW5kKGZQcm9qZWN0TmFtZSk7Ci0JCXNiLmFwcGVuZCgiLy8iKTsKLQkJc2IuYXBwZW5kKGZDbGFzc05hbWUpOwotCQlzYi5hcHBlbmQoIi8vIik7Ci0JCWlmIChmU2VydmxldElzQ29uZmlndXJlZCkKLQkJCXNiLmFwcGVuZCgiVCIpOwotCQllbHNlCi0JCQlzYi5hcHBlbmQoIkYiKTsKLQkJc2IuYXBwZW5kKGZUZXN0TmFtZSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZhM2MzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5TdXBwb3J0IGZvciBKYXZhIGFuZCBKMkVFIHNlcnZlciB0eXBlcy48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIgY2xhc3MgcHJvdmlkZXMgYSBjb21tb24gc3ViY2xhc3MKLWZvciBydW50aW1lIHRhcmdldCBoYW5kbGVycyB0aGF0IG5lZWQgdG8gbW9kaWZ5IGEgcHJvamVjdCdzIGNsYXNzcGF0aAotd2hlbiBhIHByb2plY3QgaXMgdGFyZ2V0dGVkIHRvIGEgcGFydGljdWxhciBydW50aW1lLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPklHZW5lcmljUnVudGltZSBhbmQgaXRzIHdvcmtpbmcgY29weSBwcm92aWRlIHR5cGUtc3BlY2lmaWMgYWNjZXNzCi10byB0aGUgZ2VuZXJpYyBydW50aW1lIHR5cGUuIFdoZW4gdXNpbmcgYSBnZW5lcmljIHJ1bnRpbWUsIGNsaWVudHMgY2FuCi1hY2Nlc3MgdGhlIHR5cGUgc3BlY2lmaWMgaW5mb3JtYXRpb24gYnkgYWRhcHRpbmcgdG8gdGhlc2UgdHlwZXMgdXNpbmcKLTxwcmU+SUdlbmVyaWNSdW50aW1lIGdyID0gKElHZW5lcmljUnVudGltZSkgcnVudGltZS5nZXRBZGFwdGVyKElHZW5lcmljUnVudGltZS5jbGFzcyk8L3ByZT4uCi1HZW5lcmljUnVudGltZVV0aWwgY29udGFpbnMgc29tZSB1dGlsaXR5IG1ldGhvZHMgZm9yIGhhbmRsaW5nIHRoZQotZ2VuZXJpYyBydW50aW1lIHR5cGUuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+SUVudGVycHJpc2VBcHBsaWNhdGlvbiwgSUVKQk1vZHVsZSwgSVdlYk1vZHVsZSwgSUFwcGxpY2F0aW9uQ2xpZW50TW9kdWxlLAotYW5kIElDb25uZWN0b3JNb2R1bGUgYXJlIEoyRUUgbW9kdWxlIGludGVyZmFjZXMgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQKLWJ5IG1vZHVsZSBkZWxlZ2F0ZXMgdGhhdCBwcm92aWRlIEoyRUUgbW9kdWxlIHN1cHBvcnQuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+SUxvb3NlQXJjaGl2ZSBhbmQgSUxvb3NlQXJjaGl2ZVN1cHBvcnQgYXJlIG1vZHVsZSBpbnRlcmZhY2VzIGZvciBtb2R1bGVzCi10aGF0IHRha2UgYWR2YW50YWdlIG9mIGxvb3NlIGFyY2hpdmUgc3VwcG9ydCAtIGFsbG93aW5nIEpBUnMgY29udGFpbmVkIHdpdGhpbgotdGhlIG1vZHVsZSB0byBiZSBhdmFpbGFibGUgaW4gYSBzZXBhcmF0ZSBKYXZhIHByb2plY3QgaW5zdGVhZCBvZiBkaXJlY3RseQotd2l0aGluIHRoZSBtb2R1bGUuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VGhlIHJlbWFpbmRlciBvZiB0aGUgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIG1vZHVsZSBhcnRpZmFjdCBhbmQKLWxhdW5jaGFibGUgdHlwZXMgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gSjJFRSByZXNvdXJjZSB0eXBlcyBmb3IgdGhlIHNlcnZlciB0b29sCi1mcmFtZXdvcmsuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YzA1MjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLTxoZWFkPgotCTwhLS0gIEVzY2FwZSB0byB0aGUgcm9vdCBvZiB5b3VyIHNvdXJjZSBmb2xkZXIgIC0tPgotCTxtZXRhCi0JCW5hbWU9InJvb3QiCi0JCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLyIgLz4KLQk8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08cD5TdXBwb3J0IGZvciBKYXZhIGFuZCBKMkVFIHNlcnZlciB0eXBlcy48L3A+Ci0KLTxwPlRoZSBDbGFzc3BhdGhSdW50aW1lVGFyZ2V0SGFuZGxlciBjbGFzcyBwcm92aWRlcyBhIGNvbW1vbiBzdWJjbGFzcwotZm9yIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXJzIHRoYXQgbmVlZCB0byBtb2RpZnkgYSBwcm9qZWN0J3MgY2xhc3NwYXRoCi13aGVuIGEgcHJvamVjdCBpcyB0YXJnZXR0ZWQgdG8gYSBwYXJ0aWN1bGFyIHJ1bnRpbWUuPC9wPgotCi08cD5JR2VuZXJpY1J1bnRpbWUgYW5kIGl0cyB3b3JraW5nIGNvcHkgcHJvdmlkZSB0eXBlLXNwZWNpZmljIGFjY2VzcwotdG8gdGhlIGdlbmVyaWMgcnVudGltZSB0eXBlLiBXaGVuIHVzaW5nIGEgZ2VuZXJpYyBydW50aW1lLCBjbGllbnRzIGNhbgotYWNjZXNzIHRoZSB0eXBlIHNwZWNpZmljIGluZm9ybWF0aW9uIGJ5IGFkYXB0aW5nIHRvIHRoZXNlIHR5cGVzIHVzaW5nCi08cHJlPklHZW5lcmljUnVudGltZSBnciA9IChJR2VuZXJpY1J1bnRpbWUpIHJ1bnRpbWUuZ2V0QWRhcHRlcihJR2VuZXJpY1J1bnRpbWUuY2xhc3MpPC9wcmU+LgotR2VuZXJpY1J1bnRpbWVVdGlsIGNvbnRhaW5zIHNvbWUgdXRpbGl0eSBtZXRob2RzIGZvciBoYW5kbGluZyB0aGUKLWdlbmVyaWMgcnVudGltZSB0eXBlLjwvcD4KLQotPHA+SUVudGVycHJpc2VBcHBsaWNhdGlvbiwgSUVKQk1vZHVsZSwgSVdlYk1vZHVsZSwgSUFwcGxpY2F0aW9uQ2xpZW50TW9kdWxlLAotYW5kIElDb25uZWN0b3JNb2R1bGUgYXJlIEoyRUUgbW9kdWxlIGludGVyZmFjZXMgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQKLWJ5IG1vZHVsZSBkZWxlZ2F0ZXMgdGhhdCBwcm92aWRlIEoyRUUgbW9kdWxlIHN1cHBvcnQuPC9wPgotCi08cD5JTG9vc2VBcmNoaXZlIGFuZCBJTG9vc2VBcmNoaXZlU3VwcG9ydCBhcmUgbW9kdWxlIGludGVyZmFjZXMgZm9yIG1vZHVsZXMKLXRoYXQgdGFrZSBhZHZhbnRhZ2Ugb2YgbG9vc2UgYXJjaGl2ZSBzdXBwb3J0IC0gYWxsb3dpbmcgSkFScyBjb250YWluZWQgd2l0aGluCi10aGUgbW9kdWxlIHRvIGJlIGF2YWlsYWJsZSBpbiBhIHNlcGFyYXRlIEphdmEgcHJvamVjdCBpbnN0ZWFkIG9mIGRpcmVjdGx5Ci13aXRoaW4gdGhlIG1vZHVsZS48L3A+Ci0KLTxwPlRoZSByZW1haW5kZXIgb2YgdGhlIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBtb2R1bGUgYXJ0aWZhY3QgYW5kCi1sYXVuY2hhYmxlIHR5cGVzIHRvIHByb3ZpZGUgYWNjZXNzIHRvIEoyRUUgcmVzb3VyY2UgdHlwZXMgZm9yIHRoZSBzZXJ2ZXIgdG9vbAotZnJhbWV3b3JrLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MzkzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTdiMzllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWdlbmVyaWNzZXJ2ZXIuamFyCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZV8xLjAuMC5qYXIKLXRlbXAuZm9sZGVyCi1nZW5lcmljc2VydmVyc3JjLnppcAotQGRvdAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTc3YWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUgcGx1Z2luCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZwotb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlN2VlMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYmEwZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gSnVuIDExIDIzOjA1OjQ4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3ZWExMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMzA1LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5wdWJsaXNoZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwueG1sO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmFudC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzO2J1bmRsZS12ZXJzaW9uPSJbMy4xLjEwMCwzLjMuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5hcGFjaGUuYW50O2J1bmRsZS12ZXJzaW9uPSJbMS42LjUsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXM7YnVuZGxlLXZlcnNpb249IlszLjEuMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmM2RlOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0jIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgICAgICAgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICB4c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IHhzZC8sXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkN2VhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0jIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgICAgICAgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPSBHZW5lcmljIFNlcnZlciBQbHVnaW4KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luRGVzY3JpcHRpb249UHJvdmlkZXMgZ2VuZXJpYyBzZXJ2ZXIgdG9vbHMgd2l0aCBlYXN5IHRvIGRldmVsb3AgbWV0YSBkYXRhIGNvbmZpZ3VyYXRpb24gZmlsZXMKLQotZXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVHlwZU5hbWU9R2VuZXJpYyBTZXJ2ZXIoRXh0ZXJuYWwgTGF1bmNoKQotbGF1bmNoQ29uZmlndXJhdGlvblR5cGVOYW1lPUdlbmVyaWMgU2VydmVyCi1leHRlbnNpb25Qb2ludFNlcnZlcmRlZmluaXRpb249U2VydmVyIGRlZmluaXRpb24KLWV4dGVuc2lvblBvaW50UnVudGltZWRlZmluaXRpb249UnVudGltZSBkZWZpbml0aW9uCi1leHRlbnNpb25Qb2ludEdlbmVyaWNwdWJsaXNoZXI9R2VuZXJpYyBQdWJsaXNoZXIKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDk5ZTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VydmVyZGVmaW5pdGlvbiIgbmFtZT0iJWV4dGVuc2lvblBvaW50U2VydmVyZGVmaW5pdGlvbiIgc2NoZW1hPSJzY2hlbWEvc2VydmVyZGVmaW5pdGlvbi5leHNkIi8+Ci0gPGV4dGVuc2lvbi1wb2ludCBpZD0icnVudGltZWRlZmluaXRpb24iIG5hbWU9IiVleHRlbnNpb25Qb2ludFJ1bnRpbWVkZWZpbml0aW9uIiBzY2hlbWE9InNjaGVtYS9ydW50aW1lZGVmaW5pdGlvbi5leHNkIi8+Ci0gPGV4dGVuc2lvbi1wb2ludCBpZD0iZ2VuZXJpY3B1Ymxpc2hlciIgbmFtZT0iJWV4dGVuc2lvblBvaW50R2VuZXJpY3B1Ymxpc2hlciIgc2NoZW1hPSJzY2hlbWEvZ2VuZXJpY3B1Ymxpc2hlci5leHNkIi8+Ci0JCi0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZXMiPgotICAgICA8bGF1bmNoQ29uZmlndXJhdGlvblR5cGUKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICBuYW1lPSIlbGF1bmNoQ29uZmlndXJhdGlvblR5cGVOYW1lIgotICAgICAgICBkZWxlZ2F0ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSIKLSAgICAgICAgbW9kZXM9InJ1biwgZGVidWcsIHByb2ZpbGUiCi0gICAgICAgIHNvdXJjZUxvY2F0b3JJZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5zb3VyY2VMb2NhdG9yLkphdmFTb3VyY2VMb29rdXBEaXJlY3RvciIKLSAgICAgICAgc291cmNlUGF0aENvbXB1dGVySWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLnNvdXJjZVBhdGhDb21wdXRlciIvPgotICAgICA8bGF1bmNoQ29uZmlndXJhdGlvblR5cGUKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgIG5hbWU9IiVleHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25UeXBlTmFtZSIKLSAgICAgICAgZGVsZWdhdGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIgotICAgICAgICBtb2Rlcz0icnVuLCBkZWJ1ZyIKLSAgICAgICAgc291cmNlTG9jYXRvcklkPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLnNvdXJjZUxvY2F0b3IuSmF2YVNvdXJjZUxvb2t1cERpcmVjdG9yIgotICAgICAgICBzb3VyY2VQYXRoQ29tcHV0ZXJJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuc291cmNlUGF0aENvbXB1dGVyIi8+Ci0gPC9leHRlbnNpb24+Ci0KLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZVBhdGhDb21wdXRlcnMiPgotICAgICA8c291cmNlUGF0aENvbXB1dGVyCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5zb3VyY2VQYXRoQ29tcHV0ZXIiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUiLz4KLSA8L2V4dGVuc2lvbj4KLSAKLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzIj4KLSAgICAgIDxsYXVuY2hhYmxlQWRhcHRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy53ZWIiLz4KLSA8L2V4dGVuc2lvbj4KLSAKLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5nZW5lcmljcHVibGlzaGVyIj4KLSAgICAgIDxnZW5lcmljcHVibGlzaGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVycy5BbnRQdWJsaXNoZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlciIvPgotIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc2NoZW1hL2dlbmVyaWNwdWJsaXNoZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc2NoZW1hL2dlbmVyaWNwdWJsaXNoZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwYWM0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NjaGVtYS9nZW5lcmljcHVibGlzaGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlIiBpZD0iZ2VuZXJpY3B1Ymxpc2hlciIgbmFtZT0iR2VuZXJpYyBQdWJsaXNoZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRGVmaW5lcyBhIHB1Ymxpc2hlciB0aGF0IGNhbiBiZSB1c2VkIGZvciBwdWJsaXNoaW5nIG1vZHVsZXMgdG8gc2VydmVycyBmb3IgZ2VuZXJpYyBzZXJ2ZXJzLiAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZ2VuZXJpY3B1Ymxpc2hlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZ2VuZXJpY3B1Ymxpc2hlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgdGhhdCByZWZlcnMgdG8gdGhpcyBwdWJsaXNoZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBjbGFzcyB0aGF0IGV4dGVuZHMgR2VuZXJpY1B1Ymxpc2hlcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmdlbmVyaWNwdWJsaXNoZXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7Z2VuZXJpY3B1Ymxpc2hlcgotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVycy5BbnRQdWJsaXNoZXImcXVvdDsKLSAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXImcXVvdDsvJmd0OwotICZsdDsvZXh0ZW5zaW9uJmd0OwotICZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlIGNsYXNzIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNQdWJsaXNoZXIgYWJzdHJhY3QgY2xhc3MuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc2NoZW1hL3J1bnRpbWVkZWZpbml0aW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NjaGVtYS9ydW50aW1lZGVmaW5pdGlvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2VkMGVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc2NoZW1hL3J1bnRpbWVkZWZpbml0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlIiBpZD0icnVudGltZWRlZmluaXRpb24iIG5hbWU9IlJ1bnRpbWUgRGVmaW5pdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVzIGEgbmV3IGdlbmVyaWMgc2VydmVyIHJ1bnRpbWUgZGVmaW5pdGlvbiBmaWxlLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lZGVmaW5pdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icnVudGltZWRlZmluaXRpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgcnVudGltZSBpZAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmluaXRpb25maWxlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGxvY2F0aW9uIG9mIHRoZSBnZW5lcmljIHNlcnZlciBydW50aW1lIGRlZmluaXRpb24gZmlsZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMi4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLnJ1bnRpbWVkZWZpbml0aW9uJnF1b3Q7Jmd0OwotICAmbHQ7cnVudGltZWRlZmluaXRpb24gaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuam9uYXM0JnF1b3Q7IGRlZmluaXRpb25maWxlPSZxdW90Oy9ydW50aW1lcy9qb25hcy5ydW50aW1lZGVmJnF1b3Q7Jmd0OwotICAmbHQ7L3J1bnRpbWVkZWZpbml0aW9uJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDYgQ2FwZSBDbGVhciBTb2Z0d2FyZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zY2hlbWEvc2VydmVyZGVmaW5pdGlvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zY2hlbWEvc2VydmVyZGVmaW5pdGlvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTMzMWY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc2NoZW1hL3NlcnZlcmRlZmluaXRpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiIGlkPSJzZXJ2ZXJkZWZpbml0aW9uIiBuYW1lPSJTZXJ2ZXIgRGVmaW5pdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVzIGEgbmV3IGdlbmVyaWMgc2VydmVyIGRlZmluaXRpb24gZmlsZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VydmVyZGVmaW5pdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic2VydmVyZGVmaW5pdGlvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzZXJ2ZXIgaWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZpbml0aW9uZmlsZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBsb2NhdGlvbiBvZiB0aGUgZ2VuZXJpYyBzZXJ2ZXIgZGVmaW5pdGlvbiBmaWxlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0mbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5zZXJ2ZXJkZWZpbml0aW9uJnF1b3Q7Jmd0OwotCQkmbHQ7c2VydmVyZGVmaW5pdGlvbiBpZD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hczQmcXVvdDsgZGVmaW5pdGlvbmZpbGU9JnF1b3Q7L3NlcnZlcnMvam9uYXMuc2VydmVyZGVmJnF1b3Q7Jmd0OwotCQkmbHQ7L3NlcnZlcmRlZmluaXRpb24mZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0NvcmVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjYjBlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9Db3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQotCS8qKgotCSAqIFBsdWctaW4gSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ29yZVBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIgZlNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcjsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqIEByZXR1cm4gZ2VuZXJpY1NlcnZlckNvcmVJbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHR5cGUgZGVmaW5pdGlvbiBtYW5hZ2VyIGluc3RhbmNlCi0JICogCi0JICogQHJldHVybiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIgZ2V0U2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyKCkKLQl7Ci0JCWlmKGZTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXI9PW51bGwpCi0JCQlmU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyID0gbmV3IFNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcihnZXRJbnN0YWxsVXJsKCkpOwotCQlyZXR1cm4gZlNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBVUkwgZ2V0SW5zdGFsbFVybCgpCi0JewotCQl0cnkgewotCQkJcmV0dXJuIEZpbGVMb2NhdG9yLnJlc29sdmUodGhpcy5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9FeHRlcm5hbERlYnVnTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9FeHRlcm5hbERlYnVnTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYmE5N2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxEZWJ1Z0xhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQWJzdHJhY3RKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiA8cD5FeHRlbnNpb24gb2YgPGNvZGU+QWJzdHJhY3RKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlPC9jb2RlPiB0aGF0IHN1cHBvcnRzIAotICogdGhlIGNvbm5lY3Rpb24gdG8gcmVtb3RlIEpWTXMgZm9yIGV4dGVybmFsIHNlcnZlcnMuIFVzZWQgZm9yIGRlYnVnZ2luZy48L3A+Ci0gKiAKLSAqIDxwPkJhc2VkIG9uIEphdmFSZW1vdGVBcHBsaWNhdGlvbkxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTwvcD4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVybmFsRGVidWdMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgewotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlI2xhdW5jaChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2gsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwgSUxhdW5jaCBsYXVuY2gsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChtb25pdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5hdHRhY2hpbmdUb0V4dGVybmFsR2VuZXJpY1NlcnZlcixuZXcgU3RyaW5nW117Y29uZmlndXJhdGlvbi5nZXROYW1lKCl9KSwgMyk7Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBmb3IgY2FuY2VsbGF0aW9uCi0gICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIG1vbml0b3Iuc3ViVGFzayhHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLnZlcmlmeWluZ0V4dGVybmFsU2VydmVyRGVidWdnaW5nTGF1bmNoQXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIGNvbm5lY3RvcklkID0gZ2V0Vk1Db25uZWN0b3JJZChjb25maWd1cmF0aW9uKTsKLSAgICAgICAgSVZNQ29ubmVjdG9yIGNvbm5lY3RvciA9IG51bGw7Ci0gICAgICAgIGlmIChjb25uZWN0b3JJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb25uZWN0b3IgPSBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1Db25uZWN0b3IoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbm5lY3RvciA9IEphdmFSdW50aW1lLmdldFZNQ29ubmVjdG9yKGNvbm5lY3RvcklkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29ubmVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGFib3J0KEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuZXh0ZXJuYWxTZXJ2ZXJEZWJ1Z0Nvbm5lY3Rvck5vdFNwZWNpZmllZCwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVSUl9DT05ORUNUT1JfTk9UX0FWQUlMQUJMRSk7IAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBNYXAgYXJnTWFwID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ09OTkVDVF9NQVAsIChNYXApbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBpbnQgY29ubmVjdFRpbWVvdXQgPSBKYXZhUnVudGltZS5nZXRQcmVmZXJlbmNlcygpLmdldEludChKYXZhUnVudGltZS5QUkVGX0NPTk5FQ1RfVElNRU9VVCk7Ci0gICAgICAgIGFyZ01hcC5wdXQoInRpbWVvdXQiLCAiIitjb25uZWN0VGltZW91dCk7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIC8vIGNoZWNrIGZvciBjYW5jZWxsYXRpb24KLSAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAKLSAgICAgICAgbW9uaXRvci5zdWJUYXNrKEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuY3JlYXRpbmdFeHRlcm5hbFNlcnZlckRlYnVnZ2luZ1NvdXJjZUxvY2F0b3IpOwotICAgICAgICAvLyBzZXQgdGhlIGRlZmF1bHQgc291cmNlIGxvY2F0b3IgaWYgcmVxdWlyZWQKLSAgICAgICAgc2V0RGVmYXVsdFNvdXJjZUxvY2F0b3IobGF1bmNoLCBjb25maWd1cmF0aW9uKTsKLSAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7ICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBjb25uZWN0IHRvIHJlbW90ZSBWTQotICAgICAgICBjb25uZWN0b3IuY29ubmVjdChhcmdNYXAsIG1vbml0b3IsIGxhdW5jaCk7Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBmb3IgY2FuY2VsbGF0aW9uCi0gICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotICAgICAgICAgICAgSURlYnVnVGFyZ2V0W10gZGVidWdUYXJnZXRzID0gbGF1bmNoLmdldERlYnVnVGFyZ2V0cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWJ1Z1RhcmdldHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJRGVidWdUYXJnZXQgdGFyZ2V0ID0gZGVidWdUYXJnZXRzW2ldOwotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2FuRGlzY29ubmVjdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzMjM3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIHJmcm9zdEBiZWEuY29tCi0gKiAgICB0eWlwQGJlYS5jb20KLSAqICAgIAotICogICAgQmFzZWQgb24gR2VuZXJpY1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSBieSBHb3JrZW0gRXJjYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5SdW50aW1lUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGU7Ci0KLS8qKgotICogPHA+RXh0ZW5zaW9uIG9mIDxjb2RlPkFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTwvY29kZT4gdGhhdCBzdXBwb3J0cyAKLSAqIHNlcnZlcnMgd2hpY2ggYXJlIHN0YXJ0ZWQvc3RvcHBlZCB2aWEgZXh0ZXJuYWwgZXhlY3V0YWJsZXMgKGUuZy4gc2NyaXB0cykuPC9wPgotICogCi0gKiA8cD5Ob3RlOiA8Y29kZT5BYnN0cmFjdEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGU8L2NvZGU+IGlzIGV4dGVuZGVkIHNpbXBseSB0byB0YWtlIGFkdmFudGFnZQotICogb2YgYSBzZXQgb2YgdXNlZnVsIGNvZGUgdGhhdCBpcyBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBsYXVuY2hpbmcgYSBKVk0tYmFzZWQgYXBwLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIElkZW50aWZpZXIgZm9yIHRoZSBleGVjdXRhYmxlIHNlcnZlciBjb25maWd1cmF0aW9uIHR5cGUKLQkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRVhURVJOQUxfTEFVTkNIX1RZUEUgPSBDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCBleGVjdXRhYmxlIGNvbW1hbmRsaW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRMSU5FID0gQ29yZVBsdWdpbi5QTFVHSU5fSUQgICsgIi5DT01NQU5ETElORSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSB0aGF0IGhvbGRzIGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIGV4dGVybmFsIGV4ZWN1dGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhFQ1VUQUJMRV9OQU1FID0gQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVYRUNVVEFCTEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSB0aGF0IGhvbGRzIHRoZSBkZWJ1ZyBwb3J0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1BPUlQgPSBDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuREVCVUdfUE9SVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBEZWZhdWx0IHZhbHVlIGZvciB0aGUgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIGV4dGVybmFsIGV4ZWN1dGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWEVDVVRBQkxFX05BTUUgPSAiRXh0ZXJuYWwgR2VuZXJpYyBTZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogRGVidWdnaW5nIGxhdW5jaCBjb25maWd1cmF0aW9uIGRlbGVnYXRlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEV4dGVybmFsRGVidWdMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgZGVidWdnaW5nRGVsZWdhdGUgPQotICAgICAgICBuZXcgRXh0ZXJuYWxEZWJ1Z0xhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSgpOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSNsYXVuY2gob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgCi0JCQkgICAgICAgU3RyaW5nIG1vZGUsCi0JCQkgICAgICAgSUxhdW5jaCBsYXVuY2gsIAotCQkJICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWwuZ2V0U2VydmVyKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJICAgIGFib3J0KEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMubWlzc2luZ1NlcnZlciwgbnVsbCwgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVSUl9JTlRFUk5BTF9FUlJPUik7Ci0JCX0JCi0KLQkJRXh0ZXJuYWxTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3IgPSAoRXh0ZXJuYWxTZXJ2ZXJCZWhhdmlvdXIpIHNlcnZlci5sb2FkQWRhcHRlcihTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5jbGFzcywgbnVsbCk7Ci0JCQotCQkvLyBpbml0aWFsaXplIHRoZSBzZXJ2ZXIsIGNoZWNrIHRoZSBwb3J0cyBhbmQgc3RhcnQgdGhlIFBpbmdUaHJlYWQgdGhhdCB3aWxsIGNoZWNrIAotCQkvLyBzZXJ2ZXIgc3RhdGUKLQkJc2VydmVyQmVoYXZpb3Iuc2V0dXBMYXVuY2gobGF1bmNoLCBtb2RlLCBtb25pdG9yKTsKLQkJCi0JCS8vIGdldCB0aGUgImV4dGVybmFsIiBjb21tYW5kCi0JCVN0cmluZyBjb21tYW5kbGluZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKENPTU1BTkRMSU5FLCAoU3RyaW5nKSBudWxsKTsKLQkJaWYgKGNvbW1hbmRsaW5lID09IG51bGwgfHwgY29tbWFuZGxpbmUubGVuZ3RoKCkgPT0gMCkgewotCQkJYWJvcnQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5jb21tYW5kbGluZVVuc3BlY2lmaWVkLCBudWxsLCBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuRVJSX0lOVEVSTkFMX0VSUk9SKTsJCQkKLQkJfQotCQkKLQkJLy8gcGFyc2UgdGhlICJleHRlcm5hbCIgY29tbWFuZCBpbnRvIG11bHRpcGxlIGFyZ3MKLQkJU3RyaW5nW10gY21kQXJncyA9IERlYnVnUGx1Z2luLnBhcnNlQXJndW1lbnRzKGNvbW1hbmRsaW5lKTsKLQkJLy8gZ2V0IHRoZSAicHJvZ3JhbUFyZ3VtZW50cyIsIHBhcnNlZCBpbnRvIG11bHRpcGxlIGFyZ3MKLQkJU3RyaW5nW10gcGdtQXJncyA9IERlYnVnUGx1Z2luLnBhcnNlQXJndW1lbnRzKGdldFByb2dyYW1Bcmd1bWVudHMoY29uZmlndXJhdGlvbikpOwotCQkKLQkJLy8gQ3JlYXRlIHRoZSBmdWxsIGFycmF5IG9mIGNtZHMKLQkJU3RyaW5nW10gY21kcyA9IG5ldyBTdHJpbmdbY21kQXJncy5sZW5ndGggKyBwZ21BcmdzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY21kQXJncywgMCwgY21kcywgMCwgY21kQXJncy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHBnbUFyZ3MsIDAsIGNtZHMsIGNtZEFyZ3MubGVuZ3RoLCBwZ21BcmdzLmxlbmd0aCk7Ci0JCQotCQkvLyBnZXQgYSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGUgZXhlY3V0YWJsZQotCQlTdHJpbmcgZXhlY3V0YWJsZU5hbWUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShFWEVDVVRBQkxFX05BTUUsIERFRkFVTFRfRVhFQ1VUQUJMRV9OQU1FKTsKLQkJCi0JCS8vIGdldCB0aGUgZXhlY3V0YWJsZSBlbnZpcm9ubWVudAotCQlJTGF1bmNoTWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJU3RyaW5nW10gZW52ID0gbWFuYWdlci5nZXRFbnZpcm9ubWVudChjb25maWd1cmF0aW9uKTsKLQkJCi0JCS8vIGdldCB0aGUgd29ya2luZyBkaXJlY3RvcnkKLQkJRmlsZSB3b3JraW5nRGlyID0gdmVyaWZ5V29ya2luZ0RpcmVjdG9yeShjb25maWd1cmF0aW9uKTsKLQkJaWYgKHdvcmtpbmdEaXIgPT0gbnVsbCkgewotCQkJYWJvcnQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy53b3JraW5nZGlyVW5zcGVjaWZpZWQsIG51bGwsIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FUlJfSU5URVJOQUxfRVJST1IpOwkJCQotCQl9Ci0JCQotCQkvLyBMYXVuY2ggdGhlIGV4ZWN1dGFibGUgZm9yIHRoZSBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBBbnQgRXhlY3V0ZSBjbGFzcwotCQl0cnkgewotCQkJUHJvY2VzcyBwcm9jZXNzID0gRXhlY3V0ZS5sYXVuY2gobnVsbCwgY21kcywgZW52LCB3b3JraW5nRGlyLCB0cnVlKTsKLQkJCXNlcnZlckJlaGF2aW9yLnN0YXJ0UGluZ1RocmVhZCgpOwotCQkJSVByb2Nlc3MgcnVudGltZVByb2Nlc3MgPSBuZXcgUnVudGltZVByb2Nlc3MobGF1bmNoLCBwcm9jZXNzLCBleGVjdXRhYmxlTmFtZSwgbnVsbCk7Ci0JCQlsYXVuY2guYWRkUHJvY2VzcyhydW50aW1lUHJvY2Vzcyk7Ci0JCQlzZXJ2ZXJCZWhhdmlvci5zZXRQcm9jZXNzKHJ1bnRpbWVQcm9jZXNzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlhYm9ydChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yTGF1bmNoaW5nRXhlY3V0YWJsZSwgaW9lLCAgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVSUl9JTlRFUk5BTF9FUlJPUik7Ci0JCX0KLQotCQlpZiAobW9kZS5lcXVhbHMoImRlYnVnIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IGNyZWF0ZURlYnVnZ2luZ0NvbmZpZyhjb25maWd1cmF0aW9uKTsKLQkJCS8vIGlmIHdlJ3JlIGxhdW5jaGluZyB0aGUgZGVidWdnaW5nIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGNvbmZpZyB0byBzdGFydAotCQkJLy8gYmVmb3JlIGxhdW5jaGluZyB0aGUgZGVidWdnaW5nIHNlc3Npb24KLQkJCXNlcnZlckJlaGF2aW9yLnNldERlYnVnZ2luZ0NvbmZpZyh3YywgbW9kZSwgbGF1bmNoLCBtb25pdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjcmVhdGVEZWJ1Z2dpbmdDb25maWcoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgCi0JdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gY29uZmlndXJhdGlvbi5nZXRXb3JraW5nQ29weSgpOwotICAgICAgICBzZXREZWJ1Z0FyZ3VtZW50KHdjLCBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9DT05ORUNUX01BUCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLSAgICAgICAgU3RyaW5nIHBvcnQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShERUJVR19QT1JULCAoU3RyaW5nKSBudWxsKTsKLSAgICAgICAgaWYgKHBvcnQ9PW51bGwgfHwgcG9ydC5sZW5ndGgoKT09MCkgewotICAgICAgICAJYWJvcnQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5kZWJ1Z1BvcnRVbnNwZWNpZmllZCwgbnVsbCwgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVSUl9JTlRFUk5BTF9FUlJPUik7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0RGVidWdBcmd1bWVudCh3YywgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ09OTkVDVF9NQVAsICJwb3J0IiwgcG9ydCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHdjOwotCX0KLQkKLQkvKioKLQkgKiBTdGFydHMgdGhlIGRlYnVnZ2luZyBzZXNzaW9uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHN0YXJ0RGVidWdnaW5nKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MsCi0JCQkgICAgICAgCQkJCQkJIFN0cmluZyBtb2RlLAotCQkJICAgICAgIAkJCQkJCSBJTGF1bmNoIGxhdW5jaCwgCi0JCQkgICAgICAgCQkJCQkJIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTdGFydGluZyBkZWJ1Z2dpbmciKTsgLy8kTk9OLU5MUy0xJAotCQlkZWJ1Z2dpbmdEZWxlZ2F0ZS5sYXVuY2god2MsIG1vZGUsIGxhdW5jaCwgbW9uaXRvcik7Ci0JfQotCSAgCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlYnVnQXJndW1lbnQoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcsIFN0cmluZyBhdHRyaWJLZXksIFN0cmluZyBrZXksIFN0cmluZyBhcmcpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1hcCBhcmdzID0gY29uZmlnLmdldEF0dHJpYnV0ZShhdHRyaWJLZXksIChNYXApbnVsbCk7Ci0gICAgICAgICAgICBpZiAoYXJncyE9bnVsbCkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgSGFzaE1hcChhcmdzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXJncyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzLnB1dChrZXksIFN0cmluZy52YWx1ZU9mKGFyZykpOwotICAgICAgICAgICAgY29uZmlnLnNldEF0dHJpYnV0ZShhdHRyaWJLZXksIGFyZ3MpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCQotCS8qKgotCSAqIFRocm93cyBhIGNvcmUgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIG9wdGlvbmFsCi0JICogZXhjZXB0aW9uLiBUaGUgZXhjZXB0aW9uJ3Mgc3RhdHVzIGNvZGUgd2lsbCBpbmRpY2F0ZSBhbiBlcnJvci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbiBjYXVzZSBvZiB0aGUgZXJyb3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIHVuZGVybHlpbmcKLQkgKiAgZXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWJvcnQoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24sIGludCBjb2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIGNvZGUsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0V4dGVybmFsU2VydmVyQmVoYXZpb3VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9FeHRlcm5hbFNlcnZlckJlaGF2aW91ci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWQyY2VjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0V4dGVybmFsU2VydmVyQmVoYXZpb3VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIAotICogICAgQmFzZWQgb24gR2VuZXJpY1NlcnZlckJlaGF2aW9yIGJ5IEdvcmtlbSBFcmNhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWwuUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7Ci0KLS8qKgotICogU3ViY2xhc3Mgb2YgPGNvZGU+R2VuZXJpY1NlcnZlckJlaGF2aW9yPC9jb2RlPiB0aGF0IHN1cHBvcnRzIAotICogc2VydmVycyB3aGljaCBhcmUgc3RhcnRlZC9zdG9wcGVkIHZpYSBleHRlcm5hbCBleGVjdXRhYmxlcyAoZS5nLiBzY3JpcHRzKS4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVybmFsU2VydmVyQmVoYXZpb3VyIGV4dGVuZHMgR2VuZXJpY1NlcnZlckJlaGF2aW91ciB7Ci0JCi0JLy8gY29uZmlnIGZvciBkZWJ1Z2dpbmcgc2Vzc2lvbgotCXByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBmTGF1bmNoQ29uZmlndXJhdGlvbldDOwotICAgIHByaXZhdGUgU3RyaW5nIGZNb2RlOwotICAgIHByaXZhdGUgSUxhdW5jaCBmTGF1bmNoOyAKLSAgICBwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBPdmVycmlkZSB0byByZXNldCB0aGUgc3RhdHVzIGlmIHRoZSBzdGF0ZSB3YXMgdW5rbm93bgotICAgICAqIEBwYXJhbSBmb3JjZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKGJvb2xlYW4gZm9yY2UpIHsKLSAgICAJcmVzZXRTdGF0dXMoZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKSk7Ci0gICAgCXN1cGVyLnN0b3AoZm9yY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlIHRvIHNldCBzdGF0dXMgdG8gdW5rbm93biBpZiB0aGUgcG9ydCB3YXMgaW4gdXNlIGFuZCB0byByZXNldCB0aGUgc3RhdHVzIGlmIHRoZSBzdGF0ZSB3YXMgCi0gICAgICogdW5rbm93biBhbmQgYW4gZXhjZXB0aW9uIHdhcyBub3QgdGhyb3duLiBXaWxsIHdhbnQgdG8gY2hhbmdlIGxvZ2ljIG9uY2UgZXh0ZXJuYWwgZ2VuZXJpYyBzZXJ2ZXIgcGluZ3MKLSAgICAgKiBzZXJ2ZXIgcHJvY2VzcyB0byBkZXRlcm1pbmUgc3RhdGUgaW5zdGVhZCBvZiBtYWludGFpbmluZyBoYW5kbGUgdG8gcHJvY2Vzcy4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBMYXVuY2goSUxhdW5jaCBsYXVuY2gsIFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJaW50IHN0YXRlID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKTsKLSAgICAJdHJ5IHsKLSAgICAJCXN1cGVyLnNldHVwTGF1bmNoKGxhdW5jaCwgbGF1bmNoTW9kZSwgbW9uaXRvcik7Ci0gICAgCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAJCVNlcnZlclBvcnQgcG9ydEluVXNlID0gcG9ydEluVXNlKCk7Ci0gICAgCQlpZiAocG9ydEluVXNlICE9IG51bGwpIHsKLSAgICAJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiUG9ydCAiICsgcG9ydEluVXNlLmdldFBvcnQoKSArICIgaXMgY3VycmVudGx5IGluIHVzZSIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIENvcmVQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCAKLQkJCQkJCQlOTFMuYmluZChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yUG9ydEluVXNlLEludGVnZXIudG9TdHJpbmcocG9ydEluVXNlLmdldFBvcnQoKSkscG9ydEluVXNlLmdldE5hbWUoKSksIG51bGwpOwotCQkJCXNldFNlcnZlclN0YXR1cyhzdGF0dXMpOwotCQkJCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfVU5LTk9XTik7Ci0gICAgCQl9Ci0gICAgCQl0aHJvdyBjZTsKLSAgICAJfQotICAgIAlyZXNldFN0YXR1cyhzdGF0ZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU2VydmVyUG9ydCBwb3J0SW5Vc2UoKSB7Ci0gICAgCVNlcnZlclBvcnRbXSBwb3J0cyA9IGdldFNlcnZlcigpLmdldFNlcnZlclBvcnRzKG51bGwpOwotICAgIAlTZXJ2ZXJQb3J0IHNwOwotICAgIAlmb3IoaW50IGk9MDtpPHBvcnRzLmxlbmd0aDtpKyspewotICAgIAkJc3AgPSBwb3J0c1tpXTsKLSAgICAJCWlmIChTb2NrZXRVdGlsLmlzUG9ydEluVXNlKHNwLmdldFBvcnQoKSwgNSkpIHsKLSAgICAJCQlyZXR1cm4gc3A7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJcmV0dXJuIG51bGw7Ci0JfQotICAgIAotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHRyaWdnZXIgdGhlIGxhdW5jaCBvZiB0aGUgZGVidWdnaW5nIHNlc3Npb24gKGlmIGFwcHJvcHJpYXRlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0U2VydmVyU3RhcnRlZCgpIHsKLQkJaWYgKGZMYXVuY2hDb25maWd1cmF0aW9uV0MgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlzZXR1cFNvdXJjZUxvY2F0b3IoIGZMYXVuY2ggKTsKLQkJCQlFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5zdGFydERlYnVnZ2luZyhmTGF1bmNoQ29uZmlndXJhdGlvbldDLCBmTW9kZSwgZkxhdW5jaCwgZlByb2dyZXNzTW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJLy8gZmFpbGVkIHRvIHN0YXJ0IGRlYnVnZ2luZywgc28gc2V0IG1vZGUgdG8gcnVuCi0JCQkJc2V0TW9kZShJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0JCQkJZmluYWwgU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDEsCi0JCQkJCQkJR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvclN0YXJ0aW5nRXh0ZXJuYWxEZWJ1Z2dpbmcsIGNlKTsgCi0JCQkJQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yU3RhcnRpbmdFeHRlcm5hbERlYnVnZ2luZywgY2UpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQljbGVhckRlYnVnZ2luZ0NvbmZpZygpOwotCQkJfQotCQl9Ci0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCk7Ci0gCX0KLQkKLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXBsYWNlIGRlZmF1bHQgc291cmNlIGxvY2F0b3Igb3IgYWRkIGFkZGl0aW9uYWwKLQkgKiBzb3VyY2VMb29rdXBQYXJ0aWNpcGFudCwgaWYgbmVjZXNzYXJ5IAotCSAqIEBwYXJhbSBsYXVuY2ggCXRoZSBJTGF1bmNoIG9iamVjdCBvZiB0aGUgZGVidWcgc2Vzc2lvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwU291cmNlTG9jYXRvcihJTGF1bmNoIGxhdW5jaCkgewotICAgICAgICAvL25vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKgotCSAqIElmIHRoZSBzZXJ2ZXIgc3RhdGUgaXMgdW5rbm93biwgcmVzZXQgdGhlIHN0YXR1cyB0byBPSwotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldFN0YXR1cyhpbnQgc3RhdGUpIHsKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikgewotCQkJc2V0U2VydmVyU3RhdHVzKG51bGwpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNpbmNlIHRlcm1pbmF0ZSgpIGlzIGNhbGxlZCBkdXJpbmcgcmVzdGFydCwgbmVlZCB0byBvdmVycmlkZSB0bwotCSAqIGNhbGwgc2h1dGRvd24gaW5zdGVhZCBvZiBqdXN0IGtpbGxpbmcgdGhlIG9yaWdpbmFsIHByb2Nlc3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVybWluYXRlKCkgewotCQlpbnQgc3RhdGUgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSAKLSAgICAJCXJldHVybjsKLSAgICAKLQkJLy8gY2FjaGUgYSByZWYgdG8gdGhlIGN1cnJlbnQgcHJvY2VzcwotCQlJUHJvY2VzcyBjdXJyZW50UHJvY2VzcyA9IHByb2Nlc3M7Ci0JCS8vIHNldCB0aGUgcHJvY2VzcyB2YXIgdG8gbnVsbCBzbyB0aGF0IEdlbmVyaWNTZXJ2ZXJCZWhhdmlvci5zZXRQcm9jZXNzKCkKLQkJLy8gd2lsbCBncmFiIHRoZSBzdG9wIGV4ZWN1dGFibGUgKGFuZCBkZWNsYXJlIHRoZSBzZXJ2ZXIgc3RvcHBlZCB3aGVuIGl0IGV4aXRzKQotCQlwcm9jZXNzID0gbnVsbDsKLQotCQkvLyBleGVjdXRlIHRoZSBzdGFuZGFyZCBzaHV0ZG93bgotCQlzaHV0ZG93bihzdGF0ZSk7Ci0JCQotCQkvLyBpZiB0aGUgc2h1dGRvd24gZGlkIG5vdCB0ZXJtaW5hdGUgdGhlIHByb2Nlc3MsIGZvcmNpYmx5IHRlcm1pbmF0ZSBpdAotCQl0cnkgewotICAgIAkJaWYgKGN1cnJlbnRQcm9jZXNzICE9IG51bGwgJiYgIWN1cnJlbnRQcm9jZXNzLmlzVGVybWluYXRlZCgpKSB7Ci0gICAgCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJBYm91dCB0byBraWxsIHByb2Nlc3M6ICIgKyBjdXJyZW50UHJvY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQljdXJyZW50UHJvY2Vzcy50ZXJtaW5hdGUoKTsKLSAgICAJCQljdXJyZW50UHJvY2VzcyA9IG51bGw7Ci0gICAgCQl9Ci0gICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBraWxsaW5nIHRoZSBwcm9jZXNzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAJfQotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZSBzdXBlcmNsYXNzIG1ldGhvZCB0byBjb3JyZWN0bHkgc2V0dXAgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciBzdGFydGluZyBhbiBleHRlcm5hbAotCSAqIHNlcnZlci4KLQkgKiBAcGFyYW0gd29ya2luZ0NvcHkKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXR1cExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSwKLQkJCQkJCQkJCQkgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNsZWFyRGVidWdnaW5nQ29uZmlnKCk7Ci0JCVNlcnZlclJ1bnRpbWUgc2VydmVyRGVmID0gZ2V0U2VydmVyRGVmaW5pdGlvbigpOwotCQlSZXNvbHZlciByZXNvbHZlciA9IHNlcnZlckRlZi5nZXRSZXNvbHZlcigpOwotCQl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksCi0JCQkJCXJlc29sdmVyLnJlc29sdmVQcm9wZXJ0aWVzKHNlcnZlckRlZi5nZXRTdGFydCgpLmdldFdvcmtpbmdEaXJlY3RvcnkoKSkpOwotCQlTdHJpbmcgZXh0ZXJuYWwgPSByZXNvbHZlci5yZXNvbHZlUHJvcGVydGllcyhnZXRFeHRlcm5hbEZvck9TKHNlcnZlckRlZi5nZXRTdGFydCgpLmdldEV4dGVybmFsKCkpKTsKLQkJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKEV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkNPTU1BTkRMSU5FLCBleHRlcm5hbCk7Ci0JCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5ERUJVR19QT1JULCAKLQkJCQkJcmVzb2x2ZXIucmVzb2x2ZVByb3BlcnRpZXMoc2VydmVyRGVmLmdldFN0YXJ0KCkuZ2V0RGVidWdQb3J0KCkpKTsKLQkJLy8ganVzdCB1c2UgdGhlIGNvbW1hbmRsaW5lIGZvciBub3cKLQkJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKEV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkVYRUNVVEFCTEVfTkFNRSwgZXh0ZXJuYWwpOwotICAgICAgICBNYXAgZW52aXJvblZhcnMgPSBnZXRFbnZpcm9ubWVudFZhcmlhYmxlcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RhcnQoKSk7Ci0gICAgICAgIGlmKCFlbnZpcm9uVmFycy5pc0VtcHR5KCkpewotICAgICAgICAJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElMYXVuY2hNYW5hZ2VyLkFUVFJfRU5WSVJPTk1FTlRfVkFSSUFCTEVTLGVudmlyb25WYXJzKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgZXhpc3RpbmdQcm9nQXJncyAgPSB3b3JraW5nQ29weS5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsIChTdHJpbmcpbnVsbCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2ZXJQcm9nQXJncyA9ICBnZXRQcm9ncmFtQXJndW1lbnRzKCk7Ci0gICAgICAgIGlmKGV4aXN0aW5nUHJvZ0FyZ3M9PW51bGwgfHwgZXhpc3RpbmdQcm9nQXJncy5pbmRleE9mKHNlcnZlclByb2dBcmdzKTwwKSB7Ci0gICAgICAgICAgICB3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsc2VydmVyUHJvZ0FyZ3MpOwotICAgICAgICB9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBleHRlcm5hbCB3aG9zZSAib3MiIGF0dHJpYnV0ZSBtYXRjaGVzIChjYXNlIGluc2Vuc2l0aXZlKSB0aGUgYmVnaW5uaW5nIAotCSAqIG9mIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IE9TIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBTeXN0ZW0gIm9zLm5hbWUiIHByb3BlcnR5KS4gSWYKLQkgKiBubyBzdWNoIG1hdGNoIGlzIGZvdW5kLCByZXR1cm5zIHRoZSBmaXJzdCBleHRlcm5hbCB0aGF0IGRvZXMgbm90IGhhdmUgYW4gT1MgYXR0cmlidXRlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEV4dGVybmFsRm9yT1MoTGlzdCBleHRlcm5hbHMpIHsKLQkJU3RyaW5nIGN1cnJlbnRPUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJRXh0ZXJuYWwgZXh0ZXJuYWw7Ci0JCVN0cmluZyBtYXRjaGluZ0V4dGVybmFsID0gbnVsbDsKLQkJU3RyaW5nIGV4dGVybmFsT1M7Ci0JCUl0ZXJhdG9yIGkgPSBleHRlcm5hbHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlleHRlcm5hbD0gKEV4dGVybmFsKSBpLm5leHQoKTsKLQkJCWV4dGVybmFsT1MgPSBleHRlcm5hbC5nZXRPcygpOwotCQkJaWYgKGV4dGVybmFsT1MgPT0gbnVsbCkgewotCQkJCWlmIChtYXRjaGluZ0V4dGVybmFsID09IG51bGwpIHsKLQkJCQkJbWF0Y2hpbmdFeHRlcm5hbCA9IGV4dGVybmFsLmdldFZhbHVlKCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjdXJyZW50T1Muc3RhcnRzV2l0aChleHRlcm5hbE9TLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJbWF0Y2hpbmdFeHRlcm5hbCA9IGV4dGVybmFsLmdldFZhbHVlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hdGNoaW5nRXh0ZXJuYWw7Ci0JfQotCi0JLyoqCi0gICAgICogUmV0dXJucyB0aGUgU3RyaW5nIElEIG9mIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlLgotICAgICAqIEByZXR1cm4gbGF1bmNoVHlwZUlECi0gICAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdUeXBlSUQoKSB7Ci0JCXJldHVybiBFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5JRF9FWFRFUk5BTF9MQVVOQ0hfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTdHJpbmcgbmFtZSBvZiB0aGUgc3RvcCBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkgKiBAcmV0dXJuIGxhdW5jaGVyTmFtZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RvcExhdW5jaE5hbWUoKSB7Ci0JCXJldHVybiBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmV4dGVybmFsU3RvcExhdW5jaGVyOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3Igc3RvcHBpbmcgdGhlIHNlcnZlci4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFN0b3BMYXVuY2hDb25maWd1cmF0aW9uKEdlbmVyaWNTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUsIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MpIHsKLQkJY2xlYXJEZWJ1Z2dpbmdDb25maWcoKTsKLQkJU2VydmVyUnVudGltZSBzZXJ2ZXJEZWYgPSBnZXRTZXJ2ZXJEZWZpbml0aW9uKCk7Ci0JCVJlc29sdmVyIHJlc29sdmVyID0gc2VydmVyRGVmLmdldFJlc29sdmVyKCk7IAotCQl3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksCi0JCQkJCXJlc29sdmVyLnJlc29sdmVQcm9wZXJ0aWVzKHNlcnZlckRlZi5nZXRTdG9wKCkuZ2V0V29ya2luZ0RpcmVjdG9yeSgpKSk7Ci0JCVN0cmluZyBleHRlcm5hbCA9IHJlc29sdmVyLnJlc29sdmVQcm9wZXJ0aWVzKGdldEV4dGVybmFsRm9yT1Moc2VydmVyRGVmLmdldFN0b3AoKS5nZXRFeHRlcm5hbCgpKSk7Ci0JCXdjLnNldEF0dHJpYnV0ZShFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5DT01NQU5ETElORSwgZXh0ZXJuYWwpOwotCQkvLyBqdXN0IHVzZSBjb21tYW5kbGluZSBmb3Igbm93Ci0gICAgICAgIE1hcCBlbnZpcm9uVmFycyA9IGdldEVudmlyb25tZW50VmFyaWFibGVzKGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdG9wKCkpOwotICAgICAgICBpZighZW52aXJvblZhcnMuaXNFbXB0eSgpKXsKLSAgICAgICAgCXdjLnNldEF0dHJpYnV0ZShJTGF1bmNoTWFuYWdlci5BVFRSX0VOVklST05NRU5UX1ZBUklBQkxFUyxlbnZpcm9uVmFycyk7Ci0gICAgICAgIH0KLQkJd2Muc2V0QXR0cmlidXRlKAotCQkJCUlKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLAotCQkJCXJlc29sdmVyLnJlc29sdmVQcm9wZXJ0aWVzKHNlcnZlckRlZi5nZXRTdG9wKCkuZ2V0UHJvZ3JhbUFyZ3VtZW50c0FzU3RyaW5nKCkpKTsKLQkJd2Muc2V0QXR0cmlidXRlKEV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkVYRUNVVEFCTEVfTkFNRSwgZXh0ZXJuYWwpOyAJCi0JCXdjLnNldEF0dHJpYnV0ZShTZXJ2ZXIuQVRUUl9TRVJWRVJfSUQsIGdldFNlcnZlcigpLmdldElkKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBjb25maWd1cmF0aW9uIHRvIHVzZSBmb3IgbGF1bmNoaW5nIGEgZGVidWdnaW5nIHNlc3Npb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0RGVidWdnaW5nQ29uZmlnKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MsCi0JCQkJCSAJCQkgICAgICBTdHJpbmcgbW9kZSwKLQkJCQkJIAkJCSAgICAgIElMYXVuY2ggbGF1bmNoLCAKLQkJCQkJIAkJCSAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0aGlzLmZMYXVuY2hDb25maWd1cmF0aW9uV0MgPSB3YzsKLQkJdGhpcy5mTW9kZSA9IG1vZGU7Ci0JCXRoaXMuZkxhdW5jaCA9IGxhdW5jaDsKLQkJdGhpcy5mUHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0JCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckRlYnVnZ2luZ0NvbmZpZygpIHsKLQkJdGhpcy5mTGF1bmNoQ29uZmlndXJhdGlvbldDID0gbnVsbDsKLQkJdGhpcy5mTW9kZSA9IG51bGw7Ci0JCXRoaXMuZkxhdW5jaCA9IG51bGw7Ci0JCXRoaXMuZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1B1Ymxpc2hlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1B1Ymxpc2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWE4Nzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNQdWJsaXNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgcHVibGlzaGVyLiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkKLSAqIGNsaWVudHMgaW1wbGVtZW50aW5nIHRoZSBnZW5lcmljcHVibGlzaGVyIGV4dGVuc2lvbiBwb2ludC4KLSAqCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY1B1Ymxpc2hlciAKLXsKLSAgICAKLSAgICBwcml2YXRlIElNb2R1bGVbXSBmTW9kdWxlOwotICAgIHByaXZhdGUgR2VuZXJpY1NlcnZlclJ1bnRpbWUgZlNlcnZlclJ1bnRpbWU7Ci0gICAgcHJpdmF0ZSBHZW5lcmljU2VydmVyIGZTZXJ2ZXI7Ci0gICAgcHJpdmF0ZSBpbnQgZktpbmQ7Ci0gICAgcHJpdmF0ZSBpbnQgZkRlbHRhS2luZDsKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbnRpemlsYXplcyBwdWJsaXNoZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1vZHVsZQotICAgICAqIEBwYXJhbSBzZXJ2ZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCBJTW9kdWxlW10gbW9kdWxlLCBJU2VydmVyIHNlcnZlciwgaW50IGtpbmQsIGludCBkZWx0YUtpbmQgKQotICAgIHsKLSAgICAgICAgZk1vZHVsZSA9IG1vZHVsZTsKLSAgICAgICAgZlNlcnZlciA9IChHZW5lcmljU2VydmVyKXNlcnZlci5sb2FkQWRhcHRlcihHZW5lcmljU2VydmVyLmNsYXNzLG51bGwpOwotICAgICAgICBmU2VydmVyUnVudGltZSA9IChHZW5lcmljU2VydmVyUnVudGltZSlzZXJ2ZXIuZ2V0UnVudGltZSgpLmxvYWRBZGFwdGVyKEdlbmVyaWNTZXJ2ZXJSdW50aW1lLmNsYXNzLG51bGwpOwotICAgICAgICBmS2luZCA9IGtpbmQ7Ci0gICAgICAgIGZEZWx0YUtpbmQgPSBkZWx0YUtpbmQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHB1Ymxpc2hlci4KLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqIEBwYXJhbSBtb2R1bGUKLSAgICAgKiBAcGFyYW0gc2VydmVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShJTW9kdWxlW10gbW9kdWxlLCBJU2VydmVyIHNlcnZlcikKLSAgICB7Ci0gICAgICAgIGZNb2R1bGUgPSBtb2R1bGU7Ci0gICAgICAgIGZTZXJ2ZXIgPSAoR2VuZXJpY1NlcnZlcilzZXJ2ZXIubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlci5jbGFzcyxudWxsKTsKLSAgICAgICAgZlNlcnZlclJ1bnRpbWUgPSAoR2VuZXJpY1NlcnZlclJ1bnRpbWUpc2VydmVyLmdldFJ1bnRpbWUoKS5sb2FkQWRhcHRlcihHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcyxudWxsKTsKLSAgICB9Ci0gICAvKioKLSAgICAqIENhbGxlZCBieSB0aGUgZ2VuZXJpYyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gd2hlbiBhIG1vZHVsZSBpcyAKLSAgICAqIHJlbW92ZWQgZm9ybSB0aGUgc2VydmVyIGluc3RhbmNlLiAKLSAgICAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIHRoZWlyIG93biBtb2R1bGUgcmVtb3ZhbAotICAgICogCi0gICAgKiBAcGFyYW0gbW9uaXRvcgotICAgICogQHJldHVybiBzdGF0dXMKLSAgICAqLyAKLSAgIHB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzW10gdW5wdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBnZW5lcmljIHNlcnZlciBpbXBsZW1lbnRhdGlvbiB3aGVuIGEgcHVibGlzaCBtb2R1bGUgCi0gICAgICogZXZlbnQgb2NjdXJzLiAKLSAgICAgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSB0aGVpciBvd24gcHVibGlzaGluZwotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqIEBwYXJhbSBtb25pdG9yCi0gICAgICogQHJldHVybiBzdGF0dXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgSVN0YXR1c1tdIHB1Ymxpc2goSU1vZHVsZUFydGlmYWN0W10gcmVzb3VyY2UsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHB1Ymxpc2hlciBpbnN0YW5jZQotICAgICAqIEByZXR1cm4gbW9kdWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElNb2R1bGVbXSBnZXRNb2R1bGUoKSB7Ci0gICAgICAgIHJldHVybiBmTW9kdWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyaWMgc2VydmVyIGluc3RhbmNlCi0gICAgICogQHJldHVybiBzZXJ2ZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgR2VuZXJpY1NlcnZlciBnZXRTZXJ2ZXIoKXsKLSAgICAJcmV0dXJuIGZTZXJ2ZXI7Ci0gICAgfQotICAgIC8qKgotICAgICAqIGEgaGFuZGxlIHRvIHNlcnZlciBkZWZpbml0aW9uLgotICAgICAqIEByZXR1cm4gc2VydmVyZGVmCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIGdldFNlcnZlclJ1bnRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBmU2VydmVyUnVudGltZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldERlbHRhS2luZCgpIHsKLSAgICAgICAgcmV0dXJuIGZEZWx0YUtpbmQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRLaW5kKCkgewotICAgICAgICByZXR1cm4gZktpbmQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4YmNmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuRmFjZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JRW50ZXJwcmlzZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVVSTFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKLQotLyoqCi0gKiBHZW5lcmljIFhNTCBiYXNlZCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyIGV4dGVuZHMgU2VydmVyRGVsZWdhdGUgaW1wbGVtZW50cyBJVVJMUHJvdmlkZXIgewotCi0JLyoqCi0JICogUHJvcGVydHkga2V5IGZvciB0aGUgY3VzdG9tIGJ1aWxkIGZpbGUuIFNlbGVjdGVkIGJ5IHVzZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9DVVNUT01fQlVJTERfU0NSSVBUID0gQ29yZVBsdWdpbi5QTFVHSU5fSUQrIi5jdXN0b21fYnVpbGRfZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9HRU5FUklDX1NFUlZFUl9NT0RVTEVTID0gIkdlbmVyaWNfU2VydmVyX01vZHVsZXNfTGlzdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGNhbk1vZGlmeU1vZHVsZXMoIElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUgKSB7Ci0gICAgICAgIGlmKCBhZGQgIT0gbnVsbCApLy8gcmVtb3ZlIGlzIE9LLgotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGFkZC5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc1N1cHBvcnRlZE1vZHVsZSggYWRkW2ldICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMubW9kdWxlTm90Q29tcGF0aWJsZSwgbnVsbCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiggYWRkW2ldLmdldFByb2plY3QoKSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIElTdGF0dXMgc3RhdHVzID0gRmFjZXRVdGlsLnZlcmlmeUZhY2V0cyggYWRkW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb2plY3QoKSwgZ2V0U2VydmVyKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLQkKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdXBwb3J0ZWRNb2R1bGUoSU1vZHVsZSBtb2R1bGUpewotICAgICAgICBpZiggbW9kdWxlID09IG51bGwgKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBMaXN0IG1vZHVsZVR5cGVzID0gZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldE1vZHVsZSgpOwotICAgICAgICBmb3IoIGludCBqPTA7IGo8bW9kdWxlVHlwZXMuc2l6ZSgpOyBqKysgKXsKLSAgICAgICAgICAgICBNb2R1bGUgbW9kdWxlRGVmaW5pdGlvbiA9IChNb2R1bGUpbW9kdWxlVHlwZXMuZ2V0KGopOwotICAgICAgICAgICAgIGlmKCBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpICE9IG51bGwgJiYgbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpLmVxdWFscyhtb2R1bGVEZWZpbml0aW9uLmdldFR5cGUoKSkgKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZSNtb2RpZnlNb2R1bGVzKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlW10sIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlW10sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAKLSAgICAgICAgTGlzdCBtb2R1bGVzID0gdGhpcy5nZXRBdHRyaWJ1dGUoQVRUUl9HRU5FUklDX1NFUlZFUl9NT0RVTEVTLChMaXN0KW51bGwpOwotICAgICAgICAKLSAgICAgICAgaWYoYWRkIT1udWxsJiYgYWRkLmxlbmd0aD4wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihtb2R1bGVzPT1udWxsKSB7Ci0gICAgICAgICAgICAgICBtb2R1bGVzPW5ldyBBcnJheUxpc3QoYWRkLmxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICBpZihtb2R1bGVzLmNvbnRhaW5zKGFkZFtpXS5nZXRJZCgpKT09ZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgIG1vZHVsZXMuYWRkKGFkZFtpXS5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihyZW1vdmUhPW51bGwgJiYgcmVtb3ZlLmxlbmd0aD4wICYmIG1vZHVsZXMhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlcy5yZW1vdmUocmVtb3ZlW2ldLmdldElkKCkpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihtb2R1bGVzIT1udWxsKSAgICAKLSAgICAgICAgICAgIHNldEF0dHJpYnV0ZShBVFRSX0dFTkVSSUNfU0VSVkVSX01PRFVMRVMsbW9kdWxlcyk7Ci0gICAgICAgIAotICAgIH0KLQotIAkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JU2VydmVyRGVsZWdhdGUjZ2V0Q2hpbGRNb2R1bGVzKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlW10pCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlWzBdICE9IG51bGwgJiYgbW9kdWxlWzBdLmdldE1vZHVsZVR5cGUoKSAhPSBudWxsKSB7Ci0JCQlpZiAobW9kdWxlLmxlbmd0aCA9PSAxKSB7Ci0JCQkJSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSA9IG1vZHVsZVswXS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQkJaWYgKG1vZHVsZVR5cGUgIT0gbnVsbCAmJiAianN0LmVhciIuZXF1YWxzKG1vZHVsZVR5cGUuZ2V0SWQoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlJRW50ZXJwcmlzZUFwcGxpY2F0aW9uIGVudGVycHJpc2VBcHBsaWNhdGlvbiA9IChJRW50ZXJwcmlzZUFwcGxpY2F0aW9uKSBtb2R1bGVbMF0KLQkJCQkJCQkubG9hZEFkYXB0ZXIoSUVudGVycHJpc2VBcHBsaWNhdGlvbi5jbGFzcywgbnVsbCk7Ci0JCQkJCWlmIChlbnRlcnByaXNlQXBwbGljYXRpb24gIT0gbnVsbCkgewotCQkJCQkJSU1vZHVsZVtdIGVhck1vZHVsZXMgPSBlbnRlcnByaXNlQXBwbGljYXRpb24uZ2V0TW9kdWxlcygpOyAKLQkJCQkJCWlmICggZWFyTW9kdWxlcyAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIGVhck1vZHVsZXM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAobW9kdWxlVHlwZSAhPSBudWxsICYmICJqc3Qud2ViIi5lcXVhbHMobW9kdWxlVHlwZS5nZXRJZCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUlXZWJNb2R1bGUgd2ViTW9kdWxlID0gKElXZWJNb2R1bGUpIG1vZHVsZVswXS5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLCBudWxsKTsKLQkJCQkJaWYgKHdlYk1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IHdlYk1vZHVsZS5nZXRNb2R1bGVzKCk7Ci0JCQkJCQlyZXR1cm4gbW9kdWxlczsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIGluc3RhbmNlIHByb3BlcnRpZXMgaW5jbHVkaW5nIHJ1bnRpbWUgcHJvcGVydGllcy4gCi0JICogCi0JICogQHJldHVybiBzZXJ2ZXIgaW5zdGFuY2UgcHJvcGVydGllcy4KLQkgKi8KLQlwcml2YXRlIE1hcCBnZXRJbnN0YW5jZVByb3BlcnRpZXMoKSB7Ci0JCU1hcCBydW50aW1lUHJvcGVydGllcyA9Z2V0UnVudGltZURlbGVnYXRlKCkuZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCU1hcCBzZXJ2ZXJQcm9wZXJ0aWVzID0gZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCU1hcCBpbnN0YW5jZVByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcChydW50aW1lUHJvcGVydGllcy5zaXplKCkrc2VydmVyUHJvcGVydGllcy5zaXplKCkpOwotCQlpbnN0YW5jZVByb3BlcnRpZXMucHV0QWxsKHJ1bnRpbWVQcm9wZXJ0aWVzKTsKLQkJaW5zdGFuY2VQcm9wZXJ0aWVzLnB1dEFsbChzZXJ2ZXJQcm9wZXJ0aWVzKTsKLQkJcmV0dXJuIGluc3RhbmNlUHJvcGVydGllczsKLQl9Ci0JCi0gCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb25pdG9yYWJsZVNlcnZlciNnZXRTZXJ2ZXJQb3J0cygpCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0W10gZ2V0U2VydmVyUG9ydHMoKSB7Ci0JCUxpc3QgcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIHBJdGVyID0gdGhpcy5nZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UG9ydCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChwSXRlci5oYXNOZXh0KCkpIHsKLQkJCVBvcnQgZWxlbWVudCA9IChQb3J0KSBwSXRlci5uZXh0KCk7Ci0JCQlpbnQgcG9ydCA9IEludGVnZXIucGFyc2VJbnQoZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZWxlbWVudC5nZXRObygpKSk7Ci0JCQlwb3J0cy5hZGQobmV3IFNlcnZlclBvcnQoInNlcnZlciIsIGVsZW1lbnQuZ2V0TmFtZSgpLCBwb3J0LCBlbGVtZW50LmdldFByb3RvY29sKCkpKTsJCSAvLyROT04tTkxTLTEkCi0JCX0KLQkKLQkJcmV0dXJuIChvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydFtdKXBvcnRzLnRvQXJyYXkobmV3IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0W3BvcnRzLnNpemUoKV0pOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLnNlcnZlci5jb3JlLm1vZGVsLklVUkxQcm92aWRlciNnZXRNb2R1bGVSb290VVJMKG9yZy5lY2xpcHNlLnd0cC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlKQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TW9kdWxlUm9vdFVSTChJTW9kdWxlIG1vZHVsZSkgewotCi0JCXRyeSB7Ci0gICAgICAgICAgICBpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsbnVsbCk9PW51bGwgKQotCQkJCXJldHVybiBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBJV2ViTW9kdWxlIHdlYk1vZHVsZSA9KElXZWJNb2R1bGUpbW9kdWxlLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsbnVsbCk7Ci0gICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGdldFNlcnZlcigpLmdldEhvc3QoKTsKLQkJCVN0cmluZyB1cmwgPSAiaHR0cDovLyIraG9zdDsgLy8kTk9OLU5MUy0xJAotCQkJaW50IHBvcnQgPSAwOwotCQkJCi0JCQlwb3J0ID0gZ2V0SHR0cFBvcnQoKTsKLQkJCXBvcnQgPVNlcnZlclV0aWwuZ2V0TW9uaXRvcmVkUG9ydChnZXRTZXJ2ZXIoKSwgcG9ydCwgIndlYiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocG9ydCAhPSA4MCkKLQkJCQl1cmwgKz0gIjoiICsgcG9ydDsgLy8kTk9OLU5MUy0xJAotCi0JCQlTdHJpbmcgY3R4Um9vdCA9IHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpOwotCQkJaWYoIWN0eFJvb3Quc3RhcnRzV2l0aCggIi8iICkpeyAvLyROT04tTkxTLTEkCi0JCQkgICAgdXJsICs9ICcvJzsKLQkJCX0KLQkJCXVybCArPSB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKTsKLQotCQkJaWYgKCF1cmwuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJCXVybCArPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQotCQkJcmV0dXJuIG5ldyBVUkwodXJsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKCJDb3VsZCBub3QgZ2V0IHJvb3QgVVJMIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gaHR0cCBwb3J0Ci0JICogQHJldHVybiBwb3J0Ci0JICovCi0JcHJvdGVjdGVkIGludCBnZXRIdHRwUG9ydCgpIHsKLQkJaW50IHBvcnQ9LTE7Ci0JCUl0ZXJhdG9yIHBJdGVyID0gdGhpcy5nZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UG9ydCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChwSXRlci5oYXNOZXh0KCkpIHsKLQkJCVBvcnQgYVBvcnQgPSAoUG9ydCkgcEl0ZXIubmV4dCgpOwotCQkJaWYocG9ydD09IC0xKQotCQkJCXBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGFQb3J0LmdldE5vKCkpKTsKLQkJCWVsc2UgaWYoICJodHRwIi5lcXVhbHMoYVBvcnQuZ2V0UHJvdG9jb2woKSApICkgLy8kTk9OLU5MUy0xJAotCQkJCXBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGFQb3J0LmdldE5vKCkpOwkKLQkJfQotCQlpZiggcG9ydCA9PSAtMSkKLQkJCXBvcnQgPSA4MDgwOwotCQlyZXR1cm4gcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTZXJ2ZXJSdW50aW1lIHRoYXQgcmVwcmVzZW50cyB0aGUgLnNlcnZlcmRlZgotCSAqIGZpbGUgZm9yIHRoaXMgc2VydmVyLiAKLQkgKiBAcmV0dXJuIHNlcnZlciBydW50aW1lCi0JICovCi0gICAgcHVibGljIFNlcnZlclJ1bnRpbWUgZ2V0U2VydmVyRGVmaW5pdGlvbigpewotICAgICAgICBJU2VydmVyIHNlcnZlciA9IGdldFNlcnZlcigpOwotICAgICAgICBpZiAoc2VydmVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIHNlcnZlciBkZXRlcm1laW5lZC4gU2VydmVyIGRlZmluaXRpb24gY2FuIG5vdCBiZSBkZXRlcm1pbmVkIHdpdGhvdXQgYSBzZXJ2ZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcnRUeXBlSWQ9bnVsbDsKLSAgICAgICAgaWYgKCBzZXJ2ZXIuZ2V0UnVudGltZSgpICE9IG51bGwgJiYKLSAgICAgICAgCQlzZXJ2ZXIuZ2V0UnVudGltZSgpLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgCXJ0VHlwZUlkID0gc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIH0KLQkJCi0gICAgICAgIFN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBQYXNzIGJvdGggdGhlIHNlcnZlclR5cGUgaWQgYW5kIHJ1bnRpbWVUeXBlIGlkIGFuZCBTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIgCi0gICAgICAgICAqIHdpbGwgZmlndXJlIG91dCBob3cgdG8gZ2l2ZSB1cyBiYWNrIHRoZSBjb3JyZWN0IFNlcnZlclJ1bnRpbWUuCi0gICAgICAgICAqLwotCQlyZXR1cm4gQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyKCkuZ2V0U2VydmVyUnVudGltZURlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgc2VydmVyVHlwZUlkLCBydFR5cGVJZCwgZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCkpOwotCX0KLQotICAgIHByaXZhdGUgR2VuZXJpY1NlcnZlclJ1bnRpbWUgZ2V0UnVudGltZURlbGVnYXRlKCl7Ci0gICAgCXJldHVybiAoR2VuZXJpY1NlcnZlclJ1bnRpbWUpZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmxvYWRBZGFwdGVyKEdlbmVyaWNTZXJ2ZXJSdW50aW1lLmNsYXNzLG51bGwpOwotICAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlI2dldFJvb3RNb2R1bGVzKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlKQotICAgICAqLwotICAgIHB1YmxpYyBJTW9kdWxlW10gZ2V0Um9vdE1vZHVsZXMoSU1vZHVsZSBtb2R1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgCWlmICggIWlzU3VwcG9ydGVkTW9kdWxlKCBtb2R1bGUgKSApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBjYW5Nb2RpZnlNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbnVsbCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLSAgICAgICAgICAgIHRocm93ICBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOzsKLSAgICAgICAgSU1vZHVsZVtdIHBhcmVudHMgPSBkb0dldFBhcmVudE1vZHVsZXMobW9kdWxlKTsKLSAgICAgICAgaWYocGFyZW50cy5sZW5ndGg+MCkKLSAgICAgICAgCXJldHVybiBwYXJlbnRzOwotICAgICAgICByZXR1cm4gbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9OwotICAgIH0KLQotCi0JcHJpdmF0ZSBJTW9kdWxlW10gZG9HZXRQYXJlbnRNb2R1bGVzKElNb2R1bGUgbW9kdWxlKSB7Ci0JCUlNb2R1bGVbXSBlYXJzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKCJqc3QuZWFyIik7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWFycy5sZW5ndGg7IGkrKykgewotCQkJSUVudGVycHJpc2VBcHBsaWNhdGlvbiBlYXIgPSAoSUVudGVycHJpc2VBcHBsaWNhdGlvbillYXJzW2ldLmxvYWRBZGFwdGVyKElFbnRlcnByaXNlQXBwbGljYXRpb24uY2xhc3MsbnVsbCk7Ci0JCQlJTW9kdWxlW10gY2hpbGRzID0gZWFyLmdldE1vZHVsZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYoY2hpbGRzW2pdLmVxdWFscyhtb2R1bGUpKQotCQkJCQlsaXN0LmFkZChlYXJzW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElNb2R1bGVbXSlsaXN0LnRvQXJyYXkobmV3IElNb2R1bGVbbGlzdC5zaXplKCldKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHByb3BlcnRpZXMuCi0JICogQHJldHVybiBNYXAgb2YgcHJvcGVydGllcy4KLQkgKi8KLSAgICBwdWJsaWMgTWFwIGdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpIHsKLSAJCXJldHVybiBnZXRBdHRyaWJ1dGUoR2VuZXJpY1NlcnZlclJ1bnRpbWUuU0VSVkVSX0lOU1RBTkNFX1BST1BFUlRJRVMsIG5ldyBIYXNoTWFwKCkpOwotIAl9Ci0gCS8qKgotIAkgKiBDaGFuZ2UgdGhlIHNlcnZlciBpbnN0YW5jZSBwcm9wZXJ0aWVzLgotIAkgKiAKLSAJICogQHBhcmFtIG1hcAotIAkgKi8KLSAJcHVibGljIHZvaWQgc2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKE1hcCBtYXApIHsKLSAJCXNldEF0dHJpYnV0ZShHZW5lcmljU2VydmVyUnVudGltZS5TRVJWRVJfSU5TVEFOQ0VfUFJPUEVSVElFUywgbWFwKTsKLSAJfQotIAkvKioKLSAJICogQ2hlY2tzIGlmIHRoZSBwcm9wZXJ0aWVzIHNldCBmb3IgdGhpcyBzZXJ2ZXIgaXMgdmFsaWQuIAotIAkgKiBAcmV0dXJuIHN0YXR1cwotIAkgKi8KLSAJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKSB7Ci0gCQlMaXN0IHByb3BzID0gdGhpcy5nZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UHJvcGVydHkoKTsKLSAJCWZvcihpbnQgaT0wO2k8cHJvcHMuc2l6ZSgpO2krKykKLSAJCXsKLSAJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9KFByb3BlcnR5KXByb3BzLmdldChpKTsKLSAJCQlpZihwcm9wZXJ0eS5nZXRUeXBlKCkuZXF1YWxzKFByb3BlcnR5LlRZUEVfRElSRUNUT1JZKSB8fCBwcm9wZXJ0eS5nZXRUeXBlKCkuZXF1YWxzKFByb3BlcnR5LlRZUEVfRklMRSkpCi0gCQkJewotIAkJCQlTdHJpbmcgcGF0aD0gKFN0cmluZylnZXRJbnN0YW5jZVByb3BlcnRpZXMoKS5nZXQocHJvcGVydHkuZ2V0SWQoKSk7Ci0gCQkJCWlmKHBhdGghPW51bGwgJiYgIXBhdGhFeGlzdChwYXRoKSkKLSAJCQkJCXJldHVybiAgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5pbnZhbGlkUGF0aCxwYXRoKSwgbnVsbCk7Ci0gCQkJfQotIAkJfQotIAkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotIAl9Ci0JcHJpdmF0ZSBib29sZWFuIHBhdGhFeGlzdChTdHJpbmcgcGF0aCl7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotCQlyZXR1cm4gZi5leGlzdHMoKTsKLQl9Ci0gCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVNlcnZlclJ1bnRpbWUgc2VydmVyUnVudGltZSA9ICB0aGlzLmdldFNlcnZlckRlZmluaXRpb24oKTsgCi0JCS8vIGFsdGhvdWdoIGEgc2VydmVyIHNob3VsZCBhbHdheXMgaGF2ZSBhIHNlcnZlcmRlZmluaXRpb24gaW4gc29tZSBjYXNlcyAKLQkJLy8gdGhlIHJ1bnRpbWUgaXMgbm90IGNyZWF0ZWQgeWV0IGFuZCBzZXJ2ZXJkZWYgY2FuIG5vdCBiZSBkZXRlcm1pbmVkLgotCQlpZiAoc2VydmVyUnVudGltZSA9PSBudWxsICl7Ci0JCQlyZXR1cm4gOwotCQl9Ci0gCQlMaXN0IHByb3BzID0gdGhpcy5nZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UHJvcGVydHkoKTsKLSAJCU1hcCBpbnN0YW5jZVByb3BzTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAJCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb3BzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUHJvcGVydHkgZWxlbWVudCA9IChQcm9wZXJ0eSkgaXRlci5uZXh0KCk7Ci0JCQlpZihQcm9wZXJ0eS5DT05URVhUX1NFUlZFUi5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0Q29udGV4dCgpKSkgewotCQkJCS8vaWYgdGhlIHByb3BlcnR5IHR5cGUgaXMgdGhpcyBpcyBhIGNvbWJvLCBwYXJzZSB0aGUgdmFsdWUgYW5kIHVzZSB0aGUgZmlyc3QgdG9rZW4gYXMgdGhlIGRlZmF1bHQKLQkJCQlpZiAoUHJvcGVydHkuVFlQRV9TRUxFQ1QuZXF1YWxzKGVsZW1lbnQuZ2V0VHlwZSgpKSB8fAotCQkJCQkJUHJvcGVydHkuVFlQRV9TRUxFQ1RfRURJVC5lcXVhbHMoZWxlbWVudC5nZXRUeXBlKCkpKSB7Ci0JCSAgICAJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0RGVmYXVsdCgpLCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJICAgIAkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJICAgIAkJCVN0cmluZyBmaXJzdFRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkgICAgCQkJaW5zdGFuY2VQcm9wc01hcC5wdXQoZWxlbWVudC5nZXRJZCgpLCBmaXJzdFRva2VuKTsKLQkJICAgIAkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vbm90IGEgY29tYm8sIHNvIGp1c3QgcGFzcyB0aHJvdWdoIHRoZSBkZWZhdWx0IHZhbHVlCi0JCQkJCWluc3RhbmNlUHJvcHNNYXAucHV0KGVsZW1lbnQuZ2V0SWQoKSwgZWxlbWVudC5nZXREZWZhdWx0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotIAkJc2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKGluc3RhbmNlUHJvcHNNYXApOwotIAl9Ci0gCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJCZWhhdmlvdXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJCZWhhdmlvdXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzZjRiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQmVoYXZpb3VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklEZWJ1Z0V2ZW50U2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5EZWxldGVkTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLQotLyoqCi0gKiBTZXJ2ZXIgYmVoYXZpb3IgZGVsZWdhdGUgaW1wbGVtZW50YXRpb24gZm9yIGdlbmVyaWMgc2VydmVyLgotICoKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyQmVoYXZpb3VyIGV4dGVuZHMgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1RPUCA9ICJzdG9wLXNlcnZlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NFUlZFUl9JRCA9ICJzZXJ2ZXItaWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gdGhlIHRocmVhZCB1c2VkIHRvIHBpbmcgdGhlIHNlcnZlciB0byBjaGVjayBmb3Igc3RhcnR1cAotCXByb3RlY3RlZCB0cmFuc2llbnQgUGluZ1RocmVhZCBwaW5nOwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgSURlYnVnRXZlbnRTZXRMaXN0ZW5lciBwcm9jZXNzTGlzdGVuZXI7Ci0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBJUHJvY2VzcyBwcm9jZXNzOwotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSNwdWJsaXNoU2VydmVyKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1Ymxpc2hTZXJ2ZXIoaW50IGtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlI3B1Ymxpc2hNb2R1bGUob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVbXSwgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1Ymxpc2hNb2R1bGUoaW50IGtpbmQsIGludCBkZWx0YUtpbmQsIElNb2R1bGVbXSBtb2R1bGUsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgR2VuZXJpY1B1Ymxpc2hlciBwdWJsaXNoZXIgPSBpbml0aWFsaXplUHVibGlzaGVyKCBraW5kLCBkZWx0YUtpbmQsIG1vZHVsZSApOwotICAgICAgICBJU3RhdHVzW10gc3RhdHVzID0gbnVsbDsKLSAgICAJaWYoUkVNT1ZFRCA9PSBkZWx0YUtpbmQgKXsvL1RPRE86IGNoZWNrIGlmIHRoZSByZW1vdmVkIG1vZHVsZSBpcyBwdWJsaXNoZWQgdG8gc2VydmVyCi0gICAgICAgICAgICBzdGF0dXMgPSBwdWJsaXNoZXIudW5wdWJsaXNoKG1vbml0b3IpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgIAljaGVja0Nsb3NlZChtb2R1bGUpOwotICAgICAgICAgICAgc3RhdHVzPSBwdWJsaXNoZXIucHVibGlzaChudWxsLG1vbml0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHNldE1vZHVsZVB1Ymxpc2hTdGF0ZSggbW9kdWxlLCBzdGF0dXMgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0TW9kdWxlUHVibGlzaFN0YXRlKCBJTW9kdWxlW10gbW9kdWxlLCBJU3RhdHVzW10gc3RhdHVzICkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiggbW9kdWxlPT1udWxsICkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZm9yKCBpbnQgaT0wOyBpIDwgbW9kdWxlLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihzdGF0dXMgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICBzdGF0dXMubGVuZ3RoIDwgaSB8fAotICAgICAgICAgICAgICAgICAgICBzdGF0dXNbaV09PW51bGwgfHwgCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1c1tpXS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgc2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSwgSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOyAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIElTdGF0dXMuRVJST1IgPT0gc3RhdHVzW2ldLmdldFNldmVyaXR5KCkgKXsKLSAgICAgICAgICAgICAgICAgICAgc2V0TW9kdWxlUHVibGlzaFN0YXRlKCBtb2R1bGUsIElTZXJ2ZXIuUFVCTElTSF9TVEFURV9VTktOT1dOICk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBzdGF0dXNbaV0gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tDbG9zZWQoSU1vZHVsZVtdIG1vZHVsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgCWZvciggaW50IGk9MDsgaSA8IG1vZHVsZS5sZW5ndGg7IGkrKyApewotICAgIAkJaWYoIG1vZHVsZVtpXSBpbnN0YW5jZW9mIERlbGV0ZWRNb2R1bGUgKXsJCi0gICAgICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsQ29yZVBsdWdpbi5QTFVHSU5fSUQsMCwgTkxTLmJpbmQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5jYW5Ob3RQdWJsaXNoRGVsZXRlZE1vZHVsZSxtb2R1bGVbaV0uZ2V0TmFtZSgpKSxudWxsKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBHZW5lcmljUHVibGlzaGVyIGluaXRpYWxpemVQdWJsaXNoZXIoaW50IGtpbmQsIGludCBkZWx0YUtpbmQsIElNb2R1bGVbXSBtb2R1bGUgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwdWJsaXNoZXJJZCA9IFNlcnZlclR5cGVEZWZpbml0aW9uVXRpbC5nZXRQdWJsaXNoZXJJRChtb2R1bGVbMF0sIGdldFNlcnZlckRlZmluaXRpb24oKSk7Ci0gICAgICAgIEdlbmVyaWNQdWJsaXNoZXIgcHVibGlzaGVyID0gUHVibGlzaE1hbmFnZXIuZ2V0UHVibGlzaGVyKHB1Ymxpc2hlcklkKTsgIAotICAgICAgICBpZihwdWJsaXNoZXI9PW51bGwpewotICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsQ29yZVBsdWdpbi5QTFVHSU5fSUQsMCxOTFMuYmluZChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLnVuYWJsZVRvQ3JlYXRlUHVibGlzaGVyLHB1Ymxpc2hlcklkKSxudWxsKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGlzaGVyLmluaXRpYWxpemUoIG1vZHVsZSxnZXRTZXJ2ZXIoKSwga2luZCwgZGVsdGFLaW5kICk7Ci0gICAgICAgIHJldHVybiBwdWJsaXNoZXI7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSNzdG9wKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlKSB7Ci0JCWlmIChmb3JjZSkgewotCQkJdGVybWluYXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc3RhdGUgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpIHsKLQkJCXRlcm1pbmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzaHV0ZG93bihzdGF0ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNodXRzIGRvd24gdGhlIHNlcnZlciB2aWEgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNodXRkb3duKGludCBzdGF0ZSkgewotCQlHZW5lcmljU2VydmVyUnVudGltZSBydW50aW1lID0gZ2V0UnVudGltZURlbGVnYXRlKCk7Ci0JCXRyeSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTdG9wcGluZyBTZXJ2ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHN0YXRlICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQSU5HKTsKLQkJCVN0cmluZyBjb25maWdUeXBlSUQgPSBnZXRDb25maWdUeXBlSUQoKTsgCi0JCQlJTGF1bmNoTWFuYWdlciBtZ3IgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIHR5cGUgPSBtZ3IuZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoY29uZmlnVHlwZUlEKTsKLQkJCVN0cmluZyBsYXVuY2hOYW1lID0gZ2V0U3RvcExhdW5jaE5hbWUoKTsKLQkJCVN0cmluZyB1bmlxdWVMYXVuY2hOYW1lID0gbWdyLmdlbmVyYXRlVW5pcXVlTGF1bmNoQ29uZmlndXJhdGlvbk5hbWVGcm9tKGxhdW5jaE5hbWUpOwotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZiA9IG51bGw7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbltdIGxjaCA9IG1nci5nZXRMYXVuY2hDb25maWd1cmF0aW9ucyh0eXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGNoLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGxhdW5jaE5hbWUuZXF1YWxzKGxjaFtpXS5nZXROYW1lKCkpKSB7Ci0JCQkJCWNvbmYgPSBsY2hbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IG51bGw7Ci0JCQlpZiAoY29uZiAhPSBudWxsKSB7Ci0JCQkJd2MgPSBjb25mLmdldFdvcmtpbmdDb3B5KCk7Ci0JCQl9IGVsc2UgewotCQkJCXdjID0gdHlwZS5uZXdJbnN0YW5jZShudWxsLCB1bmlxdWVMYXVuY2hOYW1lKTsKLQkJCX0KLQkJCQotCQkJLy8gVG8gc3RvcCBmcm9tIGFwcGVhcmluZyBpbiBoaXN0b3J5IGxpc3RzCi0JCQl3Yy5zZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9QUklWQVRFLCB0cnVlKTsJCQotCQkJLy8gU2V0IHRoZSBzdG9wIGF0dHJpYnV0ZSBzbyB0aGF0IHdlIGtub3cgd2UgYXJlIHN0b3BwaW5nCi0JCQl3Yy5zZXRBdHRyaWJ1dGUoQVRUUl9TVE9QLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBTZXQgdGhlIHNlcnZlciBJRCBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCBzdG9wcwotCQkJd2Muc2V0QXR0cmlidXRlKCBBVFRSX1NFUlZFUl9JRCwgdGhpcy5nZXRTZXJ2ZXIoKS5nZXRJZCgpKTsKLQkJCS8vIFNldHVwIHRoZSBsYXVuY2ggY29uZmlnIGZvciBzdG9wcGluZyB0aGUgc2VydmVyCi0JCQlzZXR1cFN0b3BMYXVuY2hDb25maWd1cmF0aW9uKHJ1bnRpbWUsIHdjKTsKLQkJCQotCQkJLy8gTGF1bmNoIHRoZSBzdG9wIGxhdW5jaCBjb25maWcKLQkJCXdjLmxhdW5jaChJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHN0b3BwaW5nIFNlcnZlciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTdHJpbmcgSUQgb2YgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIHR5cGUuCi0gICAgICogQHJldHVybiBpZAotICAgICAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnVHlwZUlEKCkgewotCQlyZXR1cm4gSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklEX0pBVkFfQVBQTElDQVRJT047Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU3RyaW5nIG5hbWUgb2YgdGhlIHN0b3AgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogQHJldHVybiBsYXVuY2huYW1lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdG9wTGF1bmNoTmFtZSgpIHsKLQkJcmV0dXJuICJHZW5lcmljU2VydmVyU3RvcHBlciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVtb3RlKCl7Ci0JCXJldHVybiAoZ2V0U2VydmVyKCkuZ2V0U2VydmVyVHlwZSgpLnN1cHBvcnRzUmVtb3RlSG9zdHMoKSYmICFTb2NrZXRVdGlsLmlzTG9jYWxob3N0KGdldFNlcnZlcigpLmdldEhvc3QoKSkgKTsKLQl9CQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciBzdG9wcGluZyB0aGUgc2VydmVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwU3RvcExhdW5jaENvbmZpZ3VyYXRpb24oR2VuZXJpY1NlcnZlclJ1bnRpbWUgcnVudGltZSwgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YykgewotCQlpZihpc1JlbW90ZSgpKS8vIERvIG5vdCBsYXVuY2ggZm9yIHJlbW90ZSBzZXJ2ZXJzLgotCQkJcmV0dXJuOwotCQkKLQkJd2Muc2V0QXR0cmlidXRlKAotCQkJCUlKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX01BSU5fVFlQRV9OQU1FLAotCQkJCWdldFNlcnZlckRlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKHRoaXMuZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFN0b3AoKS5nZXRNYWluQ2xhc3MoKSkpOwotCi0JCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gcnVudGltZS5nZXRWTUluc3RhbGwoKTsKLQkJd2Muc2V0QXR0cmlidXRlKAotCQkJCUlKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfVFlQRSwgcnVudGltZQotCQkJCQkJLmdldFZNSW5zdGFsbFR5cGVJZCgpKTsKLQkJd2Muc2V0QXR0cmlidXRlKAotCQkJCUlKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfTkFNRSwKLQkJCQl2bUluc3RhbGwuZ2V0TmFtZSgpKTsKLQotCQlzZXR1cExhdW5jaENsYXNzcGF0aCh3Yywgdm1JbnN0YWxsLCBnZXRTdG9wQ2xhc3NwYXRoKCkpOwotCi0gICAgICAgIE1hcCBlbnZpcm9uVmFycyA9IGdldEVudmlyb25tZW50VmFyaWFibGVzKGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdG9wKCkpOwotICAgICAgICBpZighZW52aXJvblZhcnMuaXNFbXB0eSgpKXsKLSAgICAgICAgCXdjLnNldEF0dHJpYnV0ZShJTGF1bmNoTWFuYWdlci5BVFRSX0VOVklST05NRU5UX1ZBUklBQkxFUyxlbnZpcm9uVmFycyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCXdjLnNldEF0dHJpYnV0ZSgKLQkJCQlJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSwKLQkJCQlnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RvcCgpLmdldFdvcmtpbmdEaXJlY3RvcnkoKSkpOwotCQl3Yy5zZXRBdHRyaWJ1dGUoCi0JCQkJSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsCi0JCQkJZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFN0b3AoKS5nZXRQcm9ncmFtQXJndW1lbnRzQXNTdHJpbmcoKSkpOwotCQl3Yy5zZXRBdHRyaWJ1dGUoCi0JCQkJSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fQVJHVU1FTlRTLAotCQkJCWdldFNlcnZlckRlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdG9wKCkuZ2V0Vm1QYXJhbWV0ZXJzQXNTdHJpbmcoKSkpOwkJCQkKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjbGFzcyBuYW1lCi0gICAgICogQHJldHVybiBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdGFydENsYXNzTmFtZSgpIHsKLSAgICAJcmV0dXJuIGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdGFydCgpLmdldE1haW5DbGFzcygpKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogU2VydmVyIGRlZmluaXRpb24KLSAgICAgKiBAcmV0dXJuIHNlcnZlcmRlZgotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2ZXJSdW50aW1lIGdldFNlcnZlckRlZmluaXRpb24oKSB7Ci0gICAgICAgIEdlbmVyaWNTZXJ2ZXIgc2VydmVyID0gKEdlbmVyaWNTZXJ2ZXIpZ2V0U2VydmVyKCkubG9hZEFkYXB0ZXIoU2VydmVyRGVsZWdhdGUuY2xhc3MsIG51bGwpOwotICAgICAgICByZXR1cm4gc2VydmVyLmdldFNlcnZlckRlZmluaXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpIHsKLSAgICAgICByZXR1cm4gKEdlbmVyaWNTZXJ2ZXJSdW50aW1lKWdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5sb2FkQWRhcHRlcihHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcyxudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgZ2V0U3RhcnRDbGFzc3BhdGgoKSB7Ci0gICAgCVN0cmluZyBjcFJlZiA9IGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdGFydCgpLmdldENsYXNzcGF0aFJlZmVyZW5jZSgpOwotICAgIAlyZXR1cm4gc2VydmVyQ2xhc3NwYXRoKGNwUmVmKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY3BSZWYKLSAgICAgKiBAcmV0dXJuIGNsYXNzcGF0aAotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IHNlcnZlckNsYXNzcGF0aChTdHJpbmcgY3BSZWYpIHsKLSAgICAJcmV0dXJuIFNlcnZlclR5cGVEZWZpbml0aW9uVXRpbC5nZXRDbGFzc3BhdGhFbnRyaWVzKGNwUmVmLCBnZXRTZXJ2ZXJEZWZpbml0aW9uKCksdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdjCi0gICAgICogQHBhcmFtIHZtSW5zdGFsbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwTGF1bmNoQ2xhc3NwYXRoKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MsIElWTUluc3RhbGwgdm1JbnN0YWxsLCBMaXN0IGNwKSB7Ci0JCS8vbWVyZ2UgZXhpc3RpbmcgY2xhc3NwYXRoIHdpdGggc2VydmVyIGNsYXNzcGF0aAotCQl0cnkgewotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGV4aXN0aW5nQ3BzID0gSmF2YVJ1bnRpbWUuY29tcHV0ZVVucmVzb2x2ZWRSdW50aW1lQ2xhc3NwYXRoKHdjKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhpc3RpbmdDcHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZihjcC5jb250YWlucyhleGlzdGluZ0Nwc1tpXSk9PWZhbHNlKXsgCi0JCQkJCWNwLmFkZChleGlzdGluZ0Nwc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotICAgIAl3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1NQQVRILCBjb252ZXJ0Q1BFbnRyeVRvTWVtZW50byhjcCkpOwotICAgIAl3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVGQVVMVF9DTEFTU1BBVEgsZmFsc2UpOwotICAgIH0KLQotCXByaXZhdGUgTGlzdCBjb252ZXJ0Q1BFbnRyeVRvTWVtZW50byhMaXN0IGNwRW50cnlMaXN0KQotCXsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChjcEVudHJ5TGlzdC5zaXplKCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNwRW50cnlMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJewotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJUnVudGltZUNsYXNzcGF0aEVudHJ5KWl0ZXJhdG9yLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQoZW50cnkuZ2V0TWVtZW50bygpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFdvcmtpbmdEaXJlY3RvcnkoKSB7Ci0gICAgCXJldHVybiBnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RhcnQoKS5nZXRXb3JraW5nRGlyZWN0b3J5KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZ3JhbUFyZ3VtZW50cygpIHsKLSAgICAJcmV0dXJuIGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdGFydCgpLmdldFByb2dyYW1Bcmd1bWVudHNBc1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIGdldEVudmlyb25tZW50VmFyaWFibGVzKExhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKXsKLSAgICAgICAgTGlzdCB2YXJpYWJsZXMgPSBjb25maWcuZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpOwotICAgICAgICBNYXAgdmFyc01hcCA9IG5ldyBIYXNoTWFwKHZhcmlhYmxlcy5zaXplKCkpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvcj0gdmFyaWFibGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0gICAgICAgIAlBcmd1bWVudFBhaXIgcGFpciA9IChBcmd1bWVudFBhaXIpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAJdmFyc01hcC5wdXQocGFpci5nZXROYW1lKCksZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMocGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhcnNNYXA7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldFZtQXJndW1lbnRzKCkgewotICAgIAlyZXR1cm4gZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFN0YXJ0KCkuZ2V0Vm1QYXJhbWV0ZXJzQXNTdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd29ya2luZ0NvcHksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZihpc1JlbW90ZSgpKS8vIE5vIGxhdW5jaCBmb3IgcmVtb3RlIHNlcnZlcnMuCi0JCQlyZXR1cm47Ci0gICAgCQotICAgIAl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfTUFJTl9UWVBFX05BTUUsCi0gICAgICAgICAgICAgICAgZ2V0U3RhcnRDbGFzc05hbWUoKSk7Ci0KLSAgICAgICAgR2VuZXJpY1NlcnZlclJ1bnRpbWUgcnVudGltZSA9IGdldFJ1bnRpbWVEZWxlZ2F0ZSgpOwotCi0gICAgICAgIElWTUluc3RhbGwgdm1JbnN0YWxsID0gcnVudGltZS5nZXRWTUluc3RhbGwoKTsKLSAgICAgICAgd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfVFlQRSwgcnVudGltZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZNSW5zdGFsbFR5cGVJZCgpKTsKLSAgICAgICAgd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfTkFNRSwKLSAgICAgICAgICAgICAgICB2bUluc3RhbGwuZ2V0TmFtZSgpKTsKLQotICAgICAgICBzZXR1cExhdW5jaENsYXNzcGF0aCh3b3JraW5nQ29weSwgdm1JbnN0YWxsLCBnZXRTdGFydENsYXNzcGF0aCgpKTsKLQotCi0gICAgICAgIHdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSwKLSAgICAgICAgICAgICAgICBnZXRXb3JraW5nRGlyZWN0b3J5KCkpOwotICAgICAgICAKLQotICAgICAgICBNYXAgZW52aXJvblZhcnMgPSBnZXRFbnZpcm9ubWVudFZhcmlhYmxlcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RhcnQoKSk7Ci0gICAgICAgIGlmKCFlbnZpcm9uVmFycy5pc0VtcHR5KCkpewotICAgICAgICAJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElMYXVuY2hNYW5hZ2VyLkFUVFJfRU5WSVJPTk1FTlRfVkFSSUFCTEVTLGVudmlyb25WYXJzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4aXN0aW5nUHJvZ0FyZ3MgID0gd29ya2luZ0NvcHkuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLCAoU3RyaW5nKW51bGwpOwotICAgICAgICBTdHJpbmcgc2VydmVyUHJvZ0FyZ3MgPSAgZ2V0UHJvZ3JhbUFyZ3VtZW50cygpOwotICAgICAgICBpZiggZXhpc3RpbmdQcm9nQXJncz09bnVsbCApIHsKLSAgICAgICAgICAgIHdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUyxzZXJ2ZXJQcm9nQXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGV4aXN0aW5nVk1BcmdzID0gd29ya2luZ0NvcHkuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywoU3RyaW5nKW51bGwpOwotICAgICAgICBTdHJpbmcgc2VydmVyVk1BcmdzPSBnZXRWbUFyZ3VtZW50cygpOwotICAgICAgICBpZiggZXhpc3RpbmdWTUFyZ3M9PW51bGwgKSB7Ci0gICAgICAgICAgICB3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fQVJHVU1FTlRTLHNlcnZlclZNQXJncyk7Ci0gICAgICAgIH0KLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0dXAgZm9yIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuIENoZWNrcyBhbGwgcG9ydHMgYXZhaWxhYmxlIAotICAgICAqIGFuZCBzZXRzIHNlcnZlciBzdGF0ZSBhbmQgbW9kZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGF1bmNoIElMYXVuY2gKLSAgICAgKiBAcGFyYW0gbGF1bmNoTW9kZSBTdHJpbmcKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBMYXVuY2goSUxhdW5jaCBsYXVuY2gsIFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJaWYgKCJ0cnVlIi5lcXVhbHMobGF1bmNoLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoQVRUUl9TVE9QLCAiZmFsc2UiKSkpICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAJCXJldHVybjsKLQotICAgIAlTdHJpbmcgaG9zdCA9IGdldFNlcnZlcigpLmdldEhvc3QoKTsKLSAgICAJU2VydmVyUG9ydFtdIHBvcnRzID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyUG9ydHMobnVsbCk7Ci0gICAgCVNlcnZlclBvcnQgc3AgPSBudWxsOwotICAgIAlpZihTb2NrZXRVdGlsLmlzTG9jYWxob3N0KGhvc3QpKXsKLQkgICAgCWZvcihpbnQgaT0wO2k8cG9ydHMubGVuZ3RoO2krKyl7Ci0JICAgIAkJc3A9IHBvcnRzW2ldOwotCSAgICAJCWlmIChTb2NrZXRVdGlsLmlzUG9ydEluVXNlKHBvcnRzW2ldLmdldFBvcnQoKSwgNSkpCi0JICAgIAkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuZXJyb3JQb3J0SW5Vc2UsSW50ZWdlci50b1N0cmluZyhzcC5nZXRQb3J0KCkpLHNwLmdldE5hbWUoKSksbnVsbCkpOwotCSAgICAJfQotICAgIAl9Ci0gICAgCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpOwotICAgIAlzZXRNb2RlKGxhdW5jaE1vZGUpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRvIHN0YXJ0IFBpbmcgdGhyZWFkIHRoYXQgd2lsbCBjaGVjayBmb3Igc3RhcnR1cCBvZiB0aGUgc2VydmVyLgotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRQaW5nVGhyZWFkKCkKLSAgICB7Ci0gICAgCXRyeSB7Ci0gICAgCQlTdHJpbmcgdXJsID0gImh0dHA6Ly8iK2dldFNlcnZlcigpLmdldEhvc3QoKTs7IC8vJE5PTi1OTFMtMSQKLSAgICAJICAJU2VydmVyUG9ydFtdIHBvcnRzID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyUG9ydHMobnVsbCk7Ci0gICAgICAgIAlTZXJ2ZXJQb3J0IHNwID0gbnVsbDsKLSAgICAJICAgIGZvcihpbnQgaT0wO2k8cG9ydHMubGVuZ3RoO2krKyl7Ci0gICAgCSAgICAJaWYocG9ydHNbaV0uZ2V0UHJvdG9jb2woKS5lcXVhbHNJZ25vcmVDYXNlKCJodHRwIikpey8vJE5PTi1OTFMtMSQKLSAgICAJICAgIAkJc3A9cG9ydHNbaV07Ci0gICAgCSAgICAJfQotICAgIAkgICAgfQotCSAgICAJaWYoc3A9PW51bGwpewotCSAgICAJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNhbid0IHBpbmcgZm9yIHNlcnZlciBzdGFydHVwLiIpOyAvLyROT04tTkxTLTEkCi0JICAgIAkJcmV0dXJuOwotCSAgICAJfQotICAgICAgICAJaW50IHBvcnQgPSBzcC5nZXRQb3J0KCk7Ci0gICAgCQlpZiAocG9ydCAhPSA4MCkKLSAgICAJCQl1cmwgKz0gIjoiICsgcG9ydDsgLy8kTk9OLU5MUy0xJAotICAgIAkJcGluZyA9IG5ldyBQaW5nVGhyZWFkKGdldFNlcnZlcigpLCB1cmwsIHRoaXMpOwotICAgIAl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgIAkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ2FuJ3QgcGluZyBmb3Igc2VydmVyIHN0YXJ0dXAuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJfSAgCQotICAgIH0KLSAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFByb2Nlc3MoZmluYWwgSVByb2Nlc3MgbmV3UHJvY2VzcykgewotICAgIAlpZiAocHJvY2VzcyAhPSBudWxsKQotICAgIAkJcmV0dXJuOwotICAgIAlpZihwcm9jZXNzTGlzdGVuZXIhPW51bGwpCi0gICAgCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0gICAgCWlmIChuZXdQcm9jZXNzPT1udWxsKQotICAgIAkJcmV0dXJuOwotICAgIAlwcm9jZXNzID0gbmV3UHJvY2VzczsKLSAgICAJcHJvY2Vzc0xpc3RlbmVyID0gbmV3IElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIoKSB7Ci0gICAgCQlwdWJsaWMgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10gZXZlbnRzKSB7Ci0gICAgCQkJaWYgKGV2ZW50cyAhPSBudWxsKSB7Ci0gICAgCQkJCWludCBzaXplID0gZXZlbnRzLmxlbmd0aDsKLSAgICAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAJCQkJCWlmIChwcm9jZXNzIT0gbnVsbCAmJiAgcHJvY2Vzcy5lcXVhbHMoZXZlbnRzW2ldLmdldFNvdXJjZSgpKSAmJiBldmVudHNbaV0uZ2V0S2luZCgpID09IERlYnVnRXZlbnQuVEVSTUlOQVRFKSB7Ci0gICAgCQkJCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZURlYnVnRXZlbnRMaXN0ZW5lcih0aGlzKTsKLSAgICAJCQkJCQlzdG9wSW1wbCgpOwotICAgIAkJCQkJfQotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9OwotICAgIAlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYWRkRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RvcEltcGwoKSB7Ci0gICAgCWlmIChwaW5nICE9IG51bGwpIHsKLSAgICAJCXBpbmcuc3RvcCgpOwotICAgIAkJcGluZyA9IG51bGw7Ci0gICAgCX0KLSAgICAJaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotICAgIAkJcHJvY2VzcyA9IG51bGw7Ci0gICAgCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0gICAgCQlwcm9jZXNzTGlzdGVuZXIgPSBudWxsOwotICAgIAl9Ci0gICAgCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVybWluYXRlcyB0aGUgc2VydmVyLgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYmVmb3JlIGEgcHJvY2VzcyBjcmVhdGVkIHdoaWxlIHNldHRpbmcgdXAgdGhlIAotICAgICAqIGxhdW5jaCBjb25maWcuIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRlcm1pbmF0ZSgpIHsKLSAgICAJaWYgKGdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotICAgIAkJcmV0dXJuOwotICAgIAotICAgIAl0cnkgewotICAgIAkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVE9QUElORyk7Ci0gICAgCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJLaWxsaW5nIHRoZSBTZXJ2ZXIgcHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCi0gICAgCQlpZiAocHJvY2VzcyAhPSBudWxsICYmICFwcm9jZXNzLmlzVGVybWluYXRlZCgpKSB7Ci0gICAgCQkJcHJvY2Vzcy50ZXJtaW5hdGUoKTsKLSAgICAJCQkKLSAgICAJCX0KLSAgICAJCXN0b3BJbXBsKCk7Ci0gICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBraWxsaW5nIHRoZSBwcm9jZXNzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAJfQotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBnZXRTdG9wQ2xhc3NwYXRoKCkgewotICAgIAlTdHJpbmcgY3BSZWYgPSBnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RvcCgpLmdldENsYXNzcGF0aFJlZmVyZW5jZSgpOwotICAgIAlyZXR1cm4gc2VydmVyQ2xhc3NwYXRoKGNwUmVmKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdWJsaXNoRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJTW9kdWxlW10gbW9kdWxlcyA9IHRoaXMuZ2V0U2VydmVyKCkuZ2V0TW9kdWxlcygpOwotICAgICAgICBib29sZWFuIGFsbHB1Ymxpc2hlZD0gdHJ1ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIAlpZih0aGlzLmdldFNlcnZlcigpLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShuZXcgSU1vZHVsZVtde21vZHVsZXNbaV19KSE9SVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpCi0gICAgICAgICAgICAgICAgYWxscHVibGlzaGVkPWZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmKGFsbHB1Ymxpc2hlZCkKLSAgICAgICAgICAgIHNldFNlcnZlclB1Ymxpc2hTdGF0ZShJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSk7Ci0gICAgfQotICAgIAotIAlwcm90ZWN0ZWQgdm9pZCBzZXRTZXJ2ZXJTdGFydGVkKCkgewotIAkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVEVEKTsKLSAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmYzRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gZ2V0IG1lc3NhZ2VzCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTkRMRT0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5jZWxOb1B1Ymxpc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kdWxlTm90Q29tcGF0aWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclBvcnRJblVzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckpSRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vU2VydmVyVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vQ2xhc3NwYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTWlzc2luZ0NsYXNzcGF0aEVudHJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUmVtb3ZlTW9kdWxlQW50cHVibGlzaGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaEFudHB1Ymxpc2hlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21tYW5kbGluZVVuc3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtpbmdkaXJVbnNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckxhdW5jaGluZ0V4ZWN1dGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlcm5hbFN0b3BMYXVuY2hlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWJ1Z1BvcnRVbnNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclN0YXJ0aW5nRXh0ZXJuYWxEZWJ1Z2dpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFBhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVuTW9kZU5vdFN1cHBvcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmFibGVUb0NyZWF0ZVB1Ymxpc2hlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5Ob3RQdWJsaXNoRGVsZXRlZE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbnRMYXVuY2hlck1pc3Npbmc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYXR0YWNoaW5nVG9FeHRlcm5hbEdlbmVyaWNTZXJ2ZXI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyaWZ5aW5nRXh0ZXJuYWxTZXJ2ZXJEZWJ1Z2dpbmdMYXVuY2hBdHRyaWJ1dGVzOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVybmFsU2VydmVyRGVidWdDb25uZWN0b3JOb3RTcGVjaWZpZWQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRpbmdFeHRlcm5hbFNlcnZlckRlYnVnZ2luZ1NvdXJjZUxvY2F0b3I7Ci0gICAgCi0JCi0Jc3RhdGljewotCQkgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoUkVTT1VSQ0VfQlVORExFLCBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWU2ODVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0jIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgICAgICAgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZXJyb3JKUkU9SW52YWxpZCBKUkUKLWVycm9yTm9TZXJ2ZXJUeXBlPU5vIHNlcnZlciB0eXBlIGRlZmluaXRpb24KLWVycm9yTWlzc2luZ0NsYXNzcGF0aEVudHJ5PU1pc3NpbmcgY2xhc3NwYXRoIGVudHJ5IHswfQotZXJyb3JQb3J0SW5Vc2U9U2VydmVyIHBvcnQgSW4gVXNlIHswfS17MX0KLWNhbmNlbE5vUHVibGlzaD1Ob3RoaW5nIHRvIHB1Ymxpc2gKLW1vZHVsZU5vdENvbXBhdGlibGU9TW9kdWxlIHR5cGUgaXMgbm90IGNvbXBhdGlibGUKLWVycm9yTm9DbGFzc3BhdGg9Tm8gY2xhc3NwYXRoIGlzIGRlZmluZWQKLWVycm9yUmVtb3ZlTW9kdWxlQW50cHVibGlzaGVyPSBSZW1vdmUgbW9kdWxlIGZhaWxlZCB1c2luZyBBbnQgcHVibGlzaGVyCi1lcnJvclB1Ymxpc2hBbnRwdWJsaXNoZXI9IFB1Ymxpc2ggZmFpbGVkIHVzaW5nIEFudCBwdWJsaXNoZXIKLWNvbW1hbmRsaW5lVW5zcGVjaWZpZWQ9RXhlY3V0YWJsZSBjb21tYW5kbGluZSBpcyB1bnNwZWNpZmllZAotd29ya2luZ2RpclVuc3BlY2lmaWVkPVdvcmtpbmcgZGlyZWN0b3J5IGlzIHVuc3BlY2lmaWVkIG9yIGludmFsaWQKLWVycm9yTGF1bmNoaW5nRXhlY3V0YWJsZT1FcnJvciBsYXVuY2hpbmcgZXhlY3V0YWJsZQotbWlzc2luZ1NlcnZlcj1TZXJ2ZXIgZG9lcyBub3QgZXhpc3QKLWV4dGVybmFsU3RvcExhdW5jaGVyPUV4dGVybmFsTGF1bmNoU3RvcHBlcgotZGVidWdQb3J0VW5zcGVjaWZpZWQ9RGVidWdnaW5nIHBvcnQgaXMgdW5zcGVjaWZpZWQKLWVycm9yU3RhcnRpbmdFeHRlcm5hbERlYnVnZ2luZz1FcnJvciBsYXVuY2hpbmcgcmVtb3RlIGRlYnVnZ2luZyBmb3IgZXh0ZXJuYWwgc2VydmVyLCBjaGFuZ2luZyB0byBub24tZGVidWdnaW5nIG1vZGUuXG5QbGVhc2UgY2hlY2sgdGhlIGRlYnVnIHBvcnQgc2V0dGluZyBhbmQgZW5zdXJlIHRoYXQgdGhlIHNwZWNpZmllZCAnc3RhcnQnIGV4ZWN1dGFibGUgbGF1bmNoZXMgdGhlIHNlcnZlciB3aXRoIGRlYnVnZ2luZyBlbmFibGVkCi1pbnZhbGlkUGF0aCA9IHswfSBpcyBub3QgdmFsaWQKLXJ1bk1vZGVOb3RTdXBwb3J0ZWQ9IFNlbGVjdGVkIFZNIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBtb2RlCi11bmFibGVUb0NyZWF0ZVB1Ymxpc2hlcj1VbmFibGUgdG8gY3JlYXRlIHB1Ymxpc2hlciB7MH0KLWNhbk5vdFB1Ymxpc2hEZWxldGVkTW9kdWxlPUNhbiBub3QgcHVibGlzaCBiZWNhdXNlIG1vZHVsZSB7MH0gaXMgY2xvc2VkIG9yIGRlbGV0ZWQKLWFudExhdW5jaGVyTWlzc2luZz1BbnQgbGF1bmNoZXIgaXMgbWlzc2luZyBvciBkaXNhYmxlZAotYXR0YWNoaW5nVG9FeHRlcm5hbEdlbmVyaWNTZXJ2ZXI9QXR0YWNoaW5nIHRvIGV4dGVybmFsIGdlbmVyaWMgc2VydmVyIHswfS4KLXZlcmlmeWluZ0V4dGVybmFsU2VydmVyRGVidWdnaW5nTGF1bmNoQXR0cmlidXRlcz1WZXJpZnlpbmcgZGVidWdnaW5nIGxhdW5jaCBhdHRyaWJ1dGVzLgotZXh0ZXJuYWxTZXJ2ZXJEZWJ1Z0Nvbm5lY3Rvck5vdFNwZWNpZmllZD1EZWJ1Z2dpbmcgY29ubmVjdG9yIG5vdCBzcGVjaWZpZWQuCi1jcmVhdGluZ0V4dGVybmFsU2VydmVyRGVidWdnaW5nU291cmNlTG9jYXRvcj1DcmVhdGluZyBkZWJ1Z2dpbmcgc291cmNlIGxvY2F0b3IuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Y2YxZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5BYnN0cmFjdEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5FeGVjdXRpb25Bcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1SdW5uZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQcm9maWxlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotLyoqCi0gKiBTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uIGZvciB0aGUgZ2VuZXJpYyBzZXJ2ZXIuCi0gKgotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlI2xhdW5jaChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2gsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwKLQkJCUlMYXVuY2ggbGF1bmNoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWwuZ2V0U2VydmVyKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCWFib3J0KEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMubWlzc2luZ1NlcnZlciwgbnVsbCwKLQkJCQkJSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVSUl9JTlRFUk5BTF9FUlJPUik7Ci0JCX0KLQkJCi0vLwkJQ29tbWVudGVkIHVudGlsIGJ1ZyAyMTA4NTkgaXMgcmVzb2x2ZWQKLS8vCQlpZiAoc2VydmVyLnNob3VsZFB1Ymxpc2goKSAmJiBTZXJ2ZXJDb3JlLmlzQXV0b1B1Ymxpc2hpbmcoKSkKLS8vCQkJc2VydmVyLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBtb25pdG9yKTsKLQkJCi0JCUdlbmVyaWNTZXJ2ZXJCZWhhdmlvdXIgZ2VuZXJpY1NlcnZlciA9IChHZW5lcmljU2VydmVyQmVoYXZpb3VyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG51bGwpOwotCi0JCXRyeSB7Ci0JCQlnZW5lcmljU2VydmVyLnNldHVwTGF1bmNoKGxhdW5jaCwgbW9kZSwgbW9uaXRvcik7Ci0JCQlpZihnZW5lcmljU2VydmVyLmdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKS5zdXBwb3J0c1JlbW90ZUhvc3RzKCkgJiYgIVNvY2tldFV0aWwuaXNMb2NhbGhvc3QoZ2VuZXJpY1NlcnZlci5nZXRTZXJ2ZXIoKS5nZXRIb3N0KCkpKXsKLQkJCS8vIG5vIGxhdW5jaCBmb3IgcmVtb3RlIHNlcnZlcnMKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVN0cmluZyBtYWluVHlwZU5hbWUgPSBnZW5lcmljU2VydmVyLmdldFN0YXJ0Q2xhc3NOYW1lKCk7Ci0JCQlJVk1JbnN0YWxsIHZtID0gdmVyaWZ5Vk1JbnN0YWxsKGNvbmZpZ3VyYXRpb24pOwotCQkJSVZNUnVubmVyIHJ1bm5lciA9IHZtLmdldFZNUnVubmVyKG1vZGUpOwotCQkJCi0JCQlpZihydW5uZXIgPT0gbnVsbCAmJiBJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKXsKLQkJCQlydW5uZXIgPSB2bS5nZXRWTVJ1bm5lcihJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0JCQl9Ci0JCQlpZihydW5uZXIgPT0gbnVsbCl7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLENvcmVQbHVnaW4uUExVR0lOX0lELDAsR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5ydW5Nb2RlTm90U3VwcG9ydGVkLG51bGwpKTsKLQkJCX0KLQkJCUZpbGUgd29ya2luZ0RpciA9IHZlcmlmeVdvcmtpbmdEaXJlY3RvcnkoY29uZmlndXJhdGlvbik7Ci0JCQlTdHJpbmcgd29ya2luZ0Rpck5hbWUgPSBudWxsOwotCQkJaWYgKHdvcmtpbmdEaXIgIT0gbnVsbCkKLQkJCQl3b3JraW5nRGlyTmFtZSA9IHdvcmtpbmdEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJCS8vIFByb2dyYW0gJiBWTSBhcmdzCi0JCQlTdHJpbmcgcGdtQXJncyA9IGdldFByb2dyYW1Bcmd1bWVudHMoY29uZmlndXJhdGlvbik7Ci0JCQlTdHJpbmcgdm1BcmdzID0gZ2V0Vk1Bcmd1bWVudHMoY29uZmlndXJhdGlvbik7Ci0JCQlTdHJpbmdbXSBlbnZwID0gZ2V0RW52aXJvbm1lbnQoY29uZmlndXJhdGlvbik7Ci0JCQkKLQkJCUV4ZWN1dGlvbkFyZ3VtZW50cyBleGVjQXJncyA9IG5ldyBFeGVjdXRpb25Bcmd1bWVudHModm1BcmdzLCBwZ21BcmdzKTsKLQotCQkJLy8gVk0tc3BlY2lmaWMgYXR0cmlidXRlcwotCQkJTWFwIHZtQXR0cmlidXRlc01hcCA9IGdldFZNU3BlY2lmaWNBdHRyaWJ1dGVzTWFwKGNvbmZpZ3VyYXRpb24pOwotCi0JCQkvLyBDbGFzc3BhdGgKLQkJCVN0cmluZ1tdIGNsYXNzcGF0aCA9IGdldENsYXNzcGF0aChjb25maWd1cmF0aW9uKTsKLQotCQkJLy8gQ3JlYXRlIFZNIGNvbmZpZwotCQkJVk1SdW5uZXJDb25maWd1cmF0aW9uIHJ1bkNvbmZpZyA9IG5ldyBWTVJ1bm5lckNvbmZpZ3VyYXRpb24oCi0JCQkJCW1haW5UeXBlTmFtZSwgY2xhc3NwYXRoKTsKLQkJCXJ1bkNvbmZpZy5zZXRQcm9ncmFtQXJndW1lbnRzKGV4ZWNBcmdzLmdldFByb2dyYW1Bcmd1bWVudHNBcnJheSgpKTsKLQkJCXJ1bkNvbmZpZy5zZXRWTUFyZ3VtZW50cyhleGVjQXJncy5nZXRWTUFyZ3VtZW50c0FycmF5KCkpOwotCQkJcnVuQ29uZmlnLnNldFdvcmtpbmdEaXJlY3Rvcnkod29ya2luZ0Rpck5hbWUpOwotCQkJcnVuQ29uZmlnLnNldEVudmlyb25tZW50KGVudnApOwotCQkJcnVuQ29uZmlnLnNldFZNU3BlY2lmaWNBdHRyaWJ1dGVzTWFwKHZtQXR0cmlidXRlc01hcCk7Ci0JCQkKLQkJCS8vIEJvb3RwYXRoCi0JCQlTdHJpbmdbXSBib290cGF0aCA9IGdldEJvb3RwYXRoKGNvbmZpZ3VyYXRpb24pOwotCQkJaWYgKGJvb3RwYXRoICE9IG51bGwgJiYgYm9vdHBhdGgubGVuZ3RoID4gMCkKLQkJCQlydW5Db25maWcuc2V0Qm9vdENsYXNzUGF0aChib290cGF0aCk7Ci0JCQkKLQkJCXNldERlZmF1bHRTb3VyY2VMb2NhdG9yKGxhdW5jaCwgY29uZmlndXJhdGlvbik7Ci0JCQkKLQkJCWlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU2VydmVyUHJvZmlsZXJEZWxlZ2F0ZS5jb25maWd1cmVQcm9maWxpbmcobGF1bmNoLCB2bSwgcnVuQ29uZmlnLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCWdlbmVyaWNTZXJ2ZXIuc3RvcEltcGwoKTsKLQkJCQkJdGhyb3cgY2U7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBMYXVuY2ggdGhlIGNvbmZpZ3VyYXRpb24KLQkJCWdlbmVyaWNTZXJ2ZXIuc3RhcnRQaW5nVGhyZWFkKCk7Ci0JCQlydW5uZXIucnVuKHJ1bkNvbmZpZywgbGF1bmNoLCBtb25pdG9yKTsKLQkJCWdlbmVyaWNTZXJ2ZXIuc2V0UHJvY2VzcyhsYXVuY2guZ2V0UHJvY2Vzc2VzKClbMF0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwiZXJyb3IgbGF1bmNoaW5nIGdlbmVyaWMgc2VydmVyIixlKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2VuZXJpY1NlcnZlci50ZXJtaW5hdGUoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaHJvd3MgYSBjb3JlIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBvcHRpb25hbAotCSAqIGV4Y2VwdGlvbi4gVGhlIGV4Y2VwdGlvbidzIHN0YXR1cyBjb2RlIHdpbGwgaW5kaWNhdGUgYW4gZXJyb3IuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24gY2F1c2Ugb2YgdGhlIGVycm9yLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCB1bmRlcmx5aW5nCi0JICogIGV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFib3J0KFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uLCBpbnQgY29kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBjb2RlLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2ZWVjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuSHR0cExhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuV2ViUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkVKQkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkpuZGlMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5KbmRpT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLS8qKgotICogTGF1bmNoYWJsZSBhZGFwdGVyIGRlbGVnYXRlIGZvciBnZW5lcmljIHNlcnZlcnMuCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbiAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIGV4dGVuZHMgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTkFNSU5HX1BST1ZJREVSX1VSTF9QUk9QS0VZID0gImphdmEubmFtaW5nLnByb3ZpZGVyLnVybCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9OQU1JTkdfRkFDVE9SWV9JTklUSUFMX1BST1BLRVkgPSAiamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBAc2VlIElMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlI2dldExhdW5jaGFibGUoSVNlcnZlciwgSU1vZHVsZU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVPYmplY3QpIHsKLQkJU2VydmVyRGVsZWdhdGUgZGVsZWdhdGUgPSAoU2VydmVyRGVsZWdhdGUpc2VydmVyLmxvYWRBZGFwdGVyKFNlcnZlckRlbGVnYXRlLmNsYXNzLG51bGwpOwotCQlpZiAoIShkZWxlZ2F0ZSBpbnN0YW5jZW9mIEdlbmVyaWNTZXJ2ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICgobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgU2VydmxldCkgfHwobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgV2ViUmVzb3VyY2UpKQotICAgICAgICAgICAgcmV0dXJuIHByZXBhcmVIdHRwTGF1bmNoYWJsZShtb2R1bGVPYmplY3QsIGRlbGVnYXRlKTsKLQkJCi0gICAgICAgIGlmKChtb2R1bGVPYmplY3QgaW5zdGFuY2VvZiBFSkJCZWFuKSB8fCAobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgSm5kaU9iamVjdCkpCi0gICAgICAgICAgICByZXR1cm4gcHJlcGFyZUpuZGlMYXVuY2hhYmxlKG1vZHVsZU9iamVjdCxkZWxlZ2F0ZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotICAgIHByaXZhdGUgT2JqZWN0IHByZXBhcmVKbmRpTGF1bmNoYWJsZShJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlT2JqZWN0LCBTZXJ2ZXJEZWxlZ2F0ZSBkZWxlZ2F0ZSkgewotICAgICAgICBKbmRpTGF1bmNoYWJsZSBsYXVuY2hhYmxlID0gbnVsbDsKLSAgICAgICAgR2VuZXJpY1NlcnZlciBnZW5lcmljU2VydmVyID0gKEdlbmVyaWNTZXJ2ZXIpZGVsZWdhdGU7Ci0gICAgICAgIFNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiA9IGdlbmVyaWNTZXJ2ZXIuZ2V0U2VydmVyRGVmaW5pdGlvbigpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMucHV0KEpBVkFfTkFNSU5HX0ZBQ1RPUllfSU5JVElBTF9QUk9QS0VZLGRlZmluaXRpb24uZ2V0Sm5kaUNvbm5lY3Rpb24oKS5nZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoKSk7Ci0gICAgICAgIHByb3BzLnB1dChKQVZBX05BTUlOR19QUk9WSURFUl9VUkxfUFJPUEtFWSxkZWZpbml0aW9uLmdldEpuZGlDb25uZWN0aW9uKCkuZ2V0UHJvdmlkZXJVcmwoKSk7Ci0gICAgICAgIExpc3QganBzID0gZGVmaW5pdGlvbi5nZXRKbmRpQ29ubmVjdGlvbigpLmdldEpuZGlQcm9wZXJ0eSgpOwotICAgICAgICBJdGVyYXRvciBwcm9wc0l0ID1qcHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUocHJvcHNJdC5oYXNOZXh0KCkpewotICAgICAgICAgICAgQXJndW1lbnRQYWlyIHByb3AgPSAoQXJndW1lbnRQYWlyKXByb3BzSXQubmV4dCgpOwotICAgICAgICAgICAgcHJvcHMucHV0KHByb3AuZ2V0TmFtZSgpLHByb3AuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIEVKQkJlYW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVKQkJlYW4gYmVhbiA9IChFSkJCZWFuKW1vZHVsZU9iamVjdDsKLSAgICAgICAgICAgIGxhdW5jaGFibGUgPSBuZXcgSm5kaUxhdW5jaGFibGUocHJvcHMsYmVhbi5nZXRKbmRpTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZihtb2R1bGVPYmplY3QgaW5zdGFuY2VvZiBKbmRpT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBKbmRpT2JqZWN0IGpuZGkgPSAoSm5kaU9iamVjdCltb2R1bGVPYmplY3Q7Ci0gICAgICAgICAgICBsYXVuY2hhYmxlID0gbmV3IEpuZGlMYXVuY2hhYmxlKHByb3BzLGpuZGkuZ2V0Sm5kaU5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxhdW5jaGFibGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1vZHVsZU9iamVjdAotICAgICAqIEBwYXJhbSBkZWxlZ2F0ZQotICAgICAqIEByZXR1cm4gb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgcHJlcGFyZUh0dHBMYXVuY2hhYmxlKElNb2R1bGVBcnRpZmFjdCBtb2R1bGVPYmplY3QsIFNlcnZlckRlbGVnYXRlIGRlbGVnYXRlKSB7Ci0gICAgICAgIHRyeSB7Ci0JCQlVUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpIGRlbGVnYXRlKS5nZXRNb2R1bGVSb290VVJMKG1vZHVsZU9iamVjdC5nZXRNb2R1bGUoKSk7Ci0JCQkKLQkJCVRyYWNlLnRyYWNlKCJyb290OiAiICsgdXJsKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgU2VydmxldCkgewotCQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBtb2R1bGVPYmplY3Q7Ci0JCQkJaWYgKHNlcnZsZXQuZ2V0QWxpYXMoKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gc2VydmxldC5nZXRBbGlhcygpOwotCQkJCQlpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLQkJCQkJdXJsID0gbmV3IFVSTCh1cmwsIHBhdGgpOwotCQkJCX0gZWxzZQotCQkJCQl1cmwgPSBuZXcgVVJMKHVybCwgInNlcnZsZXQvIiArIHNlcnZsZXQuZ2V0U2VydmxldENsYXNzTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChtb2R1bGVPYmplY3QgaW5zdGFuY2VvZiBXZWJSZXNvdXJjZSkgewotCQkJCVdlYlJlc291cmNlIHJlc291cmNlID0gKFdlYlJlc291cmNlKSBtb2R1bGVPYmplY3Q7Ci0JCQkJU3RyaW5nIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQlUcmFjZS50cmFjZSgicGF0aDogIiArIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLnN0YXJ0c1dpdGgoIi8iKSAmJiBwYXRoLmxlbmd0aCgpID4gMCkgLy8kTk9OLU5MUy0xJAotCQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmxlbmd0aCgpID4gMCkKLQkJCQkJdXJsID0gbmV3IFVSTCh1cmwsIHBhdGgpOwotCQkJfSAKLQkJCXJldHVybiBuZXcgSHR0cExhdW5jaGFibGUodXJsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKCJFcnJvciBnZXR0aW5nIFVSTCBmb3IgIiArIG1vZHVsZU9iamVjdCwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclJ1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZTJkN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGU7Ci0vKioKLSAqIEdlbmVyaWMgc2VydmVyIHJ1bnRpbWUgc3VwcG9ydC4KLSAqCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlclJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lRGVsZWdhdGUgaW1wbGVtZW50cyBJSmF2YVJ1bnRpbWUKLXsKLQkvKioKLQkgKiBTZXJ2ZXIgZGVmaW5pdGlvbiBhdHRyaWJ1dGUgaWQgaW4gdGhlIHNlcnZlciBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0RFRklOSVRJT05fSUQgPSAic2VydmVyX2RlZmluaXRpb25faWQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogU2VydmVyIGluc3RhbmNlIHByb3BlcnRpZXMgYXR0cmlidXRlIGlkIG9uIHNlcnZlciBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0lOU1RBTkNFX1BST1BFUlRJRVMgPSAiZ2VuZXJpY19zZXJ2ZXJfaW5zdGFuY2VfcHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVk1fSU5TVEFMTF9UWVBFX0lEID0gInZtLWluc3RhbGwtdHlwZS1pZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX0lEID0gInZtLWluc3RhbGwtaWQiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZtIHR5cGUgaWQKLQkgKiBAcmV0dXJuIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWTUluc3RhbGxUeXBlSWQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQsIChTdHJpbmcpbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIElzIHVzZSBkZWZhdWx0IFZNIHNlbGVjdGVkCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2luZ0RlZmF1bHRKUkUoKSB7Ci0JCXJldHVybiBnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyBWTSBpZAotCSAqIEByZXR1cm4gaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZNSW5zdGFsbElkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgKFN0cmluZyludWxsKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUdlbmVyaWNSdW50aW1lI2dldFZNSW5zdGFsbCgpCi0JICovCi0JcHVibGljIElWTUluc3RhbGwgZ2V0Vk1JbnN0YWxsKCkgewotCQlpZiAoZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgPT0gbnVsbCkKLQkJCXJldHVybiBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0JCXRyeSB7Ci0JCQlJVk1JbnN0YWxsVHlwZSB2bUluc3RhbGxUeXBlID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZShnZXRWTUluc3RhbGxUeXBlSWQoKSk7Ci0JCQlJVk1JbnN0YWxsW10gdm1JbnN0YWxscyA9IHZtSW5zdGFsbFR5cGUuZ2V0Vk1JbnN0YWxscygpOwotCQkJaW50IHNpemUgPSB2bUluc3RhbGxzLmxlbmd0aDsKLQkJCVN0cmluZyBpZCA9IGdldFZNSW5zdGFsbElkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChpZC5lcXVhbHModm1JbnN0YWxsc1tpXS5nZXRJZCgpKSkKLQkJCQkJcmV0dXJuIHZtSW5zdGFsbHNbaV07Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUdlbmVyaWNSdW50aW1lI3ZhbGlkYXRlKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLQkJaWYgKGdldFZNSW5zdGFsbCgpID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9ySlJFLCBudWxsKTsKLQkJfQotCQlTZXJ2ZXJSdW50aW1lIHNlcnZlclR5cGVEZWZpbml0aW9uID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgaWYoc2VydmVyVHlwZURlZmluaXRpb24gPT0gbnVsbCkgewotCQkgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsIEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuZXJyb3JOb1NlcnZlclR5cGUsIG51bGwpOwotICAgICAgICB9Ci0JCWlmKHNlcnZlclR5cGVEZWZpbml0aW9uLmdldENsYXNzcGF0aCgpPT0gbnVsbCB8fCBzZXJ2ZXJUeXBlRGVmaW5pdGlvbi5nZXRDbGFzc3BhdGgoKS5zaXplKCk8MSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAgLEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuZXJyb3JOb0NsYXNzcGF0aCxudWxsKTsKLQkJfQotICAgICAgICByZXR1cm4gdmFsaWRhdGVDbGFzc3BhdGhzKHNlcnZlclR5cGVEZWZpbml0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgYWxsIGRlZmluZWQgY2xhc3NwYXRocy4KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUNsYXNzcGF0aHMoU2VydmVyUnVudGltZSBzZXJ2ZXJUeXBlRGVmaW5pdGlvbikgewotCQlJdGVyYXRvciBjcExpc3QgID0gc2VydmVyVHlwZURlZmluaXRpb24uZ2V0Q2xhc3NwYXRoKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGNwTGlzdC5oYXNOZXh0KCkpIHsKLQkJCUNsYXNzcGF0aCBjcHRoID0gKENsYXNzcGF0aCkgY3BMaXN0Lm5leHQoKTsKLQkgICAgICAgIGlmKGNwdGguZ2V0QXJjaGl2ZSgpPT0gbnVsbCB8fCBjcHRoLmdldEFyY2hpdmUoKS5zaXplKCk8MSkKLQkgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCAsR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvck5vQ2xhc3NwYXRoLG51bGwpOwotCQkJSXRlcmF0b3IgYXJjaEl0ZXIgPSBjcHRoLmdldEFyY2hpdmUoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGFyY2hJdGVyLmhhc05leHQoKSkgewotCQkJCUFyY2hpdmVUeXBlIGFyY2ggPSAoQXJjaGl2ZVR5cGUpIGFyY2hJdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcgYXJjUGF0aCA9IHNlcnZlclR5cGVEZWZpbml0aW9uLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoYXJjaC5nZXRQYXRoKCkpOwotCQkgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGFyY1BhdGgpOwotCQkgICAgICAgICAgICBpZihmLmV4aXN0cygpPT1mYWxzZSkKLQkJICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwICxOTFMuYmluZChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yTWlzc2luZ0NsYXNzcGF0aEVudHJ5LGYuZ2V0UGF0aCgpKSxudWxsKTsJCi0JCQl9Ci0JCX0KLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTZXJ2ZXJUeXBlRGVmaW5pdGlvbiBmb3IgdGhpcyBydW50aW1lLiAKLQkgKiBQb3B1bGF0ZWQgd2l0aCB0aGUgdXNlciBwcm9wZXJ0aWVzIGlmIGV4aXN0cy4gCi0JICogCi0JICogQHJldHVybiBwb3B1bGF0ZWQgU2VydmVyVHlwZURlZmluaXRpb24KLQkgKi8KLQlwdWJsaWMgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbigpCi0JewotCSAgIFN0cmluZyBpZD0gIGdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JICAgTWFwIHByb3BlcnRpZXMgPSBnZXRBdHRyaWJ1dGUoU0VSVkVSX0lOU1RBTkNFX1BST1BFUlRJRVMsKE1hcCludWxsKTsKLQkgICBpZihpZD09bnVsbCkKLQkgICAgICAgcmV0dXJuIG51bGw7Ci0JICAgcmV0dXJuIENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcigpLmdldFNlcnZlclJ1bnRpbWVEZWZpbml0aW9uKGlkLHByb3BlcnRpZXMpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRWTSB0byBiZSB1c2VkCi0JICogQHBhcmFtIHZtSW5zdGFsbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZNSW5zdGFsbChJVk1JbnN0YWxsIHZtSW5zdGFsbCkgewotCQlpZiAodm1JbnN0YWxsID09IG51bGwpIHsKLQkJCXNldFZNSW5zdGFsbChudWxsLCBudWxsKTsKLQkJfSBlbHNlCi0JCQlzZXRWTUluc3RhbGwodm1JbnN0YWxsLmdldFZNSW5zdGFsbFR5cGUoKS5nZXRJZCgpLCB2bUluc3RhbGwuZ2V0SWQoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRWTUluc3RhbGwoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGlkKSB7Ci0JCWlmICh0eXBlSWQgPT0gbnVsbCkKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgKFN0cmluZyludWxsKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9UWVBFX0lELCB0eXBlSWQpOwotCQkKLQkJaWYgKGlkID09IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKW51bGwpOwotCQllbHNlCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCBpZCk7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybiBpbnN0YW5jZSBwcm9lcnRpZXMKLQkgKiBAcmV0dXJuIHByb3BlcnR5IG1hcAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFNFUlZFUl9JTlNUQU5DRV9QUk9QRVJUSUVTLCBuZXcgSGFzaE1hcCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBzZXJ2ZXJkZWYgaWQKLQkgKiBAcmV0dXJuIHNlcnZlcmRlZiBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyRGVmaW5pdGlvbklkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFNFUlZFUl9ERUZJTklUSU9OX0lELCAoU3RyaW5nKSBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogc2V0IGluc3RhbmNlIHByb3BlcnRpZXMKLQkgKiBAcGFyYW0gbWFwCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKE1hcCBtYXApIHsKLQkJc2V0QXR0cmlidXRlKFNFUlZFUl9JTlNUQU5DRV9QUk9QRVJUSUVTLCBtYXApOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgc2VydmVyZGVmIGlkCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJEZWZpbml0aW9uSWQoU3RyaW5nIHMpIHsKLQkJc2V0QXR0cmlidXRlKFNFUlZFUl9ERUZJTklUSU9OX0lELCBzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgcHJvcHMgPSB0aGlzLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKCkuZ2V0UHJvcGVydHkoKTsKLSAJCU1hcCBpbnN0YW5jZVByb3BzTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAJCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb3BzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUHJvcGVydHkgZWxlbWVudCA9IChQcm9wZXJ0eSkgaXRlci5uZXh0KCk7Ci0JCQlpZihQcm9wZXJ0eS5DT05URVhUX1JVTlRJTUUuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldENvbnRleHQoKSkpCi0JCQkJaW5zdGFuY2VQcm9wc01hcC5wdXQoZWxlbWVudC5nZXRJZCgpLCBlbGVtZW50LmdldERlZmF1bHQoKSk7Ci0JCX0KLSAJCXNldFNlcnZlckluc3RhbmNlUHJvcGVydGllcyhpbnN0YW5jZVByb3BzTWFwKTsKLQotCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclJ1bnRpbWVUYXJnZXRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUnVudGltZVRhcmdldEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwYTFlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUnVudGltZVRhcmdldEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLS8qKgotICogUHJvdmlkZXMgdGhlIENsYXNzcGF0aCBjb250YWluZXJzIHRvIGJlIGFkZGVkIGludG8gcHJvamVjdCBjbGFzc3BhdGhzLgotICoKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyUnVudGltZVRhcmdldEhhbmRsZXIgZXh0ZW5kcyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDbGFzc3BhdGhSdW50aW1lVGFyZ2V0SGFuZGxlciNyZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElSdW50aW1lLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElSdW50aW1lIHJ1bnRpbWUsU3RyaW5nIGlkKXsJCQotCQlyZXR1cm4gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihydW50aW1lKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDbGFzc3BhdGhSdW50aW1lVGFyZ2V0SGFuZGxlciNyZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElSdW50aW1lKQotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElSdW50aW1lIHJ1bnRpbWUpewkJCi0JCXJldHVybiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblV0aWwuZ2V0U2VydmVyQ2xhc3NQYXRoRW50cnkocnVudGltZSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZCB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBzZXJ2ZXJkZWYuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4gY2xhc3NwYXRoRW50cmllcwotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXREZWxlZ2F0ZUNsYXNzcGF0aEVudHJpZXMoSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUdlbmVyaWNTZXJ2ZXJSdW50aW1lIGdlbmVyaWNSdW50aW1lID0gKEdlbmVyaWNTZXJ2ZXJSdW50aW1lKXJ1bnRpbWUubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlclJ1bnRpbWUuY2xhc3MsIG1vbml0b3IpOwotCQlpZiAoZ2VuZXJpY1J1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5WzBdOwotCQlJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IGdlbmVyaWNSdW50aW1lLmdldFZNSW5zdGFsbCgpOwotCQlpZiAodm1JbnN0YWxsICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gdm1JbnN0YWxsLmdldE5hbWUoKTsKLQkJCVN0cmluZyB0eXBlSWQgPSB2bUluc3RhbGwuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCk7Ci0JCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVtdIHsgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkobmV3IFBhdGgoSmF2YVJ1bnRpbWUuSlJFX0NPTlRBSU5FUikuYXBwZW5kKHR5cGVJZCkuYXBwZW5kKG5hbWUpKSB9OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWRkNmYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLkZvbGRlclNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0vKioKLSAqIFNvdXJjZVBhdGhDb21wdXRlciBmb3IgdGhlIEdlbmVyaWNMYXVuY2hDb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlclNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIGltcGxlbWVudHMgSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlICB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUjY29tcHV0ZVNvdXJjZUNvbnRhaW5lcnMob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTb3VyY2VDb250YWluZXJbXSBjb21wdXRlU291cmNlQ29udGFpbmVycyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSB1bnJlc29sdmVkRW50cmllcyA9IEphdmFSdW50aW1lLmNvbXB1dGVVbnJlc29sdmVkU291cmNlTG9va3VwUGF0aChjb25maWd1cmF0aW9uKTsKLQkJTGlzdCBzb3VyY2Vmb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJSVNlcnZlciBzZXJ2ZXIgPSAgU2VydmVyVXRpbC5nZXRTZXJ2ZXIoY29uZmlndXJhdGlvbik7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKLQkJCi0JCUxpc3QgamF2YVByb2plY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJcHJvY2Vzc01vZHVsZXMoc291cmNlZm9sZGVyTGlzdCwgbW9kdWxlcywgamF2YVByb2plY3RMaXN0LCBzZXJ2ZXIsbW9uaXRvcik7Ci0KLQotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gcHJvamVjdEVudHJpZXMgPSBuZXcgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtqYXZhUHJvamVjdExpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhUHJvamVjdExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXByb2plY3RFbnRyaWVzW2ldID0gSmF2YVJ1bnRpbWUubmV3UHJvamVjdFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSgoSUphdmFQcm9qZWN0KWphdmFQcm9qZWN0TGlzdC5nZXQoaSkpOyAKLQkJfQotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9ICBuZXcgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtwcm9qZWN0RW50cmllcy5sZW5ndGgrdW5yZXNvbHZlZEVudHJpZXMubGVuZ3RoXTsgCi0JCVN5c3RlbS5hcnJheWNvcHkodW5yZXNvbHZlZEVudHJpZXMsMCxlbnRyaWVzLDAsdW5yZXNvbHZlZEVudHJpZXMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShwcm9qZWN0RW50cmllcywwLGVudHJpZXMsdW5yZXNvbHZlZEVudHJpZXMubGVuZ3RoLHByb2plY3RFbnRyaWVzLmxlbmd0aCk7Ci0JCQotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZWQgPSBKYXZhUnVudGltZS5yZXNvbHZlU291cmNlTG9va3VwUGF0aChlbnRyaWVzLCBjb25maWd1cmF0aW9uKTsKLQkJSVNvdXJjZUNvbnRhaW5lcltdIGphdmFTb3VyY2VDb250YWluZXJzID0gSmF2YVJ1bnRpbWUuZ2V0U291cmNlQ29udGFpbmVycyhyZXNvbHZlZCk7Ci0JCQotCQlpZiAoIXNvdXJjZWZvbGRlckxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlJU291cmNlQ29udGFpbmVyW10gY29tYmluZWRTb3VyY2VDb250YWluZXJzID0gbmV3IElTb3VyY2VDb250YWluZXJbamF2YVNvdXJjZUNvbnRhaW5lcnMubGVuZ3RoICsgc291cmNlZm9sZGVyTGlzdC5zaXplKCldOwotCQkJc291cmNlZm9sZGVyTGlzdC50b0FycmF5KGNvbWJpbmVkU291cmNlQ29udGFpbmVycyk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGphdmFTb3VyY2VDb250YWluZXJzLCAwLCBjb21iaW5lZFNvdXJjZUNvbnRhaW5lcnMsIHNvdXJjZWZvbGRlckxpc3Quc2l6ZSgpLCBqYXZhU291cmNlQ29udGFpbmVycy5sZW5ndGgpOwotCQkJamF2YVNvdXJjZUNvbnRhaW5lcnMgPSBjb21iaW5lZFNvdXJjZUNvbnRhaW5lcnM7Ci0JCX0KLQkJCi0JCXJldHVybiBqYXZhU291cmNlQ29udGFpbmVyczsKLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2R1bGVzKExpc3Qgc291cmNlZm9sZGVyTGlzdCwgSU1vZHVsZVtdIG1vZHVsZXMsIExpc3QgamF2YVByb2plY3RMaXN0LCBJU2VydmVyIHNlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IG1vZHVsZXNbaV0uZ2V0UHJvamVjdCgpOwotCQkJSU1vZHVsZVtdIHBNb2R1bGUgPSBuZXcgSU1vZHVsZVsxXTsKLQkJCXBNb2R1bGVbMF09bW9kdWxlc1tpXTsKLQkJCUlNb2R1bGVbXSBjTW9kdWxlID0gc2VydmVyLmdldENoaWxkTW9kdWxlcyhwTW9kdWxlLCBtb25pdG9yKTsKLQkJCWlmKGNNb2R1bGUgIT0gbnVsbCAmJiBjTW9kdWxlLmxlbmd0aD4wKQotCQkJewotCQkJCXByb2Nlc3NNb2R1bGVzKHNvdXJjZWZvbGRlckxpc3QsIGNNb2R1bGUsIGphdmFQcm9qZWN0TGlzdCwgc2VydmVyLCBtb25pdG9yKTsKLQkJCX0KLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlJRm9sZGVyIG1vZHVsZUZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKG1vZHVsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCQlpZiAobW9kdWxlRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCXNvdXJjZWZvbGRlckxpc3QuYWRkKG5ldyBGb2xkZXJTb3VyY2VDb250YWluZXIobW9kdWxlRm9sZGVyLCB0cnVlKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgcHJvamVjdC5nZXROYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJCQkJCQlpZighamF2YVByb2plY3RMaXN0LmNvbnRhaW5zKGphdmFQcm9qZWN0KSl7Ci0JCQkJCQkJCWphdmFQcm9qZWN0TGlzdC5hZGQoamF2YVByb2plY3QpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvUGluZ1RocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvUGluZ1RocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODlkYmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1BpbmdUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotCi0vKioKLSAqIFRocmVhZCB1c2VkIHRvIHBpbmcgc2VydmVyIHRvIHRlc3Qgd2hlbiBpdCBpcyBzdGFydGVkLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQaW5nVGhyZWFkIHsKLQkvLyBkZWxheSBiZWZvcmUgcGluZ2luZyBzdGFydHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19ERUxBWSA9IDIwMDA7Ci0KLQkvLyBkZWxheSBiZXR3ZWVuIHBpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJTkdfSU5URVJWQUwgPSAyNTA7Ci0KLQkvLyBtYXhpbXVtIG51bWJlciBvZiBwaW5ncyBiZWZvcmUgZ2l2aW5nIHVwCi0JcHJpdmF0ZSBpbnQgbWF4UGluZ3MgPSA1NjsgLy8gdG90YWw6IDE2IHNlY29uZHMgKyBjb25uZWN0aW9uIHRpbWUKLQotCXByaXZhdGUgYm9vbGVhbiBzdG9wOwotCXByaXZhdGUgU3RyaW5nIGZVcmw7Ci0JcHJpdmF0ZSBJU2VydmVyIGZTZXJ2ZXI7Ci0JcHJpdmF0ZSBHZW5lcmljU2VydmVyQmVoYXZpb3VyIGZHZW5lcmljU2VydmVyOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFBpbmdUaHJlYWQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcGFyYW0gZ2VuZXJpY1NlcnZlcgotCSAqLwotCXB1YmxpYyBQaW5nVGhyZWFkKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgdXJsLCBHZW5lcmljU2VydmVyQmVoYXZpb3VyIGdlbmVyaWNTZXJ2ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mU2VydmVyID0gc2VydmVyOwotCQl0aGlzLmZVcmwgPSB1cmw7Ci0JCXRoaXMubWF4UGluZ3MgPSBndWVzc01heFBpbmdzKGdlbmVyaWNTZXJ2ZXIpOwotCQl0aGlzLmZHZW5lcmljU2VydmVyID0gZ2VuZXJpY1NlcnZlcjsKLQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXBpbmcoKTsKLQkJCX0KLQkJfTsKLQkJdC5zZXREYWVtb24odHJ1ZSk7Ci0JCXQuc3RhcnQoKTsKLQl9Ci0gICAgCi0JcHJpdmF0ZSBpbnQgZ3Vlc3NNYXhQaW5ncyhHZW5lcmljU2VydmVyQmVoYXZpb3VyIHNlcnZlcikKLSAgICB7Ci0gICAgCWludCBtYXhwaW5ncz0tMTsKLSAgICAJaW50IHN0YXJ0VGltZW91dCA9ICgoU2VydmVyKXNlcnZlci5nZXRTZXJ2ZXIoKSkuZ2V0U3RhcnRUaW1lb3V0KCkgKiAxMDAwOwotICAgIAlpZihzdGFydFRpbWVvdXQ+MCkKLSAgICAJCW1heHBpbmdzPXN0YXJ0VGltZW91dC9QSU5HX0lOVEVSVkFMOwotICAgIAlyZXR1cm4gbWF4cGluZ3M7Ci0gICAgfQotCXByaXZhdGUgYm9vbGVhbiBpc1JlbW90ZSgpewotCQlyZXR1cm4gKGZTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLnN1cHBvcnRzUmVtb3RlSG9zdHMoKSYmICFTb2NrZXRVdGlsLmlzTG9jYWxob3N0KGZTZXJ2ZXIuZ2V0SG9zdCgpKSApOwotCX0KLQkvKioKLQkgKiBQaW5nIHRoZSBzZXJ2ZXIgdW50aWwgaXQgaXMgc3RhcnRlZC4gVGhlbiBzZXQgdGhlIHNlcnZlcgotCSAqIHN0YXRlIHRvIFNUQVRFX1NUQVJURUQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGluZygpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChQSU5HX0RFTEFZKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXdoaWxlICghc3RvcCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoY291bnQgPT0gbWF4UGluZ3MgJiYgIWlzUmVtb3RlKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZTZXJ2ZXIuc3RvcChmYWxzZSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBjb3VsZCBub3Qgc3RvcCBzZXJ2ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXN0b3AgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYoIWlzUmVtb3RlKCkpCi0JCQkJCWNvdW50Kys7Ci0JCQkJCi0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogcGluZ2luZyIpOyAvLyROT04tTkxTLTEkCi0JCQkJVVJMIHBpbmdVcmwgPSBuZXcgVVJMKGZVcmwpOwotCQkJCVVSTENvbm5lY3Rpb24gY29ubiA9IHBpbmdVcmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkoKEh0dHBVUkxDb25uZWN0aW9uKWNvbm4pLmdldFJlc3BvbnNlQ29kZSgpOwotCQotCQkJCS8vIHBpbmcgd29ya2VkIC0gc2VydmVyIGlzIHVwCi0JCQkJaWYgKCFzdG9wKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHN1Y2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQkJZkdlbmVyaWNTZXJ2ZXIuc2V0U2VydmVyU3RhcnRlZCgpOwotCQkJCX0KLQkJCQlpZighaXNSZW1vdGUoKSkKLQkJCQkJc3RvcCA9IHRydWU7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZmUpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoUElOR19JTlRFUlZBTCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJCWZHZW5lcmljU2VydmVyLnNldFNlcnZlclN0YXJ0ZWQoKTsKLQkJCQlpZighaXNSZW1vdGUoKSkKLQkJCQkJc3RvcCA9IHRydWU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IGZhaWxlZDogIisgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBwaW5naW5nIGZhaWxlZAotCQkJCWlmICghc3RvcCkgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKFBJTkdfSU5URVJWQUwpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMikgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZWxsIHRoZSBwaW5naW5nIHRvIHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogc3RvcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCQlzdG9wID0gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9QdWJsaXNoTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvUHVibGlzaE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyNzJmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9QdWJsaXNoTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUudXRpbC5FeHRlbnNpb25Qb2ludFV0aWw7Ci0KLS8qKgotICogVXRpbGl0eSBmb3IgbWFuYWdpbmcgZ2VuZXJpYyBwdWJsaXNoZXJzLgotICoKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoTWFuYWdlciAKLXsKLSAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdlbmVyaWMgcHVibGlzaGVyIGZvciBnaXZlbiBJRAotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEByZXR1cm4gcHVibGlzaGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBHZW5lcmljUHVibGlzaGVyIGdldFB1Ymxpc2hlcihTdHJpbmcgaWQpIAotICAgIHsKLSAgICAgICAgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBFeHRlbnNpb25Qb2ludFV0aWwuZ2V0R2VuZXJpY1B1Ymxpc2hlckV4dGVuc2lvbigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlncyA9IEV4dGVuc2lvblBvaW50VXRpbC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoZXh0ZW5zaW9uc1tpXSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGNvbmZpZ3Nbal0uZ2V0QXR0cmlidXRlKCJpZCIpLmVxdWFscyhpZCkpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChHZW5lcmljUHVibGlzaGVyKWNvbmZpZ3Nbal0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH1jYXRjaChDb3JlRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgLy9pZ25vcmVkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgIAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGIwOGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklSZWdpc3RyeUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS51dGlsLkV4dGVuc2lvblBvaW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS51dGlsLlNlcnZlclJ1bnRpbWVNZXJnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci0vKioKLSAqIE1hbmFnZXMgdGhlIHJldHJpZWF2YWwgb2YgU2VydmVyVHlwZURlZmluaXRpb25zLgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIgCi17Ci0JcHJpdmF0ZSBYTUxVdGlscyBmWG1sVXRpbHM7Ci0JCi0JLyoqCi0JICogV2F0Y2ggZm9yIGNoYW5nZXMgdG8gc2VydmVyZGVmaW5pdGlvbiBhbmQgcnVudGltZWRlZmluaXRpb24gZXh0ZW5zaW9ucy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdHJ5Q2hhbmdlZChJUmVnaXN0cnlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICAgICAgSUV4dGVuc2lvbkRlbHRhW10gZGVsdGFzID0gZXZlbnQuZ2V0RXh0ZW5zaW9uRGVsdGFzKENvcmVQbHVnaW4uUExVR0lOX0lELCBFeHRlbnNpb25Qb2ludFV0aWwuU0VSVkVSREVGSU5JVElPTl9FWFRFTlNJT05fSUQpOwotICAgICAgICAgICAgaWYgKGRlbHRhcyAhPSBudWxsICYmIGRlbHRhcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRGVmaW5pdGlvbnNDaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEV4dGVuc2lvblBvaW50VXRpbC5SVU5USU1FREVGSU5JVElPTl9FWFRFTlNJT05fSUQpOwotICAgICAgICAgICAgICAgIGlmIChkZWx0YXMgIT0gbnVsbCAmJiBkZWx0YXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZWZpbml0aW9uc0NoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0JCi0JcHJvdGVjdGVkIFNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcihVUkwgc2VydmVyRGVmaW5pdGlvblVSTCl7Ci0JCXN1cGVyKCk7Ci0JCWZYbWxVdGlscyA9IG5ldyBYTUxVdGlscygpOwotCQlFeHRlbnNpb25Qb2ludFV0aWwuYWRkUmVnaXN0cnlMaXN0ZW5lcihuZXcgUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcigpKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGVpdGhlcjogCi0gICAgICogCi0gICAgICogMS4gdGhlIFNlcnZlclJ1bnRpbWUgdGhhdCByZXByZXNlbnRzIHRoZSAuc2VydmVyZGVmIGZpbGUgZm9yIGEgZ2l2ZW4gCi0gICAgICogICAgcnVudGltZSB0eXBlLCBiYXNlZCBvbiB0aGUgcnVudGltZVR5cGVJZC4KLSAgICAgKiAgICAKLSAgICAgKiAyLiB0aGUgU2VydmVyUnVudGltZSB0aGF0IHJlcHJlc2VudHMgYm90aCB0aGUgLnNlcnZlcmRlZiBmaWxlIGZvciBhCi0gICAgICogICAgZ2l2ZW4gc2VydmVyIHR5cGUsIGJhc2VkIG9uIHRoZSBzZXJ2ZXJUeXBlSWQsIGNvbWJpbmVkIHdpdGggdGhlIAotICAgICAqICAgIC5ydW50aW1lZGVmIGZpbGUgZm9yIHRoZSBydW50aW1lIHR5cGUsIGJhc2VkIG9uIHRoZSBydW50aW1lVHlwZUlkLiAgIAotICAgICAqIAotICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBsb29rcyBmb3IgKDEpIGZpcnN0LCBpZiB0aGF0IGNvbWJpbmF0aW9uIGlzIG5vdAotICAgICAqIGZvdW5kLCB0aGVuICgyKSBpcyByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VydmVyVHlwZUlkIHNlcnZlciB0eXBlIGlkCi0gICAgICogQHBhcmFtIHJ1bnRpbWVUeXBlSWQgcnVudGltZSB0eXBlIGlkCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMgdXNlciBwcm92aWRlZCBwcm9wZXJ0aWVzCi0gICAgICogQHJldHVybiBzZXJ2ZXIgcnVudGltZSB0aGF0IGlzIGluaXRpYWxpemVkIHdpdGggdXNlciBwcm9wZXJ0aWVzIAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2ZXJSdW50aW1lIGdldFNlcnZlclJ1bnRpbWVEZWZpbml0aW9uKFN0cmluZyBzZXJ2ZXJUeXBlSWQsIFN0cmluZyBydW50aW1lVHlwZUlkLCBNYXAgcHJvcGVydGllcykgewotICAgICAgICAKLSAgICAgICAgU2VydmVyUnVudGltZSBzZXJ2ZXJkZWYgPSBmWG1sVXRpbHMuZ2V0U2VydmVyVHlwZURlZmluaXRpb24oc2VydmVyVHlwZUlkKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChzZXJ2ZXJkZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgU2VydmVyUnVudGltZSBydW50aW1lZGVmID0gZlhtbFV0aWxzLmdldFJ1bnRpbWVUeXBlRGVmaW5pdGlvbihydW50aW1lVHlwZUlkKTsKLSAgICAgICAgICAgIGlmIChydW50aW1lZGVmID09IG51bGwpIHsKLSAgICAgICAgICAgIAkvLyBGYWxsIGJhY2sgdG8gc2luZ2xlIC5zZXJ2ZXJkZWYKLSAgICAgICAgICAgICAgICBzZXJ2ZXJkZWYgPSBmWG1sVXRpbHMuZ2V0U2VydmVyVHlwZURlZmluaXRpb24ocnVudGltZVR5cGVJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJkZWYgPSBTZXJ2ZXJSdW50aW1lTWVyZ2VVdGlsLmNvbWJpbmUoc2VydmVyZGVmLCBydW50aW1lZGVmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgc2luZ2xlIHNlcnZlcmRlZgotICAgICAgICAgICAgc2VydmVyZGVmID0gZlhtbFV0aWxzLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKHJ1bnRpbWVUeXBlSWQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoc2VydmVyZGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZlcmRlZi5zZXRQcm9wZXJ0eVZhbHVlcyhwcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNlcnZlcmRlZjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU2VydmVyUnVudGltZSB0aGF0IHJlcHJlc2VudHMgdGhlIC5zZXJ2ZXJkZWYgZmlsZQotICAgICAqIGZvciBhIGdpdmVuIHJ1bnRpbWUgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVudGltZVR5cGVJZCBydW50aW1lIHR5cGUgaWQKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcyB1c2VyIHByb3ZpZGVkIHByb3BlcnRpZXMKLSAgICAgKiBAcmV0dXJuIHNlcnZlciBydW50aW1lIHRoYXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB1c2VyIHByb3BlcnRpZXMgCi0gICAgICovCi0gICAgcHVibGljIFNlcnZlclJ1bnRpbWUgZ2V0U2VydmVyUnVudGltZURlZmluaXRpb24oU3RyaW5nIHJ1bnRpbWVUeXBlSWQsIE1hcCBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIFNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiA9IGZYbWxVdGlscy5nZXRSdW50aW1lVHlwZURlZmluaXRpb24ocnVudGltZVR5cGVJZCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHVzYWdlCi0gICAgICAgICAgICBkZWZpbml0aW9uID0gZlhtbFV0aWxzLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKHJ1bnRpbWVUeXBlSWQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZWZpbml0aW9uLnNldFByb3BlcnR5VmFsdWVzKHByb3BlcnRpZXMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgICB9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIFNlcnZlclJ1bnRpbWVzIHJlZ2lzdGVyZWQgYSAuc2VydmVyZGVmLgotCSAqIEByZXR1cm4gc2VydmVyUnVudGltZXMKLQkgKi8KLQlwdWJsaWMgU2VydmVyUnVudGltZVtdIGdldFNlcnZlclR5cGVEZWZpbml0aW9ucygpewotCQkgTGlzdCBkZWZpbml0aW9uTGlzdCA9IGZYbWxVdGlscy5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbnMoKTsKLQkJIHJldHVybiAoU2VydmVyUnVudGltZVtdKWRlZmluaXRpb25MaXN0LnRvQXJyYXkobmV3IFNlcnZlclJ1bnRpbWVbZGVmaW5pdGlvbkxpc3Quc2l6ZSgpXSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZWZpbml0aW9uc0NoYW5nZWQoKXsJCi0JCVhNTFV0aWxzIHV0aWxzID0gbmV3IFhNTFV0aWxzKCk7Ci0JCWZYbWxVdGlscyA9IHV0aWxzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvU2VydmVyVHlwZURlZmluaXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNjlhMzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvU2VydmVyVHlwZURlZmluaXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuZmlsZXMuRGlyZWN0b3J5U2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXhjbHVkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkluY2x1ZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci0KLS8qKgotICogVXRpbGl0aWVzIGZvciBTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gZmlsZXMuCi0gKgotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclR5cGVEZWZpbml0aW9uVXRpbCAKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgZGVmaW5pdGlvbiBmb3IgcnVudGltZS4gUmV0dXJucyBudWxsCi0JICogaWYgdGhlIHJ1bnRpbWUgaXMgbnVsbCBvciBub3QgYSBHZW5lcmljIHNlcnZlciB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lCi0JICogQHJldHVybiBzZXJ2ZXJSdW50aW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJSdW50aW1lIGdldFNlcnZlclR5cGVEZWZpbml0aW9uKElSdW50aW1lIHJ1bnRpbWUpCi0JewotCQlpZihydW50aW1lPT1udWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JICAgIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIGRlbGVnYXRlID0gKEdlbmVyaWNTZXJ2ZXJSdW50aW1lKXJ1bnRpbWUubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlclJ1bnRpbWUuY2xhc3MsbnVsbCk7Ci0JICAgIGlmKGRlbGVnYXRlPT1udWxsKQotCSAgICAJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBzZXJ2ZXJUeXBlID0gZGVsZWdhdGUuZ2V0UnVudGltZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLQkJTWFwIHByb3BlcnRpZXMgPSBkZWxlZ2F0ZS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJU2VydmVyUnVudGltZSBkZWZpbml0aW9uID0gCi0JCQlDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIoKS5nZXRTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbihzZXJ2ZXJUeXBlLHByb3BlcnRpZXMpOwotCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQl9Ci0JLyoqCi0JICogRXh0cmFjdHMgdGhlIHNlcnZlciBjbGFzc3BhdGggZW50cnkgYXJyYXkuCi0JICoKLQkgKiBAcGFyYW0gcnVudGltZQotCSAqIEByZXR1cm4gY2xhc3NwYXRoRW50cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeVtdIGdldFNlcnZlckNsYXNzUGF0aEVudHJ5KElSdW50aW1lIHJ1bnRpbWUpCi0JewotCQlTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihydW50aW1lKTsKLQkJaWYoZGVmaW5pdGlvbj09bnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVmID0gZGVmaW5pdGlvbi5nZXRQcm9qZWN0KCkuZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCk7Ci0JCUFycmF5TGlzdCBlbnRyeUxpc3QgPSBnZXRDbGFzc3BhdGhFbnRyaWVzKHJlZixkZWZpbml0aW9uLGZhbHNlKTsKLQkJcmV0dXJuIChJQ2xhc3NwYXRoRW50cnlbXSllbnRyeUxpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2VudHJ5TGlzdC5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljICBzdGF0aWMgQXJyYXlMaXN0IGdldENsYXNzcGF0aEVudHJpZXMoU3RyaW5nIHJlZiwgU2VydmVyUnVudGltZSBkZWZpbml0aW9uLCBib29sZWFuIGlzTGF1bmNoKSB7Ci0JCUNsYXNzcGF0aCBjcCA9IGRlZmluaXRpb24uZ2V0Q2xhc3NwYXRoKHJlZik7Ci0JCUl0ZXJhdG9yIGFyY2hpdmVzID0gY3AuZ2V0QXJjaGl2ZSgpLml0ZXJhdG9yKCk7Ci0JCUFycmF5TGlzdCBlbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChhcmNoaXZlcy5oYXNOZXh0KCkpIHsKLQkJCUFyY2hpdmVUeXBlIGFyY2hpdmUgPSAoQXJjaGl2ZVR5cGUpIGFyY2hpdmVzLm5leHQoKTsKLQkJCVN0cmluZyBpdGVtID0gZGVmaW5pdGlvbi5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGFyY2hpdmUuZ2V0UGF0aCgpKTsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IG51bGw7Ci0JCQlpZihpc0xhdW5jaCkKLQkJCQllbnRyeUxpc3QuYWRkKEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkobmV3IFBhdGgoaXRlbSkpKTsKLQkJCWVsc2UKLQkJCQllbnRyeUxpc3QuYWRkKEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChpdGVtKSxudWxsLG51bGwgKSk7Ci0JCX0KLQkJSXRlcmF0b3IgZmlsZVNldHMgPSBjcC5nZXRGaWxlc2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGZpbGVTZXRzLmhhc05leHQoKSkgewotCQkJRmlsZXNldFR5cGUgZmlsZXNldCA9IChGaWxlc2V0VHlwZSkgZmlsZVNldHMubmV4dCgpOwotCQkJU3RyaW5nIGRpciA9IGRlZmluaXRpb24uZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhmaWxlc2V0LmdldERpcigpKTsKLQkJCUl0ZXJhdG9yIGluY2x1ZGVzID0gZmlsZXNldC5nZXRJbmNsdWRlKCkuaXRlcmF0b3IoKTsKLQkJCVN0cmluZ1tdIGluY2xzdHIgPSBuZXcgU3RyaW5nW2ZpbGVzZXQuZ2V0SW5jbHVkZSgpLnNpemUoKV07Ci0JCQlpbnQgaT0wOwotCQkJd2hpbGUgKGluY2x1ZGVzLmhhc05leHQoKSkgewotCQkJCUluY2x1ZGVUeXBlIGluY2wgPSAoSW5jbHVkZVR5cGUpIGluY2x1ZGVzLm5leHQoKTsKLQkJCQlpbmNsc3RyW2krK10gPWRlZmluaXRpb24uZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhpbmNsLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlJdGVyYXRvciBleGNsdWRlcyA9IGZpbGVzZXQuZ2V0RXhjbHVkZSgpLml0ZXJhdG9yKCk7Ci0JCQlTdHJpbmdbXSBleGNsc3RyID0gbmV3IFN0cmluZ1tmaWxlc2V0LmdldEV4Y2x1ZGUoKS5zaXplKCldOwotCQkJaT0wOwotCQkJd2hpbGUgKGV4Y2x1ZGVzLmhhc05leHQoKSkgewotCQkJCUV4Y2x1ZGVUeXBlIGV4Y2wgPSAoRXhjbHVkZVR5cGUpIGV4Y2x1ZGVzLm5leHQoKTsKLQkJCQlleGNsc3RyW2krK10gPWRlZmluaXRpb24uZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhleGNsLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwotCQkJc2Nhbm5lci5zZXRCYXNlZGlyKGRpcik7Ci0JCQlzY2FubmVyLnNldEluY2x1ZGVzKGluY2xzdHIpOwotCQkJc2Nhbm5lci5zZXRFeGNsdWRlcyhleGNsc3RyKTsKLQkJCXNjYW5uZXIuc2NhbigpOwotCQkJU3RyaW5nW10gZmlsZXNldEZpbGVzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGZpbGVzZXRGaWxlcy5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBpdGVtID0gZGlyKyIvIitmaWxlc2V0RmlsZXNbal07Ci0JCQkJaWYoaXNMYXVuY2gpCi0JCQkJCWVudHJ5TGlzdC5hZGQoSmF2YVJ1bnRpbWUubmV3QXJjaGl2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShuZXcgUGF0aChpdGVtKSkpOwotCQkJCWVsc2UKLQkJCQkJZW50cnlMaXN0LmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoaXRlbSksbnVsbCxudWxsICkpOwotCi0JCQl9Ci0JCQotCQl9Ci0JCXJldHVybiBlbnRyeUxpc3Q7Ci0JfQotCS8qKgotCSAqIEdpdmVuIHRoZSBzZXJ2ZXJEZWZpbml0aW9uIGFuZCBtb2R1bGUgcmV0dXJucyB0aGUgcHVibGlzaGVyIGlkIAotCSAqIHRoYXQgaGFuZGxlcyB0aGUgcHVibGlzaGluZyBvZiBtb2R1bGUgdHlwZSBmb3IgdGhpcyBzZXJ2ZXJEZWZpbml0aW9uLgotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiBAcGFyYW0gc2VydmVyRGVmaW5pdGlvbgotCSAqIEByZXR1cm4gcHVibGlzaGVyIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHVibGlzaGVySUQoSU1vZHVsZSBtb2R1bGUsIFNlcnZlclJ1bnRpbWUgc2VydmVyRGVmaW5pdGlvbikKLQl7Ci0JCWlmKG1vZHVsZT09bnVsbCB8fCBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNb2R1bGUgbSA9IHNlcnZlckRlZmluaXRpb24uZ2V0TW9kdWxlKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSk7Ci0JCXJldHVybiBtLmdldFB1Ymxpc2hlclJlZmVyZW5jZSgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGU4Yzc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQkvKioKLQkgKiBUcmFjZSBsZXZlbCBDT05GSUcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ09ORklHID0gMDsKLQkvKioKLQkgKiBUcmFjZSBsZXZlbCBXQVJOSU5HCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFdBUk5JTkcgPSAxOwotCS8qKgotCSAqIFRyYWNlIGxldmVsIFNFVkVSRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVZFUkUgPSAyOwotCS8qKgotCSAqIFRyYWNlIGxldmVsIEZJTkVTVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGSU5FU1QgPSAzOwotCS8qKgotCSAqIFRyYWNlIGxldmVsIEZJTkVSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZJTkVSID0gNDsKLQkKLQkvKioKLQkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgVHJhY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbCB0cmFjZSBsZXZlbCBjb25zdGFudAotCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqIEBwYXJhbSBsZXZlbCB0cmFjZSBsZXZlbCBjb25zdGFudAotCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdCBqYXZhLmxhbmcuVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewotCQlpZiAoIUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKHMpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBzKSB7Ci0JCXRyYWNlKHMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0IHRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJdHJhY2UoRklORVNULCBzLCB0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL0Fic3RyYWN0TW9kdWxlQXNzZW1ibGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL0Fic3RyYWN0TW9kdWxlQXNzZW1ibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkM2RiMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9BYnN0cmFjdE1vZHVsZUFzc2VtYmxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVyczsKLQkJCQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlB1Ymxpc2hVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlByb2plY3RNb2R1bGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgbW9kdWxlIGFzc2VtYmxlcnMKLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kdWxlQXNzZW1ibGVyIHsKLQotCXByb3RlY3RlZCBTZXJ2ZXJSdW50aW1lIGZTZXJ2ZXJkZWZpbml0aW9uOwotCXByb3RlY3RlZCBJTW9kdWxlIGZNb2R1bGU7IAotCXByb3RlY3RlZCBHZW5lcmljU2VydmVyIGZTZXJ2ZXI7Ci0JcHJvdGVjdGVkIElQYXRoIGZBc3NlbWJsZVJvb3Q7Ci0JCi0JcHJvdGVjdGVkIEFic3RyYWN0TW9kdWxlQXNzZW1ibGVyKElNb2R1bGUgbW9kdWxlLCBHZW5lcmljU2VydmVyIHNlcnZlciwgSVBhdGggYXNzZW1ibGVSb290KQotCXsKLQkJZk1vZHVsZT1tb2R1bGU7Ci0JCWZTZXJ2ZXJkZWZpbml0aW9uPXNlcnZlci5nZXRTZXJ2ZXJEZWZpbml0aW9uKCk7Ci0JCWZTZXJ2ZXI9c2VydmVyOwotCQlmQXNzZW1ibGVSb290ID0gYXNzZW1ibGVSb290OwotCX0KLQkKLQkvKioKLQkgKiBBc3NlbWJsZSB0aGUgbW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IElQYXRoIGFzc2VtYmxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkKLQkvKioKLQkgKiBGYWN0b3J5IGZvciBjcmVhdGluZyBjb25jcmV0ZSBtb2R1bGUgYXNzZW1ibGVycyBmb3IgCi0JICogY29ycmVzcG9uZGluZyBtb2R1bGUgdHlwZXMuCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgewkJCi0JCQotCQlwdWJsaWMgc3RhdGljIElQYXRoIGdldERlZmF1bHRBc3NlbWJsZVJvb3QoSU1vZHVsZSBtb2R1bGUsIEdlbmVyaWNTZXJ2ZXIgc2VydmVyKSB7Ci0JCQlQcm9qZWN0TW9kdWxlIHBtID0oUHJvamVjdE1vZHVsZSltb2R1bGUubG9hZEFkYXB0ZXIoUHJvamVjdE1vZHVsZS5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlyZXR1cm4gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0VGVtcERpcmVjdG9yeShzZXJ2ZXIuZ2V0U2VydmVyKCkuZ2V0SWQoKSkuYXBwZW5kKHBtLmdldElkKCkpOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJucyBhIGNvbmNyZXRlIG1vZHVsZSBhc3NlbWJsZXIKLQkJICogCi0JCSAqIEBwYXJhbSBtb2R1bGUKLQkJICogQHBhcmFtIHNlcnZlcgotCQkgKiBAcmV0dXJuIGFzc2VtYmxlcgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBYnN0cmFjdE1vZHVsZUFzc2VtYmxlciBnZXRNb2R1bGVBc3NlbWJsZXIoSU1vZHVsZSBtb2R1bGUsIEdlbmVyaWNTZXJ2ZXIgc2VydmVyKQotCQl7Ci0JCQlyZXR1cm4gZ2V0TW9kdWxlQXNzZW1ibGVyKG1vZHVsZSwgc2VydmVyLCBnZXREZWZhdWx0QXNzZW1ibGVSb290KG1vZHVsZSwgc2VydmVyKSk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm5zIGEgY29uY3JldGUgbW9kdWxlIGFzc2VtYmxlciB0aGF0IGFzc2VtYmxlcyB1bmRlciB0aGUgc3BlY2lmaWVkIHJvb3QgcGF0aAotCQkgKiAKLQkJICogQHBhcmFtIG1vZHVsZQotCQkgKiBAcGFyYW0gc2VydmVyCi0JCSAqIEBwYXJhbSBhc3NlbWJsZVJvb3QKLQkJICogQHJldHVybiBhc3NlbWJsZXIKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIgZ2V0TW9kdWxlQXNzZW1ibGVyKElNb2R1bGUgbW9kdWxlLCBHZW5lcmljU2VydmVyIHNlcnZlciwgSVBhdGggYXNzZW1ibGVSb290KQotCQl7Ci0JCQlpZihpc01vZHVsZVR5cGUobW9kdWxlLCAianN0LndlYiIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBXYXJNb2R1bGVBc3NlbWJsZXIobW9kdWxlLHNlcnZlcixhc3NlbWJsZVJvb3QpOwotCQkJaWYoaXNNb2R1bGVUeXBlKG1vZHVsZSwgImpzdC5lYXIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgRWFyTW9kdWxlQXNzZW1ibGVyKG1vZHVsZSxzZXJ2ZXIsYXNzZW1ibGVSb290KTsKLQkJCXJldHVybiBuZXcgRGVmYXVsdE1vZHVsZUFzc2VtYmxlcihtb2R1bGUsc2VydmVyLGFzc2VtYmxlUm9vdCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNb2R1bGVUeXBlKElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgbW9kdWxlVHlwZUlkKXsJCi0JCQlpZihtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpIT1udWxsICYmIG1vZHVsZVR5cGVJZC5lcXVhbHMobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwYWNrTW9kdWxlKElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgZGVwbG95bWVudFVuaXROYW1lLCBJUGF0aCBkZXN0aW5hdGlvbil0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQotCQlTdHJpbmcgZGVzdCA9IGRlc3RpbmF0aW9uLmFwcGVuZChkZXBsb3ltZW50VW5pdE5hbWUpLnRvU3RyaW5nKCk7Ci0JCU1vZHVsZVBhY2thZ2VyIHBhY2thZ2VyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhY2thZ2VyID0gbmV3IE1vZHVsZVBhY2thZ2VyKGRlc3QsIGZhbHNlKTsKLQkJCVByb2plY3RNb2R1bGUgcG0gPSAoUHJvamVjdE1vZHVsZSkgbW9kdWxlLmxvYWRBZGFwdGVyKFByb2plY3RNb2R1bGUuY2xhc3MsIG51bGwpOwotCQkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzID0gcG0ubWVtYmVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlkb1BhY2tNb2R1bGUocmVzb3VyY2VzW2ldLCBwYWNrYWdlcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJInVuYWJsZSB0byBhc3NlbWJsZSBtb2R1bGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCQlmaW5hbGx5ewotCQkJdHJ5ewotCQkJCXBhY2thZ2VyLmZpbmlzaGVkKCk7Ci0JCQl9Ci0JCQljYXRjaChJT0V4Y2VwdGlvbiBlKXsKLQkJCQkvL3VuaGFuZGxlZAotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvUGFja01vZHVsZShJTW9kdWxlUmVzb3VyY2UgcmVzb3VyY2UsIE1vZHVsZVBhY2thZ2VyIHBhY2thZ2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb257Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7Ci0JCQkJSU1vZHVsZUZvbGRlciBtRm9sZGVyID0gKElNb2R1bGVGb2xkZXIpcmVzb3VyY2U7Ci0JCQkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzID0gbUZvbGRlci5tZW1iZXJzKCk7Ci0KLQkJCQlwYWNrYWdlci53cml0ZUZvbGRlcihyZXNvdXJjZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5hcHBlbmQocmVzb3VyY2UuZ2V0TmFtZSgpKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IHJlc291cmNlcyE9IG51bGwgJiYgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQlkb1BhY2tNb2R1bGUocmVzb3VyY2VzW2ldLCBwYWNrYWdlcik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgZGVzdGluYXRpb24gPSByZXNvdXJjZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5hcHBlbmQocmVzb3VyY2UuZ2V0TmFtZSgpKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2UuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQkJcGFja2FnZXIud3JpdGUoZmlsZSwgZGVzdGluYXRpb24pOwotCQkJCWVsc2UgewotCQkJCQlGaWxlIGZpbGUyID0gKEZpbGUpIHJlc291cmNlLmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7Ci0JCQkJCXBhY2thZ2VyLndyaXRlKGZpbGUyLCBkZXN0aW5hdGlvbik7Ci0JCQkJfQotCQkJfQotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBjb3B5TW9kdWxlKElNb2R1bGUgbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUHJvamVjdE1vZHVsZSBwbSA9KFByb2plY3RNb2R1bGUpbW9kdWxlLmxvYWRBZGFwdGVyKFByb2plY3RNb2R1bGUuY2xhc3MsIG1vbml0b3IpOwotCQlJU3RhdHVzW10gc3RhdHVzID0gUHVibGlzaFV0aWwucHVibGlzaFNtYXJ0KHBtLm1lbWJlcnMoKSwgZkFzc2VtYmxlUm9vdCwgbW9uaXRvcik7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMubGVuZ3RoID4gMCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1c1swXSk7Ci0JCXJldHVybiBmQXNzZW1ibGVSb290OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvQW50UHVibGlzaGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL0FudFB1Ymxpc2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTg4NWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvQW50UHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5wdWJsaXNoZXJzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuVmFyaWFibGVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNQdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5jb3JlLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwubW9kZWwuSUV4dGVybmFsVG9vbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBBbnQgYmFzZWQgcHVibGlzaGVyLiBBbGwgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgc2VydmVyIGRlZmluaXRpb24gZmlsZQotICogYXJlIHBhc3NlZCBpbnRvIHRoZSBBTlQgYnVpbGQgZmlsZSBhcyBwcm9wZXJ0aWVzLiBJbiBhZGRpdGlvbiB0byB0aGUKLSAqIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgc2VydmVyIGRlZmluaXRpb24gPEk+bW9kdWxlLmRpcjwvST4sCi0gKiA8ST5tb2R1bGUubmFtZSw8L0k+IGFuZCA8ST5zZXJ2ZXIucHVibGlzaC5kaXI8L0k+IGFyZSBjb21wdXRlZCBhbmQgcGFzc2VkCi0gKiB0byB0aGUgZGVmaW5pdGlvbiBmaWxlLgotICogPHVsPgotICogPGxpPm1vZHVsZS5kaXI6IGluY2x1ZGVzIHRoZSByb290IG9mIHRoZSBtb2R1bGUgcHJvamVjdCBmaWxlPC9saT4KLSAqIDxsaT5tb2R1bGUubmFtZTogdGhlIG5hbWUgb2YgdGhlIG1vZHVsZTwvbGk+Ci0gKiA8bGk+c2VydmVyLnB1Ymxpc2guZGlyOiB0aGUgZGlyZWN0b3J5IHRvIHB1dCB0aGUgZGVwbG95bWVudCB1bml0czwvbGk+Ci0gKiA8bGk+cHJvamVjdC53b3JraW5nLmRpcjogdGhlIHdvcmtpbmcgZGlyIG9mIHRoZSBwcm9qZWN0IHRoYXQgZGVwbG95ZWQgbW9kdWxlCi0gKiBpcyBpbjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi0KLXB1YmxpYyBjbGFzcyBBbnRQdWJsaXNoZXIgZXh0ZW5kcyBHZW5lcmljUHVibGlzaGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX1BST1RPQ09MX1BSRUZJWCA9ICJqYXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBwdWJsaXNoZXIgaWQgZm9yIEFOVCBwdWJsaXNoZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NFUlZFUl9QVUJMSVNIX0RJUiA9ICJzZXJ2ZXIucHVibGlzaC5kaXIiOy8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUFJPSkVDVF9XT1JLSU5HX0RJUiA9ICJwcm9qZWN0LndvcmtpbmcuZGlyIjsvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX01PRFVMRV9ESVIgPSAibW9kdWxlLmRpciI7Ly8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9NT0RVTEVfTkFNRSA9ICJtb2R1bGUubmFtZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9DT05URVhUX1JPT1QgPSAiY29udGV4dFJvb3QiOy8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUFJPSkVDVF9OQU1FID0gInByb2plY3QubmFtZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1BVQkxJU0hfVEFSR0VUX1BSRUZJWCA9ICJ0YXJnZXQucHVibGlzaC4iOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVU5QVUJMSVNIX1RBUkdFVF9QUkVGSVggPSAidGFyZ2V0LnVucHVibGlzaC4iOy8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfTkFNRV9CVUlMRF9GSUxFID0gImJ1aWxkLmZpbGUiOy8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTU9EVUxFX0FSQ0hJVkVfTkFNRSA9ICJtb2R1bGUuYXJjaGl2ZS5uYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuc2VydmVyLmNvcmUubW9kZWwuSVB1Ymxpc2hlciNwdWJsaXNoKG9yZy5lY2xpcHNlLnd0cC5zZXJ2ZXIuY29yZS5yZXNvdXJjZXMuSU1vZHVsZVJlc291cmNlW10sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c1tdIHB1Ymxpc2goSU1vZHVsZUFydGlmYWN0W10gcmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZ2V0TW9kdWxlKCkubGVuZ3RoID4gMSkvLyBvbmx5IHJlc3BvbmQgdG8gcm9vdCBtb2R1bGUgY2FsbHMuCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWFzc2VtYmxlTW9kdWxlKG1vbml0b3IpOwotCQkJRmlsZSBmaWxlID0gZ2V0Q3VzdG9tQnVpbGRGaWxlKCk7Ci0JCQlpZiAoIGZpbGUgPT0gbnVsbCl7Ly8gbm8gdXNlciBzZWxlY3RlZCBidWlsZCBmaWxlIHVzZSB0aGUgYWRhcHRlciBkZWZhdWx0LgotCQkJCWZpbGUgPSBjb21wdXRlQnVpbGRGaWxlKCk7Ci0JCQl9Ci0JCQlydW5BbnQoZmlsZS50b1N0cmluZygpLCBnZXRQdWJsaXNoVGFyZ2V0c0Zvck1vZHVsZSgpLCBnZXRQdWJsaXNoUHJvcGVydGllcygpLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yUHVibGlzaEFudHB1Ymxpc2hlciwgZSk7Ci0JCQlDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2cocyk7Ci0JCQlyZXR1cm4gbmV3IElTdGF0dXNbXSB7IHMgfTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlbWJsZU1vZHVsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIgYXNzZW1ibGVyID0gQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIuRmFjdG9yeS5nZXRNb2R1bGVBc3NlbWJsZXIoZ2V0TW9kdWxlKClbMF0sIGdldFNlcnZlcigpKTsKLQkJYXNzZW1ibGVyLmFzc2VtYmxlKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1c3RvbSBidWlsZCBmaWxlIHRoYXQgdXNlciBzZWxlY3RlZC4gT3IgcmV0dXJucyBudWxsOwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldEN1c3RvbUJ1aWxkRmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gKFN0cmluZylnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKS5nZXQoIEdlbmVyaWNTZXJ2ZXIuUFJPUF9DVVNUT01fQlVJTERfU0NSSVBUICk7Ci0JCWlmKCBmaWxlbmFtZSAhPSBudWxsICYmIGZpbGVuYW1lLmxlbmd0aCgpPjAgKXsKLQkJCWZpbGVuYW1lID0gVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKS5wZXJmb3JtU3RyaW5nU3Vic3RpdHV0aW9uKCBmaWxlbmFtZSApOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotCQkJaWYgKCAhZmlsZS5leGlzdHMoKSApewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCSJTZWxlY3RlZCBidWlsZCBmaWxlIGRvZXMgbm90IGV4aXN0LiIpKTsKLQkJCX0KLQkJCXJldHVybiBmaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGZpbGUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIEZpbGUgY29tcHV0ZUJ1aWxkRmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShnZXRTZXJ2ZXJSdW50aW1lKCkuZ2V0U2VydmVyVHlwZURlZmluaXRpb24oKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudE5hbWVzcGFjZSgpKTsKLQkJVVJMIGJ1bmRsZVVybCA9IGJ1bmRsZS5nZXRFbnRyeShnZXRCdWlsZEZpbGUoKSk7Ci0JCVVSTCBmaWxlVVJMID0gRmlsZVV0aWwucmVzb2x2ZVVSTChidW5kbGVVcmwpOwotCQlpZiAoZmlsZVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscyhKQVJfUFJPVE9DT0xfUFJFRklYKSkgewotCQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZVVSTC5nZXRQYXRoKCk7Ci0JCQkJU3RyaW5nIGphcm5hbWUgPSBmaWxlVVJMLmdldEZpbGUoKS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUuaW5kZXhPZignIScpKTsKLQotCQkJCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwoamFybmFtZSkuZ2V0RmlsZSgpKTsKLQkJCQlKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKGphckZpbGUpOwotCQkJCUZpbGUgdG1wRmlsZSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKGdldEJ1aWxkRmlsZSgpLCBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJCQlvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpOwotCQkJCVN0cmluZyBlbnRyeW5hbWUgPSBnZXRCdWlsZEZpbGUoKTsKLQkJCQlpZiAoZW50cnluYW1lLnN0YXJ0c1dpdGgoIi8iKSkvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5bmFtZSA9IGVudHJ5bmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQkJSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoZW50cnluYW1lKTsKLQkJCQlpcyA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQkJRmlsZVV0aWwuY29weShpcywgb3MpOwotCQkJCXJldHVybiB0bXBGaWxlOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUlTdGF0dXMgcyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsICJlcnJvciBjcmVhdGluZyB0ZW1wb3JhcnkgYnVpbGQgZmlsZSIsIGUpOy8vJE5PTi1OTFMtMSQKLQkJCQlDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2cocyk7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24ocyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJaWYgKG9zICE9IG51bGwpCi0JCQkJCQlvcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9IAotCQlyZXR1cm4gRmlsZVV0aWwucmVzb2x2ZUZpbGUoZmlsZVVSTCk7Ci0JCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHVibGlzaFRhcmdldHNGb3JNb2R1bGUoKSB7Ci0JCXJldHVybiBkb0dldFRhcmdldHMoTU9EVUxFX1BVQkxJU0hfVEFSR0VUX1BSRUZJWCArIGdldE1vZHVsZVR5cGVJZCgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRVbnB1Ymxpc2hUYXJnZXRzRm9yTW9kdWxlKCkgewotCQlyZXR1cm4gZG9HZXRUYXJnZXRzKE1PRFVMRV9VTlBVQkxJU0hfVEFSR0VUX1BSRUZJWCArIGdldE1vZHVsZVR5cGVJZCgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBkb0dldFRhcmdldHMoU3RyaW5nIGRhdGFuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUnVudGltZSgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKCkuZ2V0UHVibGlzaGVyKFBVQkxJU0hFUl9JRCkuZ2V0UHVibGlzaGVyZGF0YSgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVB1Ymxpc2hlckRhdGEgZGF0YSA9IChQdWJsaXNoZXJEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZGF0YW5hbWUuZXF1YWxzKGRhdGEuZ2V0RGF0YW5hbWUoKSkpIHsKLQkJCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkKLQkJCQkJYnVmZmVyLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKGRhdGEuZ2V0RGF0YXZhbHVlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNb2R1bGVUeXBlSWQoKSB7Ci0JCXJldHVybiBnZXRNb2R1bGUoKVswXS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRCdWlsZEZpbGUoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUnVudGltZSgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKCkuZ2V0UHVibGlzaGVyKFBVQkxJU0hFUl9JRCkuZ2V0UHVibGlzaGVyZGF0YSgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVB1Ymxpc2hlckRhdGEgZGF0YSA9IChQdWJsaXNoZXJEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoREFUQV9OQU1FX0JVSUxEX0ZJTEUuZXF1YWxzKGRhdGEuZ2V0RGF0YW5hbWUoKSkpCi0JCQkJcmV0dXJuIGdldFNlcnZlclJ1bnRpbWUoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZGF0YS5nZXREYXRhdmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0UHVibGlzaFByb3BlcnRpZXMoKSB7Ci0JCU1hcCBwcm9wcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gYnVpbGQgZmlsZS4KLQkJTWFwIHNlcnZlclByb3BlcnRpZXMgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJTWFwIHByb3BlcnRpZXMgPSBnZXRTZXJ2ZXJSdW50aW1lKCkuZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCXByb3BlcnRpZXMucHV0QWxsKHNlcnZlclByb3BlcnRpZXMpOwotCQlJdGVyYXRvciBwcm9wZXJ0eUl0ZXJhdG9yID0gcHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocHJvcGVydHlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBwcm9wZXJ0eSA9IChTdHJpbmcpIHByb3BlcnR5SXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQocHJvcGVydHkpOwotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQlwcm9wcy5wdXQocHJvcGVydHksIHByb3BlcnRpZXMuZ2V0KHByb3BlcnR5KSk7Ci0JCX0KLQkJTW9kdWxlIG1vZHVsZSA9IGdldFNlcnZlclJ1bnRpbWUoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbigpLmdldE1vZHVsZShnZXRNb2R1bGVUeXBlSWQoKSk7Ci0JCVN0cmluZyBtb2REaXIgPSBtb2R1bGUuZ2V0UHVibGlzaERpcigpOwotCQltb2REaXIgPSBnZXRTZXJ2ZXJSdW50aW1lKCkuZ2V0U2VydmVyVHlwZURlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKG1vZERpcik7Ci0JCUlNb2R1bGUgd2ViTW9kdWxlID0gZ2V0TW9kdWxlKClbMF07Ci0KLQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBndWVzc01vZHVsZU5hbWUod2ViTW9kdWxlKTsKLQkJU3RyaW5nIGNvbnRleHRSb290ID0gZ3Vlc3NDb250ZXh0Um9vdCh3ZWJNb2R1bGUpOwotCQlwcm9wcy5wdXQoUFJPUF9QUk9KRUNUX1dPUktJTkdfRElSLCBnZXRQcm9qZWN0V29ya2luZ0xvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCXByb3BzLnB1dChQUk9QX01PRFVMRV9OQU1FLCBtb2R1bGVOYW1lKTsKLQkJcHJvcHMucHV0KFBST1BfQ09OVEVYVF9ST09ULCBjb250ZXh0Um9vdCk7Ci0JCWlmIChpc01vZHVsZVR5cGUod2ViTW9kdWxlLCAianN0LmVhciIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJcHJvcHMucHV0KFBST1BfTU9EVUxFX0FSQ0hJVkVfTkFNRSwgbW9kdWxlTmFtZSArICIuZWFyIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChpc01vZHVsZVR5cGUod2ViTW9kdWxlLCAianN0LndlYiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3BzLnB1dChQUk9QX01PRFVMRV9BUkNISVZFX05BTUUsIG1vZHVsZU5hbWUgKyAiLndhciIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoaXNNb2R1bGVUeXBlKHdlYk1vZHVsZSwgImpzdC5lamIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9wcy5wdXQoUFJPUF9NT0RVTEVfQVJDSElWRV9OQU1FLCBtb2R1bGVOYW1lICsgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICh3ZWJNb2R1bGUuZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCXByb3BzLnB1dChQUk9QX01PRFVMRV9ESVIsIGdldE1vZHVsZVdvcmtpbmdEaXIoKS50b1N0cmluZygpKTsKLQkJCXByb3BzLnB1dChQUk9QX1BST0pFQ1RfTkFNRSwgd2ViTW9kdWxlLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQl9Ci0JCXByb3BzLnB1dChQUk9QX1NFUlZFUl9QVUJMSVNIX0RJUiwgbW9kRGlyKTsKLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0TW9kdWxlV29ya2luZ0RpcigpIHsKLQkJcmV0dXJuIGdldFByb2plY3RXb3JraW5nTG9jYXRpb24oKS5hcHBlbmQoZ2V0TW9kdWxlKClbMF0uZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRQcm9qZWN0V29ya2luZ0xvY2F0aW9uKCkgewotCQlyZXR1cm4gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0VGVtcERpcmVjdG9yeShnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXIoKS5nZXRJZCgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBndWVzc01vZHVsZU5hbWUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBtb2R1bGUuZ2V0TmFtZSgpOwotCQlpZiAoImpzdC53ZWIiLmVxdWFscyhnZXRNb2R1bGVUeXBlSWQoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSkgZ2V0TW9kdWxlKClbMF0ubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQlpZiAod2ViTW9kdWxlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbW9kdWxlLmdldE5hbWUoKTsKLQkJCX0KLQkJCVN0cmluZyBjb250ZXh0Um9vdCA9IHdlYk1vZHVsZS5nZXRVUkkobW9kdWxlKTsKLQkJCW1vZHVsZU5hbWUgPSBjb250ZXh0Um9vdC5zdWJzdHJpbmcoMCwgY29udGV4dFJvb3QubGFzdEluZGV4T2YoJy4nKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZU5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ3Vlc3NDb250ZXh0Um9vdChJTW9kdWxlIG1vZHVsZSkgewotCQlTdHJpbmcgbW9kdWxlTmFtZSA9IGd1ZXNzTW9kdWxlTmFtZShtb2R1bGUpOwotCQlTdHJpbmcgY29udGV4dFJvb3QgPSBtb2R1bGVOYW1lOwotCQlpZiAoImpzdC53ZWIiLmVxdWFscyhnZXRNb2R1bGVUeXBlSWQoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSkgZ2V0TW9kdWxlKClbMF0ubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQlpZiAod2ViTW9kdWxlICE9IG51bGwpIHsKLQkJCQljb250ZXh0Um9vdCA9IHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpOwotCQkJCWlmIChjb250ZXh0Um9vdCA9PSBudWxsIHx8IGNvbnRleHRSb290Lmxlbmd0aCgpID09IDApIHsKLQkJCQkJY29udGV4dFJvb3QgPSBtb2R1bGVOYW1lOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGV4dFJvb3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJ1bkFudChTdHJpbmcgYnVpbGRGaWxlLCBTdHJpbmcgdGFyZ2V0cywgTWFwIHByb3BlcnRpZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTGF1bmNoTWFuYWdlciBsYXVuY2hNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIHR5cGUgPSBsYXVuY2hNYW5hZ2VyCi0JCQkJLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklEX0FOVF9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJSVN0YXR1cyBzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5hbnRMYXVuY2hlck1pc3NpbmcsIG51bGwpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24ocyk7Ci0JCX0KLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IHR5cGUubmV3SW5zdGFuY2UobnVsbCwgcHJvcGVydGllcy5nZXQoUFJPUF9NT0RVTEVfTkFNRSkgKyAiIG1vZHVsZSBwdWJsaXNoZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl3Yy5zZXRDb250YWluZXIobnVsbCk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sIGJ1aWxkRmlsZSk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9DTEFTU1BBVEhfUFJPVklERVIsICJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl3Yy5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9BTlRfVEFSR0VUUywgdGFyZ2V0cyk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUSUVTLCBwcm9wZXJ0aWVzKTsKLQkJd2Muc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQsIGZhbHNlKTsKLQkJd2Muc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfQ0FQVFVSRV9JTl9DT05TT0xFLCB0cnVlKTsKLQkJd2Muc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfUFJJVkFURSwgdHJ1ZSk7Ci0KLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1NPVVJDRV9QQVRIX1BST1ZJREVSLCAib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfTkFNRSwgZ2V0U2VydmVyUnVudGltZSgpLmdldFZNSW5zdGFsbCgpLmdldE5hbWUoKSk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9JTlNUQUxMX1RZUEUsIGdldFNlcnZlclJ1bnRpbWUoKS5nZXRWTUluc3RhbGwoKS5nZXRWTUluc3RhbGxUeXBlKCkKLQkJCQkuZ2V0SWQoKSk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9NQUlOX1RZUEVfTkFNRSwKLQkJCQkib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmFudHN1cHBvcnQuSW50ZXJuYWxBbnRSdW5uZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl3Yy5zZXRBdHRyaWJ1dGUoRGVidWdQbHVnaW4uQVRUUl9QUk9DRVNTX0ZBQ1RPUllfSUQsIElBbnRVSUNvbnN0YW50cy5SRU1PVEVfQU5UX1BST0NFU1NfRkFDVE9SWV9JRCk7Ci0KLQkJc2V0dXBBbnRMYXVuY2hDb25maWd1cmF0aW9uKHdjKTsKLQotICAgICAgICBpZiAoICFtb25pdG9yLmlzQ2FuY2VsZWQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZyA9IHdjLmRvU2F2ZSgpOyAgICAgICAgICAKLSAgICAgICAgICAgIGxhdW5jaENvbmZpZy5sYXVuY2goSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG1vbml0b3IsIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgfSAgICAKLQl9Ci0KLQkvKioKLQkgKiBIb29rIG1ldGhvZCBmb3Igc3ViY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gd2MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEFudExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YykgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01vZHVsZVR5cGUoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBtb2R1bGVUeXBlSWQpIHsKLQkJaWYgKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkgIT0gbnVsbCAmJiBtb2R1bGVUeXBlSWQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUuR2VuZXJpY1B1Ymxpc2hlciN1bnB1Ymxpc2gob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c1tdIHVucHVibGlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQlpZiAoZ2V0TW9kdWxlKCkubGVuZ3RoID4gMSkvLyBvbmx5IHJlc3BvbmQgdG8gcm9vdCBtb2R1bGUgY2FsbHMuCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCUZpbGUgZmlsZSA9IGNvbXB1dGVCdWlsZEZpbGUoKTsKLQkJCXJ1bkFudChmaWxlLnRvU3RyaW5nKCksIGdldFVucHVibGlzaFRhcmdldHNGb3JNb2R1bGUoKSwgZ2V0UHVibGlzaFByb3BlcnRpZXMoKSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSVN0YXR1cyBzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvclJlbW92ZU1vZHVsZUFudHB1Ymxpc2hlciwgZSk7Ci0JCQlyZXR1cm4gbmV3IElTdGF0dXNbXSB7IHMgfTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL0RlZmF1bHRNb2R1bGVBc3NlbWJsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvRGVmYXVsdE1vZHVsZUFzc2VtYmxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTNlZGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvRGVmYXVsdE1vZHVsZUFzc2VtYmxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBEZWZhdWx0IG1vZHVsZSBhc3NlbWJsZXIgdGhhdCBiYXNpY2FsbHkgY29waWVzIHRoZSBjb250ZW50cy4KLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kdWxlQXNzZW1ibGVyIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIgewotCQotCXByb3RlY3RlZCBEZWZhdWx0TW9kdWxlQXNzZW1ibGVyKElNb2R1bGUgbW9kdWxlLCBHZW5lcmljU2VydmVyIHNlcnZlciwgSVBhdGggYXNzZW1ibGVSb290KSB7Ci0JCXN1cGVyKG1vZHVsZSwgc2VydmVyLCBhc3NlbWJsZVJvb3QpOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggYXNzZW1ibGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb3B5TW9kdWxlKGZNb2R1bGUsbW9uaXRvcik7CQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9FYXJNb2R1bGVBc3NlbWJsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvRWFyTW9kdWxlQXNzZW1ibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMDc2OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9FYXJNb2R1bGVBc3NlbWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLnB1Ymxpc2hlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklFbnRlcnByaXNlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhOwotCi0vKioKLSAqIFV0aWxpdHkgZm9yIEVBUiBtb2R1bGUgYXNzZW1ibHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFYXJNb2R1bGVBc3NlbWJsZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZUFzc2VtYmxlciB7Ci0KLQlwcm90ZWN0ZWQgRWFyTW9kdWxlQXNzZW1ibGVyKElNb2R1bGUgbW9kdWxlLCBHZW5lcmljU2VydmVyIHNlcnZlciwgSVBhdGggYXNzZW1ibGVSb290KQotCXsKLQkJc3VwZXIobW9kdWxlLCBzZXJ2ZXIsIGFzc2VtYmxlUm9vdCk7Ci0JfQotCi0JcHVibGljIElQYXRoIGFzc2VtYmxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCUlQYXRoIHBhcmVudCA9Y29weU1vZHVsZShmTW9kdWxlLG1vbml0b3IpOwotCQlJRW50ZXJwcmlzZUFwcGxpY2F0aW9uIGVhck1vZHVsZSA9IChJRW50ZXJwcmlzZUFwcGxpY2F0aW9uKWZNb2R1bGUubG9hZEFkYXB0ZXIoSUVudGVycHJpc2VBcHBsaWNhdGlvbi5jbGFzcywgbW9uaXRvcik7Ci0JCUlNb2R1bGVbXSBjaGlsZE1vZHVsZXMgPSBlYXJNb2R1bGUuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTW9kdWxlcy5sZW5ndGg7IGkrKykgewotCQkJSU1vZHVsZSBtb2R1bGUgPSBjaGlsZE1vZHVsZXNbaV07Ci0JCQlTdHJpbmcgdXJpID0gZWFyTW9kdWxlLmdldFVSSShtb2R1bGUpOwotCQkJaWYodXJpPT1udWxsKXsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsCSJ1bmFibGUgdG8gYXNzZW1ibGUgbW9kdWxlIG51bGwgdXJpIixudWxsICk7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkJfQotCQkJaWYoIHNob3VsZFJlcGFjayggbW9kdWxlICkgKXsJCi0JCQkgICAgcGFja01vZHVsZShtb2R1bGUsdXJpLCBwYXJlbnQpOwotICAgICAgICAgICAgfQotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCS8qKgotICAgICAqIENoZWNrcyBpZiB0aGVyZSBoYXMgYmVlbiBhIGNoYW5nZSBpbiB0aGUgcHVibGlzaGVkIHJlc291cmNlcy4KLSAgICAgKiBAcGFyYW0gbW9kdWxlCi0gICAgICogQHJldHVybiBtb2R1bGUgY2hhbmdlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRSZXBhY2soIElNb2R1bGUgbW9kdWxlICkgewotICAgICAgICBmaW5hbCBTZXJ2ZXIgc2VydmVyID0gKFNlcnZlcikgZlNlcnZlci5nZXRTZXJ2ZXIoKTsKLSAgICAgICAgZmluYWwgSU1vZHVsZVtdIG1vZHVsZXMgPXttb2R1bGV9OyAKLSAgICAgICAgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YXMgPSBzZXJ2ZXIuZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YSggbW9kdWxlcyApOwotICAgICAgICByZXR1cm4gZGVsdGFzLmxlbmd0aCA+IDA7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFja01vZHVsZShJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGRlcGxveW1lbnRVbml0TmFtZSwgSVBhdGggZGVzdGluYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpLmVxdWFscygianN0LndlYiIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUFic3RyYWN0TW9kdWxlQXNzZW1ibGVyIGFzc2VtYmxlcj0gQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIuRmFjdG9yeS5nZXRNb2R1bGVBc3NlbWJsZXIobW9kdWxlLCBmU2VydmVyKTsKLQkJCUlQYXRoIHdlYkFwcFBhdGggPSBhc3NlbWJsZXIuYXNzZW1ibGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlTdHJpbmcgcmVhbERlc3RpbmF0aW9uID0gZGVzdGluYXRpb24uYXBwZW5kKGRlcGxveW1lbnRVbml0TmFtZSkudG9TdHJpbmcoKTsKLQkJCU1vZHVsZVBhY2thZ2VyIHBhY2thZ2VyPW51bGw7Ci0JCQl0cnkgewotCQkJCXBhY2thZ2VyID1uZXcgTW9kdWxlUGFja2FnZXIocmVhbERlc3RpbmF0aW9uLGZhbHNlKTsKLQkJCQlwYWNrYWdlci5wYWNrKHdlYkFwcFBhdGgudG9GaWxlKCksd2ViQXBwUGF0aC50b09TU3RyaW5nKCkpOwotCQkJCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJInVuYWJsZSB0byBhc3NlbWJsZSBtb2R1bGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQl9Ci0JCQlmaW5hbGx5ewotCQkJCWlmKHBhY2thZ2VyIT1udWxsKQotCQkJCXsKLQkJCQkJCi0JCQkJCXRyeSB7Ci0JCQkJCQlwYWNrYWdlci5maW5pc2hlZCgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBVbmhhbmRsZWQKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0KLQkJCQotCQkJCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdXBlci5wYWNrTW9kdWxlKG1vZHVsZSwgZGVwbG95bWVudFVuaXROYW1lLCBkZXN0aW5hdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL01vZHVsZVBhY2thZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL01vZHVsZVBhY2thZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNmM0ZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9Nb2R1bGVQYWNrYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0qIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qIAotKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKiAgICAgICAgICAgICAgIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLnB1Ymxpc2hlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphck91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotLyoqCi0gKiBQYWNrYWdlcyByZXNvdXJjZXMgdG8gYSAuemlwIGZpbGUKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVBhY2thZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0ZJTEVfU0VQRVJBVE9SID0gIi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBKYXJPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtOwotLy8JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgbWFuaWZlc3RDb250ZW50czsKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VDb21wcmVzc2lvbiA9IHRydWU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21wcmVzcyBib29sZWFuCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE1vZHVsZVBhY2thZ2VyKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiBjb21wcmVzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUGF0aCBkaXJlY3RvcnlQYXRoID0gbmV3IFBhdGgoZmlsZW5hbWUpOwotCQlkaXJlY3RvcnlQYXRoID0gKFBhdGgpIGRpcmVjdG9yeVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQlGaWxlIG5ld1ppcEZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnlQYXRoLnRvU3RyaW5nKCkpOwotCQluZXdaaXBGaWxlLm1rZGlycygpOwotCQlvdXRwdXRTdHJlYW0gPSBuZXcgSmFyT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSk7IAotCQl1c2VDb21wcmVzc2lvbiA9IGNvbXByZXNzOwotCX0KLQotCS8qKgotCSAqIERvIGFsbCByZXF1aXJlZCBjbGVhbnVwIG5vdyB0aGF0IHdlJ3JlIGZpbmlzaGVkIHdpdGggdGhlIGN1cnJlbnRseS1vcGVuIC56aXAKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBaaXBFbnRyeSB3aXRoIHRoZSBwYXNzZWQgcGF0aG5hbWUgYW5kIGNvbnRlbnRzLCBhbmQgd3JpdGUgaXQgdG8gdGhlIGN1cnJlbnQKLQkgKiBhcmNoaXZlCi0JICogCi0JICogQHBhcmFtIHBhdGhuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogICAgICAgICAgICBieXRlW10KLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZShTdHJpbmcgcGF0aG5hbWUsIGJ5dGVbXSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJWmlwRW50cnkgbmV3RW50cnkgPSBuZXcgWmlwRW50cnkocGF0aG5hbWUpOwotCi0JCS8vIGlmIHRoZSBjb250ZW50cyBhcmUgYmVpbmcgY29tcHJlc3NlZCB0aGVuIHdlIGdldCB0aGUgYmVsb3cgZm9yIGZyZWUuCi0JCWlmICghdXNlQ29tcHJlc3Npb24pIHsKLQkJCW5ld0VudHJ5LnNldE1ldGhvZChaaXBFbnRyeS5TVE9SRUQpOwotCQkJbmV3RW50cnkuc2V0U2l6ZShjb250ZW50cy5sZW5ndGgpOwotCQkJQ1JDMzIgY2hlY2tzdW1DYWxjdWxhdG9yID0gbmV3IENSQzMyKCk7Ci0JCQljaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKGNvbnRlbnRzKTsKLQkJCW5ld0VudHJ5LnNldENyYyhjaGVja3N1bUNhbGN1bGF0b3IuZ2V0VmFsdWUoKSk7Ci0JCX0KLQotCQlvdXRwdXRTdHJlYW0ucHV0TmV4dEVudHJ5KG5ld0VudHJ5KTsKLQkJb3V0cHV0U3RyZWFtLndyaXRlKGNvbnRlbnRzKTsKLQkJb3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzdGluYXRpb25QYXRoCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlRm9sZGVyKFN0cmluZyBkZXN0aW5hdGlvblBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghZGVzdGluYXRpb25QYXRoLmVuZHNXaXRoKEpBUl9GSUxFX1NFUEVSQVRPUiApKSAKLQkJCWRlc3RpbmF0aW9uUGF0aCA9IGRlc3RpbmF0aW9uUGF0aCArIEpBUl9GSUxFX1NFUEVSQVRPUjsKLQkJWmlwRW50cnkgbmV3RW50cnkgPSBuZXcgWmlwRW50cnkoZGVzdGluYXRpb25QYXRoKTsKLQkJb3V0cHV0U3RyZWFtLnB1dE5leHRFbnRyeShuZXdFbnRyeSk7Ci0JCW91dHB1dFN0cmVhbS5jbG9zZUVudHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgdGhlIHBhc3NlZCByZXNvdXJjZSB0byB0aGUgY3VycmVudCBhcmNoaXZlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZQotCSAqIEBwYXJhbSBkZXN0aW5hdGlvblBhdGgKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoSUZpbGUgcmVzb3VyY2UsIFN0cmluZyBkZXN0aW5hdGlvblBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJY29udGVudFN0cmVhbSA9IHJlc291cmNlLmdldENvbnRlbnRzKGZhbHNlKTsKLQkJCXdyaXRlKGNvbnRlbnRTdHJlYW0sIGRlc3RpbmF0aW9uUGF0aCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY29udGVudFN0cmVhbSAhPSBudWxsKQotCQkJCWNvbnRlbnRTdHJlYW0uY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBwYXNzZWQgcmVzb3VyY2UgdG8gdGhlIGN1cnJlbnQgYXJjaGl2ZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgamF2YS5pby5JRmlsZQotCSAqIEBwYXJhbSBkZXN0aW5hdGlvblBhdGgKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoRmlsZSByZXNvdXJjZSwgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyZXNvdXJjZSk7Ci0JCQl3cml0ZShjb250ZW50U3RyZWFtLCBkZXN0aW5hdGlvblBhdGgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNvbnRlbnRTdHJlYW0gIT0gbnVsbCkKLQkJCQljb250ZW50U3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudFN0cmVhbQotCSAqIEBwYXJhbSBkZXN0aW5hdGlvblBhdGgKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCWludCBjaHVua1NpemUgPSBjb250ZW50U3RyZWFtLmF2YWlsYWJsZSgpOwotCQkJYnl0ZVtdIHJlYWRCdWZmZXIgPSBuZXcgYnl0ZVtjaHVua1NpemVdOwotCQkJaW50IG4gPSBjb250ZW50U3RyZWFtLnJlYWQocmVhZEJ1ZmZlcik7Ci0KLQkJCXdoaWxlIChuID4gMCkgewotCQkJCW91dHB1dC53cml0ZShyZWFkQnVmZmVyKTsKLQkJCQluID0gY29udGVudFN0cmVhbS5yZWFkKHJlYWRCdWZmZXIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG91dHB1dCAhPSBudWxsKQotCQkJCW91dHB1dC5jbG9zZSgpOwotCQl9Ci0KLQkJd3JpdGUoZGVzdGluYXRpb25QYXRoLCBvdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0JfQotCQotCS8qKgotCSAqIHBhY2sgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHJvb3QKLQkgKiBAcGFyYW0gZGlyZWN0b3J5Ci0JICogQHBhcmFtIHJvb3QKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcGFjayhGaWxlIGRpcmVjdG9yeSwgU3RyaW5nIHJvb3QpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCXsKLSAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotICAgICAgICBpZiAoIGZpbGVzID09IG51bGwgKXsKLSAgICAgICAgCXJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAJU3RyaW5nIHJlbGF0aXZlRm9sZGVyID0gbWFrZVJlbGF0aXZlKCBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSwgcm9vdCApOwotICAgICAgICAgICAgaWYoIGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgCWlmKCByZWxhdGl2ZUZvbGRlciAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ly8gc2hvdWxkIGFsd2F5cyBiZSB0cnVlCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlRm9sZGVyKCByZWxhdGl2ZUZvbGRlciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYWNrKCBmaWxlc1tpXSwgcm9vdCApOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJaWYoIHJlbGF0aXZlRm9sZGVyICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsvLyBzaG91bGQgYWx3YXlzIGJlIHRydWUKLSAgICAgICAgICAgICAgICAgICAgd3JpdGUoIGZpbGVzW2ldLCByZWxhdGl2ZUZvbGRlciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCS8qKgotCSAqIE1ha2UgZGlyZWN0b3J5bmFtZSByZWxhdGl2ZSB0byByb290Ci0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHBhcmFtIHJvb3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZVJlbGF0aXZlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIHJvb3QpCi0JewotCQlTdHJpbmcgZm9sZGVyPW51bGw7Ci0JCWlmKGZpbGVOYW1lLnN0YXJ0c1dpdGgocm9vdCkpCi0JCXsKLQkJCWZvbGRlcj1maWxlTmFtZS5zdWJzdHJpbmcocm9vdC5sZW5ndGgoKSk7Ci0JCX0KLSAgICAgICAgZm9sZGVyID0gZm9sZGVyLnJlcGxhY2VBbGwoIlxcXFwiLCAiLyIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGlmIChmb2xkZXIubGVuZ3RoKCkgPiAwICYmIGZvbGRlci5jaGFyQXQoMCkgPT0gJy8nKQotICAgICAgICAgICAgICBmb2xkZXIgPSBmb2xkZXIuc3Vic3RyaW5nKDEpOwotCQlyZXR1cm4gZm9sZGVyOwkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9XYXJNb2R1bGVBc3NlbWJsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvV2FyTW9kdWxlQXNzZW1ibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMzM1NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9XYXJNb2R1bGVBc3NlbWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotCi0vKioKLSAqIEFzc2VtYmx5IHV0aWxpdHkgZm9yIHdhciBtb2R1bGVzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXYXJNb2R1bGVBc3NlbWJsZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZUFzc2VtYmxlciB7Ci0JCi0JcHJvdGVjdGVkIFdhck1vZHVsZUFzc2VtYmxlcihJTW9kdWxlIG1vZHVsZSwgR2VuZXJpY1NlcnZlciBzZXJ2ZXIsIElQYXRoIGFzc2VtYmxlUm9vdCkKLQl7Ci0JCXN1cGVyKG1vZHVsZSwgc2VydmVyLCBhc3NlbWJsZVJvb3QpOwotCX0KLQotCXB1YmxpYyBJUGF0aCBhc3NlbWJsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uewotCQlJUGF0aCBwYXJlbnQgPWNvcHlNb2R1bGUoZk1vZHVsZSxtb25pdG9yKTsKLQkJSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSlmTW9kdWxlLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG1vbml0b3IpOwotCQlJTW9kdWxlW10gY2hpbGRNb2R1bGVzID0gd2ViTW9kdWxlLmdldE1vZHVsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gY2hpbGRNb2R1bGVzW2ldOwotCQkJcGFja01vZHVsZShtb2R1bGUsIHdlYk1vZHVsZS5nZXRVUkkobW9kdWxlKSwgcGFyZW50KTsKLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9jb3JlL3V0aWwvRXh0ZW5zaW9uUG9pbnRVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvY29yZS91dGlsL0V4dGVuc2lvblBvaW50VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODUzZDE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9jb3JlL3V0aWwvRXh0ZW5zaW9uUG9pbnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbjsKLS8qKgotICogVXRpbGl0aWVzIGZvciBoYW5kbGluZyB0aGUgZXh0ZW5zaW9uIHBvaW50cy4KLSAqCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uUG9pbnRVdGlsIHsKLSAgICAvKioKLSAgICAgKiBzZXJ2ZXJkZWZpbml0aW9uIGV4dGVuc2lvbiBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUkRFRklOSVRJT05fRVhURU5TSU9OX0lEID0gInNlcnZlcmRlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRURFRklOSVRJT05fRVhURU5TSU9OX0lEID0gInJ1bnRpbWVkZWZpbml0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUklDUFVCTElTSEVSX0VYVEVOU0lPTl9JRCA9ICJnZW5lcmljcHVibGlzaGVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fU0VSVkVSX1RZUEUgPSAic2VydmVyVHlwZXMiOy8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgc2VydmVyZGVmaW5pdGlvbiBleHRlbnNpb25zCi0gICAgICogQHJldHVybiBzZXJ2ZXJkZWZpbml0aW9uIEV4dGVuc2lvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElFeHRlbnNpb25bXSBnZXRHZW5lcmljU2VydmVyRGVmaW5pdGlvbkV4dGVuc2lvbnMoKXsKLSAgICAgICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoQ29yZVBsdWdpbi5QTFVHSU5fSUQrIi4iK1NFUlZFUkRFRklOSVRJT05fRVhURU5TSU9OX0lEKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgcnVudGltZWRlZmluaXRpb24gZXh0ZW5zaW9ucwotICAgICAqIEByZXR1cm4gcnVudGltZWRlZmluaXRpb24gRXh0ZW5zaW9ucwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUV4dGVuc2lvbltdIGdldEdlbmVyaWNTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbkV4dGVuc2lvbnMoKXsKLSAgICAgICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoQ29yZVBsdWdpbi5QTFVHSU5fSUQrIi4iK1JVTlRJTUVERUZJTklUSU9OX0VYVEVOU0lPTl9JRCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBwdWJsaXNoZXIgZXh0ZW5zaW9ucwotICAgICAqIEByZXR1cm4gZ2VuZXJpY3B1Ymxpc2hlciBleHRlbnNpb25zCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRXh0ZW5zaW9uW10gZ2V0R2VuZXJpY1B1Ymxpc2hlckV4dGVuc2lvbigpewotICAgICAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhDb3JlUGx1Z2luLlBMVUdJTl9JRCsiLiIrR0VORVJJQ1BVQkxJU0hFUl9FWFRFTlNJT05fSUQpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUV4dGVuc2lvbltdIGdldEV4dGVuc2lvbnMoU3RyaW5nIGV4dGVuc2lvbklkKXsKLSAgICAgICAgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50PWdldEV4dGVuc2lvblBvaW50KGV4dGVuc2lvbklkKTsKLSAgICAgICAgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25zOwotICAgIH0KLSAKLSAgICBwcml2YXRlIHN0YXRpYyBJRXh0ZW5zaW9uUG9pbnQgZ2V0RXh0ZW5zaW9uUG9pbnQoU3RyaW5nIGlkKQotICAgIHsKLSAgICAgICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAgICAgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50PSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChpZCk7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25Qb2ludDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cwotICAgICAqCi0gICAgICogQHBhcmFtIGV4dGVuc2lvbgotICAgICAqIEByZXR1cm4gY29uZmlndXJhdGlvbkVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWd1cmF0aW9uRWxlbWVudHMoSUV4dGVuc2lvbiBleHRlbnNpb24pewotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uIT1udWxsP2V4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTpudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgbGlzdGVuZXIgdG8gZXh0ZW5zaW9uIHJlZ2lzdHJ5LgotICAgICAqIEBwYXJhbSBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZWdpc3RyeUxpc3RlbmVyKElSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKXsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVnaXN0cnkuYWRkUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgQ29yZVBsdWdpbi5QTFVHSU5fSUQpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2Ygc2VydmVycyB3aXRoIHRoZSBnaXZlbiBsYXVuY2ggY29uZmlndXJhdGlvbiBJRC4KLSAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGlzIG5vbmUuCi0gICAgICogQHBhcmFtIGxhdW5jaENvbmZpZ0lkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyVHlwZXNGcm9tTGF1bmNoQ29uZmlnKFN0cmluZyBsYXVuY2hDb25maWdJZCl7Ci0gICAgICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiLCBFWFRFTlNJT05fU0VSVkVSX1RZUEUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNmLmxlbmd0aDsgaSsrICkKLSAgICAgICAgeyAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGlkID0gIGNmW2ldLmdldEF0dHJpYnV0ZSggImxhdW5jaENvbmZpZ0lkIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZC5lcXVhbHMoIGxhdW5jaENvbmZpZ0lkICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoIGNmW2ldLmdldEF0dHJpYnV0ZSggImlkIiApICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICB9OwotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKWxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0gICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2NvcmUvdXRpbC9GaWxlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2NvcmUvdXRpbC9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjEwNTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9jb3JlL3V0aWwvRmlsZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotCi0vKioKLSAqIFV0aWxpdGllcyBmb3IgZmlsZSBvcGVyYXRpb25zLgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWwgewotCi0JCi0JCi0JLyoqCi0JICogUmV0dXJucyBhIHJlc29sdmVkIGVxdWl2YWxlbnQgb2YgdXJsLCB1c2Ugd2l0aCB0aGUgCi0JICogcGxhdGZvcm0gcmVsYXRpdmUgdXJscwotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIHJlc29sdmVVUkwoVVJMIHVybCl7Ci0JCXRyeXsKLQkJCXJldHVybiBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0JCX1jYXRjaChJT0V4Y2VwdGlvbiBlKXsKLQkJCS8vaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCQotCS8qKgotCSAqIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZGlyCi0JICogQHJldHVybiBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZVRlbXBGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGlyKXsKLQkJaWYobmFtZT09bnVsbCB8fCBkaXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJRmlsZSB0ZW1wPW51bGw7Ci0JCVN0cmluZyBmaWxlUGF0aDsKLQkJZmlsZVBhdGggPSBuYW1lLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlpZiAoZmlsZVBhdGguc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQlmaWxlUGF0aCA9IGZpbGVQYXRoLnN1YnN0cmluZygxKTsKLQkJdGVtcCA9IG5ldyBGaWxlKGRpciwgZmlsZVBhdGgpOwotCQl2ZXJpZnlQYXRoKHRlbXAsdHJ1ZSk7Ci0JCXRlbXAuZGVsZXRlT25FeGl0KCk7Ci0JCXJldHVybiB0ZW1wOwotCQotCX0KLQkKLQkvKioKLQkgKiBDb3BpZXMgYSBmaWxlCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHBhcmFtIG91dHB1dAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uewotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07Ci0JCWludCBsZW4gPSBpbnB1dC5yZWFkKGJ1Zik7Ci0JCXdoaWxlKGxlbiE9LTEpewotCQkJb3V0cHV0LndyaXRlKGJ1ZiwwLGxlbik7Ci0JCQlsZW49IGlucHV0LnJlYWQoYnVmKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVBhdGgoRmlsZSBwYXRoLCBib29sZWFuIGlzRmlsZSkgewotCQkvLyBpZiB3ZSBhcmUgZXhwZWN0aW5nIGEgZmlsZSBiYWNrIG9mZiAxIHBhdGggZWxlbWVudAotCQlpZiAoaXNGaWxlKSB7Ci0JCQlpZiAocGF0aC5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCQkvLyBtYWtlIHN1cmUgdGhpcyBpcyBhIGZpbGUKLQkJCQlwYXRoID0gcGF0aC5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJaXNGaWxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxyZWFkeSBleGlzdHMgLi4uIGp1c3QgcmV0dXJuCi0JCWlmIChwYXRoLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQkvLyBkb2VzIG5vdCBleGlzdCAuLi4gZW5zdXJlIHBhcmVudCBleGlzdHMKLQkJRmlsZSBwYXJlbnQgPSBwYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJdmVyaWZ5UGF0aChwYXJlbnQsIGZhbHNlKTsKLQkJLy8gZW5zdXJlIGRpcmVjdG9yaWVzIGFyZSBtYWRlLiBNYXJrIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGZvciBkZWxldGlvbgotCQlpZiAoIWlzRmlsZSkKLQkJCXBhdGgubWtkaXIoKTsKLQkJcGF0aC5kZWxldGVPbkV4aXQoKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlcyBhIFVSTCB0byBhIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVybAotICAgICAqIEByZXR1cm4gZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSByZXNvbHZlRmlsZShVUkwgdXJsKXsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCByZXNvbHZlZFVybCA9IHJlc29sdmVVUkwodXJsKTsKLSAgICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkocmVzb2x2ZWRVcmwuZ2V0UHJvdG9jb2woKSwgcmVzb2x2ZWRVcmwuZ2V0SG9zdCgpLHJlc29sdmVkVXJsLmdldFBhdGgoKSwgcmVzb2x2ZWRVcmwuZ2V0UXVlcnkoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUodXJpKTsKLSAgICAgICAgfSAKLSAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAkvL2lnbm9yZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9jb3JlL3V0aWwvU2VydmVyUnVudGltZU1lcmdlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2NvcmUvdXRpbC9TZXJ2ZXJSdW50aW1lTWVyZ2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjRiNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2NvcmUvdXRpbC9TZXJ2ZXJSdW50aW1lTWVyZ2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgQ2FwZSBDbGVhciBTb2Z0d2FyZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci0KLS8qKgotICogQ29tYmluZXMgYSBydW50aW1lZGVmIGZpbGVzCi0gKiAKLSAqIC0gcHJvcGVydGllcwotICogLSBjbGFzc3BhdGhzCi0gKiAKLSAqIGVudHJpZXMgd2l0aCBhIHNlcnZlcmRlZiwgaWYgdGhlIHNlcnZlcmRlZiBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgCi0gKiB0aGVtIC0gY29udGFpbnMgY2hlY2sgaXMgZG9uZSBieSBpZC4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86ZGF2aWQuYmxhY2tAY2FwZWNsZWFyLmNvbSI+RGF2aWQgQmxhY2s8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJSdW50aW1lTWVyZ2VVdGlsIHsKLQotICAgIC8qKgotICAgICAqIENvbWJpbmVzIGEgcnVudGltZSBkZWZpbml0aW9uIGFuZCBhIHNlcnZlciBkZWZpbml0aW9uIAotICAgICAqIGludG8gYSBzaW5nbGUgbG9naWNhbCA8Y29kZT5TZXJ2ZXJSdW50aW1lPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VydmVyZGVmCi0gICAgICogQHBhcmFtIHJ1bnRpbWVkZWYKLSAgICAgKiBAcmV0dXJuIHNlcnZlcmRlZgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2VydmVyUnVudGltZSBjb21iaW5lKFNlcnZlclJ1bnRpbWUgc2VydmVyZGVmLCBTZXJ2ZXJSdW50aW1lIHJ1bnRpbWVkZWYpIHsKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBZGQgcHJvcGVydGllcyBmcm9tIHJ1bnRpbWVkZWYgdG8gc2VydmVyZGVmIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQsCi0gICAgICAgICAqIHRoaXMgZW5zdXJlcyB0aGF0OgotICAgICAgICAgKiAKLSAgICAgICAgICogKDEpIHdoaWxlIHdlIGFyZSBhZmZlY3RpbmcgdGhlIGNhY2hlZCBjb3B5IG9mIHNlcnZlcmRlZiwgaXQgaXMgYWx3YXlzCi0gICAgICAgICAqICAgICByZXF1aXJlZCB0byBiZSBjb21iaW5lZCB3aXRoIGl0cyBydW50aW1lZGVmIChpZiB0aGVyZSBpcyBvbmUpLCBhbmQKLSAgICAgICAgICogICAgIHdlIGNoZWNrIHRoYXQgdGhlIHByb3BlcnR5IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFkZGVkCi0gICAgICAgICAqICAgICAKLSAgICAgICAgICogKDIpIHNlcnZlcmRlZiBwcm9wZXJ0aWVzIGNhbiBvdmVycmlkZSBydW50aW1lZGVmIHByb3BlcnRpZXMgICAgCi0gICAgICAgICAqLwotICAgICAgICBMaXN0IHByb3BlcnRpZXMgPSBydW50aW1lZGVmLmdldFByb3BlcnR5KCk7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBwcm9wZXJ0aWVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUlmTm90UHJlc2VudChzZXJ2ZXJkZWYuZ2V0UHJvcGVydHkoKSwgcHJvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQWRkIGNsYXNzcGF0aHMgZnJvbSBydW50aW1lZGVmIHRvIHNlcnZlcmRlZiBpZiBub3QgYWxyZWFkeSBwcmVzZW50LAotICAgICAgICAgKiB0aGlzIGVuc3VyZXMgdGhhdDoKLSAgICAgICAgICogCi0gICAgICAgICAqICgxKSB3aGlsZSB3ZSBhcmUgYWZmZWN0aW5nIHRoZSBjYWNoZWQgY29weSBvZiBzZXJ2ZXJkZWYsIGl0IGlzIGFsd2F5cwotICAgICAgICAgKiAgICAgcmVxdWlyZWQgdG8gYmUgY29tYmluZWQgd2l0aCBpdHMgcnVudGltZWRlZiAoaWYgdGhlcmUgaXMgb25lKSwgYW5kCi0gICAgICAgICAqICAgICB3ZSBjaGVjayB0aGF0IHRoZSBjbGFzc3BhdGggaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWRkZWQgKGJ5IGlkKQotICAgICAgICAgKiAgICAgCi0gICAgICAgICAqICgyKSBzZXJ2ZXJkZWYgY2xhc3NwYXRoIGNhbiBvdmVycmlkZSBydW50aW1lZGVmIGNsYXNzcGF0aCBieSBpZCAgICAKLSAgICAgICAgICovCi0gICAgICAgIExpc3QgY2xhc3NwYXRocyA9IHJ1bnRpbWVkZWYuZ2V0Q2xhc3NwYXRoKCk7Ci0gICAgICAgIGlmIChjbGFzc3BhdGhzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBjbGFzc3BhdGhzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBDbGFzc3BhdGggY2xhc3NwYXRoID0gKENsYXNzcGF0aClpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhZGRDbGFzc3BhdGhJZk5vdFByZXNlbnQoc2VydmVyZGVmLmdldENsYXNzcGF0aCgpLCBjbGFzc3BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc2VydmVyZGVmOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkQ2xhc3NwYXRoSWZOb3RQcmVzZW50KExpc3QgY2xhc3NwYXRocywgQ2xhc3NwYXRoIGNsYXNzcGF0aCkgewotICAgICAgICBpZiAoIWNvbnRhaW5zQ2xhc3NwYXRoKGNsYXNzcGF0aHMsIGNsYXNzcGF0aC5nZXRJZCgpKSkgewotICAgICAgICAgICAgY2xhc3NwYXRocy5hZGQoY2xhc3NwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNDbGFzc3BhdGgoTGlzdCBwcm9wZXJ0aWVzLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBJdGVyYXRvciBpdGVyID0gcHJvcGVydGllcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIENsYXNzcGF0aCBjbGFzc3BhdGggPSAoQ2xhc3NwYXRoKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjbGFzc3BhdGguZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmb3VuZDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQcm9wZXJ0eUlmTm90UHJlc2VudChMaXN0IHByb3BlcnRpZXMsIFByb3BlcnR5IHByb3ApIHsKLSAgICAgICAgaWYgKCFjb250YWluc1Byb3BlcnR5KHByb3BlcnRpZXMsIHByb3AuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKHByb3ApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc1Byb3BlcnR5KExpc3QgcHJvcGVydGllcywgU3RyaW5nIGlkKSB7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IHByb3BlcnRpZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChwcm9wLmdldElkKCkuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZm91bmQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvZmlsZXMvRGlyZWN0b3J5U2Nhbm5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2ZpbGVzL0RpcmVjdG9yeVNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0NDZjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvZmlsZXMvRGlyZWN0b3J5U2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBFdGVyYXRpb24gQS5TLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5maWxlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiAKLSAqIERFUklWRUQgRlJPTSBBUEFDSEUgQU5UIERJUkVDVE9SWSBTQ0FOTkVSCi0gKiAKLSAqIENsYXNzIGZvciBzY2FubmluZyBhIGRpcmVjdG9yeSBmb3IgZmlsZXMvZGlyZWN0b3JpZXMgd2hpY2ggbWF0Y2ggY2VydGFpbgotICogY3JpdGVyaWEuCi0gKiA8cD4KLSAqIFRoZXNlIGNyaXRlcmlhIGNvbnNpc3Qgb2Ygc2VsZWN0b3JzIGFuZCBwYXR0ZXJucyB3aGljaCBoYXZlIGJlZW4gc3BlY2lmaWVkLgotICogV2l0aCB0aGUgc2VsZWN0b3JzIHlvdSBjYW4gc2VsZWN0IHdoaWNoIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgaW5jbHVkZWQuCi0gKiBGaWxlcyB3aGljaCBhcmUgbm90IHNlbGVjdGVkIGFyZSBleGNsdWRlZC4gV2l0aCBwYXR0ZXJucyB5b3UgY2FuIGluY2x1ZGUKLSAqIG9yIGV4Y2x1ZGUgZmlsZXMgYmFzZWQgb24gdGhlaXIgZmlsZW5hbWUuCi0gKiA8cD4KLSAqIFRoZSBpZGVhIGlzIHNpbXBsZS4gQSBnaXZlbiBkaXJlY3RvcnkgaXMgcmVjdXJzaXZlbHkgc2Nhbm5lZCBmb3IgYWxsIGZpbGVzCi0gKiBhbmQgZGlyZWN0b3JpZXMuIEVhY2ggZmlsZS9kaXJlY3RvcnkgaXMgbWF0Y2hlZCBhZ2FpbnN0IGEgc2V0IG9mIHNlbGVjdG9ycywKLSAqIGluY2x1ZGluZyBzcGVjaWFsIHN1cHBvcnQgZm9yIG1hdGNoaW5nIGFnYWluc3QgZmlsZW5hbWVzIHdpdGggaW5jbHVkZSBhbmQKLSAqIGFuZCBleGNsdWRlIHBhdHRlcm5zLiBPbmx5IGZpbGVzL2RpcmVjdG9yaWVzIHdoaWNoIG1hdGNoIGF0IGxlYXN0IG9uZQotICogcGF0dGVybiBvZiB0aGUgaW5jbHVkZSBwYXR0ZXJuIGxpc3Qgb3Igb3RoZXIgZmlsZSBzZWxlY3RvciwgYW5kIGRvbid0IG1hdGNoCi0gKiBhbnkgcGF0dGVybiBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJuIGxpc3Qgb3IgZmFpbCB0byBtYXRjaCBhZ2FpbnN0IGEgcmVxdWlyZWQKLSAqIHNlbGVjdG9yIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBsaXN0IG9mIGZpbGVzL2RpcmVjdG9yaWVzIGZvdW5kLgotICogPHA+Ci0gKiBXaGVuIG5vIGxpc3Qgb2YgaW5jbHVkZSBwYXR0ZXJucyBpcyBzdXBwbGllZCwgIioqIiB3aWxsIGJlIHVzZWQsIHdoaWNoCi0gKiBtZWFucyB0aGF0IGV2ZXJ5dGhpbmcgd2lsbCBiZSBtYXRjaGVkLiBXaGVuIG5vIGxpc3Qgb2YgZXhjbHVkZSBwYXR0ZXJucyBpcwotICogc3VwcGxpZWQsIGFuIGVtcHR5IGxpc3QgaXMgdXNlZCwgc3VjaCB0aGF0IG5vdGhpbmcgd2lsbCBiZSBleGNsdWRlZC4gV2hlbgotICogbm8gc2VsZWN0b3JzIGFyZSBzdXBwbGllZCwgbm9uZSBhcmUgYXBwbGllZC4KLSAqIDxwPgotICogVGhlIGZpbGVuYW1lIHBhdHRlcm4gbWF0Y2hpbmcgaXMgZG9uZSBhcyBmb2xsb3dzOgotICogVGhlIG5hbWUgdG8gYmUgbWF0Y2hlZCBpcyBzcGxpdCB1cCBpbiBwYXRoIHNlZ21lbnRzLiBBIHBhdGggc2VnbWVudCBpcyB0aGUKLSAqIG5hbWUgb2YgYSBkaXJlY3Rvcnkgb3IgZmlsZSwgd2hpY2ggaXMgYm91bmRlZCBieQotICogPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+ICgnLycgdW5kZXIgVU5JWCwgJ1wnIHVuZGVyIFdpbmRvd3MpLgotICogRm9yIGV4YW1wbGUsICJhYmMvZGVmL2doaS94eXouamF2YSIgaXMgc3BsaXQgdXAgaW4gdGhlIHNlZ21lbnRzICJhYmMiLAotICogImRlZiIsImdoaSIgYW5kICJ4eXouamF2YSIuCi0gKiBUaGUgc2FtZSBpcyBkb25lIGZvciB0aGUgcGF0dGVybiBhZ2FpbnN0IHdoaWNoIHNob3VsZCBiZSBtYXRjaGVkLgotICogPHA+Ci0gKiBUaGUgc2VnbWVudHMgb2YgdGhlIG5hbWUgYW5kIHRoZSBwYXR0ZXJuIGFyZSB0aGVuIG1hdGNoZWQgYWdhaW5zdCBlYWNoCi0gKiBvdGhlci4gV2hlbiAnKionIGlzIHVzZWQgZm9yIGEgcGF0aCBzZWdtZW50IGluIHRoZSBwYXR0ZXJuLCBpdCBtYXRjaGVzCi0gKiB6ZXJvIG9yIG1vcmUgcGF0aCBzZWdtZW50cyBvZiB0aGUgbmFtZS4KLSAqIDxwPgotICogVGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgcmVnYXJkaW5nIHRoZSB1c2Ugb2YgPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+cwotICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0dGVybiBhbmQgdGhlIHN0cmluZyB0byBtYXRjaDo8YnI+Ci0gKiBXaGVuIGEgcGF0dGVybiBzdGFydHMgd2l0aCBhIDxjb2RlPkZpbGUuc2VwYXJhdG9yPC9jb2RlPiwgdGhlIHN0cmluZwotICogdG8gbWF0Y2ggbXVzdCBhbHNvIHN0YXJ0IHdpdGggYSA8Y29kZT5GaWxlLnNlcGFyYXRvcjwvY29kZT4uCi0gKiBXaGVuIGEgcGF0dGVybiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+LCB0aGUKLSAqIHN0cmluZyB0byBtYXRjaCBtYXkgbm90IHN0YXJ0IHdpdGggYSA8Y29kZT5GaWxlLnNlcGFyYXRvcjwvY29kZT4uCi0gKiBXaGVuIG9uZSBvZiB0aGVzZSBydWxlcyBpcyBub3Qgb2JleWVkLCB0aGUgc3RyaW5nIHdpbGwgbm90Ci0gKiBtYXRjaC4KLSAqIDxwPgotICogV2hlbiBhIG5hbWUgcGF0aCBzZWdtZW50IGlzIG1hdGNoZWQgYWdhaW5zdCBhIHBhdHRlcm4gcGF0aCBzZWdtZW50LCB0aGUKLSAqIGZvbGxvd2luZyBzcGVjaWFsIGNoYXJhY3RlcnMgY2FuIGJlIHVzZWQ6PGJyPgotICogJyonIG1hdGNoZXMgemVybyBvciBtb3JlIGNoYXJhY3RlcnM8YnI+Ci0gKiAnPycgbWF0Y2hlcyBvbmUgY2hhcmFjdGVyLgotICogPHA+Ci0gKiBFeGFtcGxlczoKLSAqIDxwPgotICogIioqXCouY2xhc3MiIG1hdGNoZXMgYWxsIC5jbGFzcyBmaWxlcy9kaXJzIGluIGEgZGlyZWN0b3J5IHRyZWUuCi0gKiA8cD4KLSAqICJ0ZXN0XGE/Py5qYXZhIiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJzIHdoaWNoIHN0YXJ0IHdpdGggYW4gJ2EnLCB0aGVuIHR3bwotICogbW9yZSBjaGFyYWN0ZXJzIGFuZCB0aGVuICIuamF2YSIsIGluIGEgZGlyZWN0b3J5IGNhbGxlZCB0ZXN0LgotICogPHA+Ci0gKiAiKioiIG1hdGNoZXMgZXZlcnl0aGluZyBpbiBhIGRpcmVjdG9yeSB0cmVlLgotICogPHA+Ci0gKiAiKipcdGVzdFwqKlxYWVoqIiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJzIHdoaWNoIHN0YXJ0IHdpdGggIlhZWiIgYW5kIHdoZXJlCi0gKiB0aGVyZSBpcyBhIHBhcmVudCBkaXJlY3RvcnkgY2FsbGVkIHRlc3QgKGUuZy4gImFiY1x0ZXN0XGRlZlxnaGlcWFlaMTIzIikuCi0gKiA8cD4KLSAqIENhc2Ugc2Vuc2l0aXZpdHkgbWF5IGJlIHR1cm5lZCBvZmYgaWYgbmVjZXNzYXJ5LiBCeSBkZWZhdWx0LCBpdCBpcwotICogdHVybmVkIG9uLgotICogPHA+Ci0gKiBFeGFtcGxlIG9mIHVzYWdlOgotICogPHByZT4KLSAqICAgU3RyaW5nW10gaW5jbHVkZXMgPSB7IioqXFwqLmNsYXNzIn07Ci0gKiAgIFN0cmluZ1tdIGV4Y2x1ZGVzID0geyJtb2R1bGVzXFwqXFwqKiJ9OwotICogICBkcy5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7Ci0gKiAgIGRzLnNldEV4Y2x1ZGVzKGV4Y2x1ZGVzKTsKLSAqICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZSgidGVzdCIpKTsKLSAqICAgZHMuc2V0Q2FzZVNlbnNpdGl2ZSh0cnVlKTsKLSAqICAgZHMuc2NhbigpOwotICoKLSAqICAgU3lzdGVtLm91dC5wcmludGxuKCJGSUxFUzoiKTsKLSAqICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gKiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZXNbaV0pOwotICogICB9Ci0gKiA8L3ByZT4KLSAqIFRoaXMgd2lsbCBzY2FuIGEgZGlyZWN0b3J5IGNhbGxlZCB0ZXN0IGZvciAuY2xhc3MgZmlsZXMsIGJ1dCBleGNsdWRlcyBhbGwKLSAqIGZpbGVzIGluIGFsbCBwcm9wZXIgc3ViZGlyZWN0b3JpZXMgb2YgYSBkaXJlY3RvcnkgY2FsbGVkICJtb2R1bGVzIgotICoKLSAqLwotcHVibGljIGNsYXNzIERpcmVjdG9yeVNjYW5uZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyIHsKLQkKLQlwdWJsaWMgRGlyZWN0b3J5U2Nhbm5lcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nW10gaW5jbHVkZXMpIHsKLQkJc3VwZXIuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOwotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nW10gZXhjbHVkZXMpIHsKLQkJc3VwZXIuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0QmFzZWRpcihGaWxlIGRpcikgewotCQlzdXBlci5zZXRCYXNlZGlyKGRpcik7Ci0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRCYXNlZGlyKFN0cmluZyBkaXIpIHsKLQkJc3VwZXIuc2V0QmFzZWRpcihkaXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNjYW4oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2NhbigpOwotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ1tdIGdldEluY2x1ZGVkRmlsZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0JfQotIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9TZXJ2ZXJUeXBlUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9TZXJ2ZXJUeXBlUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmQ0YTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vU2VydmVyVHlwZVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZXJ2ZXJUeXBlUGFja2FnZS5qYXZhLHYgMS44IDIwMDcvMDUvMTAgMDQ6NTA6NDcgbmRhaSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZlclR5cGVQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImRlZmluaXRpb24iOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gImRlZmluaXRpb24iOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXJ2ZXJUeXBlUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyY2hpdmVUeXBlSW1wbCA8ZW0+QXJjaGl2ZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyY2hpdmVUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRBcmNoaXZlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBUkNISVZFX1RZUEUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUkNISVZFX1RZUEVfX1BBVEggPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFyY2hpdmUgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUkNISVZFX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Bcmd1bWVudFBhaXJJbXBsIDxlbT5Bcmd1bWVudCBQYWlyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyZ3VtZW50UGFpckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0QXJndW1lbnRQYWlyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFSR1VNRU5UX1BBSVIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUkdVTUVOVF9QQUlSX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSR1VNRU5UX1BBSVJfX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Bcmd1bWVudCBQYWlyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSR1VNRU5UX1BBSVJfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5DbGFzc3BhdGhJbXBsIDxlbT5DbGFzc3BhdGg8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuQ2xhc3NwYXRoSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRDbGFzc3BhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ0xBU1NQQVRIID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xBU1NQQVRIX19HUk9VUCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXJjaGl2ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xBU1NQQVRIX19BUkNISVZFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWxlc2V0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTEFTU1BBVEhfX0ZJTEVTRVQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xBU1NQQVRIX19JRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2xhc3NwYXRoPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENMQVNTUEFUSF9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4Y2x1ZGVUeXBlSW1wbCA8ZW0+RXhjbHVkZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4Y2x1ZGVUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRFeGNsdWRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWENMVURFX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWENMVURFX1RZUEVfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWENMVURFX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5FeHRlcm5hbEltcGwgPGVtPkV4dGVybmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4dGVybmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRFeHRlcm5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFUk5BTCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFUk5BTF9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURVJOQUxfX09TID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FeHRlcm5hbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFUk5BTF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkZpbGVzZXRUeXBlSW1wbCA8ZW0+RmlsZXNldCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkZpbGVzZXRUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRGaWxlc2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGSUxFU0VUX1RZUEUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxFU0VUX1RZUEVfX0dST1VQID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxFU0VUX1RZUEVfX0lOQ0xVREUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTEVTRVRfVFlQRV9fRVhDTFVERSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzZXNlbnNpdGl2ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJTEVTRVRfVFlQRV9fQ0FTRVNFTlNJVElWRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklMRVNFVF9UWVBFX19ESVIgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZpbGVzZXQgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUxFU0VUX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5JbmNsdWRlVHlwZUltcGwgPGVtPkluY2x1ZGUgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5JbmNsdWRlVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0SW5jbHVkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5DTFVERV9UWVBFID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5DTFVERV9UWVBFX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbmNsdWRlIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5DTFVERV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuSm5kaUNvbm5lY3Rpb25JbXBsIDxlbT5KbmRpIENvbm5lY3Rpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuSm5kaUNvbm5lY3Rpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldEpuZGlDb25uZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEpORElfQ09OTkVDVElPTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvdmlkZXIgVXJsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9DT05ORUNUSU9OX19QUk9WSURFUl9VUkwgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0NPTk5FQ1RJT05fX0dST1VQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KbmRpIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFkgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSk5ESV9DT05ORUNUSU9OX19JTklUSUFMX0NPTlRFWFRfRkFDVE9SWSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfQ09OTkVDVElPTl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsIDxlbT5MYXVuY2ggQ29uZmlndXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnZpcm9ubWVudCBWYXJpYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VOVklST05NRU5UX1ZBUklBQkxFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDEgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyYW0gQXJndW1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fUFJPR1JBTV9BUkdVTUVOVFMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmtpbmcgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX1dPUktJTkdfRElSRUNUT1JZID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1MgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Vm0gUGFyYW1ldGVyczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX1ZNX1BBUkFNRVRFUlMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVidWcgUG9ydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OX19ERUJVR19QT1JUID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDMgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VYVEVSTkFMID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGF1bmNoIENvbmZpZ3VyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fRkVBVFVSRV9DT1VOVCA9IDEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTW9kdWxlSW1wbCA8ZW0+TW9kdWxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLk1vZHVsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0TW9kdWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1PRFVMRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9fVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGlzaCBEaXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfX1BVQkxJU0hfRElSID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdWJsaXNoZXIgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX19QVUJMSVNIRVJfUkVGRVJFTkNFID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Nb2R1bGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUG9ydEltcGwgPGVtPlBvcnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUG9ydEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0UG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQT1JUID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX19OTyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPUlRfX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3RvY29sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9fUFJPVE9DT0wgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvcnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb2plY3RJbXBsIDxlbT5Qcm9qZWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb2plY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPSkVDVCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DTEFTU1BBVEhfUkVGRVJFTkNFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9qZWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Qcm9wZXJ0eUltcGwgPGVtPlByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb3BlcnR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9QRVJUWSA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fQ09OVEVYVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19ERUZBVUxUID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fTEFCRUwgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fVFlQRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvcGVydHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5QdWJsaXNoZXJJbXBsIDxlbT5QdWJsaXNoZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRQdWJsaXNoZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBVQkxJU0hFUl9fR1JPVVAgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1Ymxpc2hlcmRhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBVQkxJU0hFUl9fUFVCTElTSEVSREFUQSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVUJMSVNIRVJfX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QdWJsaXNoZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVyRGF0YUltcGwgPGVtPlB1Ymxpc2hlciBEYXRhPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlB1Ymxpc2hlckRhdGFJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFB1Ymxpc2hlckRhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX0RBVEEgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhbmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBVQkxJU0hFUl9EQVRBX19EQVRBTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YXZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX0RBVEFfX0RBVEFWQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHVibGlzaGVyIERhdGE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX0RBVEFfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCA8ZW0+U2VydmVyIFJ1bnRpbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRSA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fR1JPVVAgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fUFJPUEVSVFkgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX0dST1VQMSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX1BPUlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX0dST1VQMiA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fTU9EVUxFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1QgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX1NUQVJUID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdG9wPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX1NUT1AgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX0dST1VQMyA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGlzaGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fUFVCTElTSEVSID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fR1JPVVA0ID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3NwYXRoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fQ0xBU1NQQVRIID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm5kaSBDb25uZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTiA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fTkFNRSA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRVJWRVJfUlVOVElNRV9fVkVSU0lPTiA9IDE1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcnZlciBSdW50aW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZFUl9SVU5USU1FX0ZFQVRVUkVfQ09VTlQgPSAxNjsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZSA8ZW0+QXJjaGl2ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFyY2hpdmUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFyY2hpdmVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGUjZ2V0UGF0aCA8ZW0+UGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhdGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlI2dldFBhdGgoKQotCSAqIEBzZWUgI2dldEFyY2hpdmVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcmNoaXZlVHlwZV9QYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpciA8ZW0+QXJndW1lbnQgUGFpcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Bcmd1bWVudCBQYWlyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFyZ3VtZW50UGFpcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpciNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldEFyZ3VtZW50UGFpcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJndW1lbnRQYWlyX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpciNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0QXJndW1lbnRQYWlyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcmd1bWVudFBhaXJfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoIDxlbT5DbGFzc3BhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2xhc3NwYXRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGgKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENsYXNzcGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aCNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0Q2xhc3NwYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDbGFzc3BhdGhfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aCNnZXRBcmNoaXZlIDxlbT5BcmNoaXZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BcmNoaXZlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGgjZ2V0QXJjaGl2ZSgpCi0JICogQHNlZSAjZ2V0Q2xhc3NwYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDbGFzc3BhdGhfQXJjaGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldEZpbGVzZXQgPGVtPkZpbGVzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkZpbGVzZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aCNnZXRGaWxlc2V0KCkKLQkgKiBAc2VlICNnZXRDbGFzc3BhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENsYXNzcGF0aF9GaWxlc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGgjZ2V0SWQoKQotCSAqIEBzZWUgI2dldENsYXNzcGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q2xhc3NwYXRoX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlIDxlbT5FeGNsdWRlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXhjbHVkZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeGNsdWRlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXhjbHVkZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeGNsdWRlVHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXhjbHVkZVR5cGUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0RXhjbHVkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4Y2x1ZGVUeXBlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWwgPGVtPkV4dGVybmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVybmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXh0ZXJuYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWwjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldEV4dGVybmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlcm5hbF9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsI2dldE9zIDxlbT5PczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbCNnZXRPcygpCi0JICogQHNlZSAjZ2V0RXh0ZXJuYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVybmFsX09zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlIDxlbT5GaWxlc2V0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmlsZXNldCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RmlsZXNldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRGaWxlc2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsZXNldFR5cGVfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2dldEluY2x1ZGUgPGVtPkluY2x1ZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluY2x1ZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2dldEluY2x1ZGUoKQotCSAqIEBzZWUgI2dldEZpbGVzZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWxlc2V0VHlwZV9JbmNsdWRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZSNnZXRFeGNsdWRlIDxlbT5FeGNsdWRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeGNsdWRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZSNnZXRFeGNsdWRlKCkKLQkgKiBAc2VlICNnZXRGaWxlc2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmlsZXNldFR5cGVfRXhjbHVkZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2lzQ2FzZXNlbnNpdGl2ZSA8ZW0+Q2FzZXNlbnNpdGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2VzZW5zaXRpdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2lzQ2FzZXNlbnNpdGl2ZSgpCi0JICogQHNlZSAjZ2V0RmlsZXNldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpbGVzZXRUeXBlX0Nhc2VzZW5zaXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZSNnZXREaXIgPGVtPkRpcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUjZ2V0RGlyKCkKLQkgKiBAc2VlICNnZXRGaWxlc2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RmlsZXNldFR5cGVfRGlyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkluY2x1ZGVUeXBlIDxlbT5JbmNsdWRlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW5jbHVkZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW5jbHVkZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSW5jbHVkZVR5cGUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0SW5jbHVkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEluY2x1ZGVUeXBlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24gPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KbmRpIENvbm5lY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRKbmRpQ29ubmVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldFByb3ZpZGVyVXJsIDxlbT5Qcm92aWRlciBVcmw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm92aWRlciBVcmw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldFByb3ZpZGVyVXJsKCkKLQkgKiBAc2VlICNnZXRKbmRpQ29ubmVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Sm5kaUNvbm5lY3Rpb25fUHJvdmlkZXJVcmwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRKbmRpQ29ubmVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Sm5kaUNvbm5lY3Rpb25fR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldEpuZGlQcm9wZXJ0eSA8ZW0+Sm5kaSBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Sm5kaSBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0Sm5kaVByb3BlcnR5KCkKLQkgKiBAc2VlICNnZXRKbmRpQ29ubmVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Sm5kaUNvbm5lY3Rpb25fSm5kaVByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0SW5pdGlhbENvbnRleHRGYWN0b3J5IDxlbT5Jbml0aWFsIENvbnRleHQgRmFjdG9yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbiNnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoKQotCSAqIEBzZWUgI2dldEpuZGlDb25uZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKbmRpQ29ubmVjdGlvbl9Jbml0aWFsQ29udGV4dEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiA8ZW0+TGF1bmNoIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TGF1bmNoIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRFbnZpcm9ubWVudFZhcmlhYmxlIDxlbT5FbnZpcm9ubWVudCBWYXJpYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW52aXJvbm1lbnQgVmFyaWFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FbnZpcm9ubWVudFZhcmlhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAxKCkKLQkgKiBAc2VlICNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRQcm9ncmFtQXJndW1lbnRzIDxlbT5Qcm9ncmFtIEFyZ3VtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UHJvZ3JhbSBBcmd1bWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0UHJvZ3JhbUFyZ3VtZW50cygpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Qcm9ncmFtQXJndW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRXb3JraW5nRGlyZWN0b3J5IDxlbT5Xb3JraW5nIERpcmVjdG9yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldFdvcmtpbmdEaXJlY3RvcnkoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fV29ya2luZ0RpcmVjdG9yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0TWFpbkNsYXNzIDxlbT5NYWluIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFpbiBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRNYWluQ2xhc3MoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fTWFpbkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRWbVBhcmFtZXRlcnMgPGVtPlZtIFBhcmFtZXRlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlZtIFBhcmFtZXRlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0Vm1QYXJhbWV0ZXJzKCkKLQkgKiBAc2VlICNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX1ZtUGFyYW1ldGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fQ2xhc3NwYXRoUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXREZWJ1Z1BvcnQgPGVtPkRlYnVnIFBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWJ1ZyBQb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldERlYnVnUG9ydCgpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9EZWJ1Z1BvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRHcm91cDMoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEV4dGVybmFsIDxlbT5FeHRlcm5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZXJuYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0RXh0ZXJuYWwoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fRXh0ZXJuYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlIDxlbT5Nb2R1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1vZHVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldE1vZHVsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TW9kdWxlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0UHVibGlzaERpciA8ZW0+UHVibGlzaCBEaXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdWJsaXNoIERpcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFB1Ymxpc2hEaXIoKQotCSAqIEBzZWUgI2dldE1vZHVsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TW9kdWxlX1B1Ymxpc2hEaXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0UHVibGlzaGVyUmVmZXJlbmNlIDxlbT5QdWJsaXNoZXIgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVibGlzaGVyIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFB1Ymxpc2hlclJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNb2R1bGVfUHVibGlzaGVyUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQgPGVtPlBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0Tm8gPGVtPk5vPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0Tm8oKQotCSAqIEBzZWUgI2dldFBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvcnRfTm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvcnRfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0UHJvdG9jb2wgPGVtPlByb3RvY29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvdG9jb2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0UHJvdG9jb2woKQotCSAqIEBzZWUgI2dldFBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBvcnRfUHJvdG9jb2woKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvamVjdCNnZXRDbGFzc3BhdGhSZWZlcmVuY2UgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0I2dldENsYXNzcGF0aFJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DbGFzc3BhdGhSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRDb250ZXh0IDxlbT5Db250ZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29udGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0Q29udGV4dCgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X0NvbnRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXREZWZhdWx0IDxlbT5EZWZhdWx0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0RGVmYXVsdCgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X0RlZmF1bHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhYmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRMYWJlbCgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X0xhYmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlciA8ZW0+UHVibGlzaGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlB1Ymxpc2hlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQdWJsaXNoZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlciNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFB1Ymxpc2hlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHVibGlzaGVyX0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIjZ2V0UHVibGlzaGVyZGF0YSA8ZW0+UHVibGlzaGVyZGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHVibGlzaGVyZGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyI2dldFB1Ymxpc2hlcmRhdGEoKQotCSAqIEBzZWUgI2dldFB1Ymxpc2hlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHVibGlzaGVyX1B1Ymxpc2hlcmRhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UHVibGlzaGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQdWJsaXNoZXJfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSA8ZW0+UHVibGlzaGVyIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHVibGlzaGVyIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFB1Ymxpc2hlckRhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhI2dldERhdGFuYW1lIDxlbT5EYXRhbmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGFuYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhI2dldERhdGFuYW1lKCkKLQkgKiBAc2VlICNnZXRQdWJsaXNoZXJEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQdWJsaXNoZXJEYXRhX0RhdGFuYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSNnZXREYXRhdmFsdWUgPGVtPkRhdGF2YWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGF2YWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSNnZXREYXRhdmFsdWUoKQotCSAqIEBzZWUgI2dldFB1Ymxpc2hlckRhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFB1Ymxpc2hlckRhdGFfRGF0YXZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUgPGVtPlNlcnZlciBSdW50aW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcnZlciBSdW50aW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZXJ2ZXJSdW50aW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFNlcnZlclJ1bnRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQcm9wZXJ0eSgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9Qcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9Hcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UG9ydCA8ZW0+UG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQb3J0KCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1BvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFNlcnZlclJ1bnRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldE1vZHVsZSA8ZW0+TW9kdWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0TW9kdWxlKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX01vZHVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UHJvamVjdCgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9Qcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRTdGFydCgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlN0b3A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0U3RvcCgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9TdG9wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAzKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQdWJsaXNoZXIgPGVtPlB1Ymxpc2hlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHVibGlzaGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFB1Ymxpc2hlcigpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9QdWJsaXNoZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXA0IDxlbT5Hcm91cDQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwNDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDQoKQotCSAqIEBzZWUgI2dldFNlcnZlclJ1bnRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXA0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldENsYXNzcGF0aCA8ZW0+Q2xhc3NwYXRoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5DbGFzc3BhdGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0Q2xhc3NwYXRoKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0Sm5kaUNvbm5lY3Rpb24gPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRKbmRpQ29ubmVjdGlvbigpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9KbmRpQ29ubmVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlcnZlclR5cGVGYWN0b3J5IGdldFNlcnZlclR5cGVGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5BcmNoaXZlVHlwZUltcGwgPGVtPkFyY2hpdmUgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5BcmNoaXZlVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldEFyY2hpdmVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFSQ0hJVkVfVFlQRSA9IGVJTlNUQU5DRS5nZXRBcmNoaXZlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGF0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSQ0hJVkVfVFlQRV9fUEFUSCA9IGVJTlNUQU5DRS5nZXRBcmNoaXZlVHlwZV9QYXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuQXJndW1lbnRQYWlySW1wbCA8ZW0+QXJndW1lbnQgUGFpcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Bcmd1bWVudFBhaXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRBcmd1bWVudFBhaXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVJHVU1FTlRfUEFJUiA9IGVJTlNUQU5DRS5nZXRBcmd1bWVudFBhaXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUkdVTUVOVF9QQUlSX19OQU1FID0gZUlOU1RBTkNFLmdldEFyZ3VtZW50UGFpcl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSR1VNRU5UX1BBSVJfX1ZBTFVFID0gZUlOU1RBTkNFLmdldEFyZ3VtZW50UGFpcl9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkNsYXNzcGF0aEltcGwgPGVtPkNsYXNzcGF0aDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5DbGFzc3BhdGhJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRDbGFzc3BhdGgoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0xBU1NQQVRIID0gZUlOU1RBTkNFLmdldENsYXNzcGF0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENMQVNTUEFUSF9fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0Q2xhc3NwYXRoX0dyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcmNoaXZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDTEFTU1BBVEhfX0FSQ0hJVkUgPSBlSU5TVEFOQ0UuZ2V0Q2xhc3NwYXRoX0FyY2hpdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbGVzZXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENMQVNTUEFUSF9fRklMRVNFVCA9IGVJTlNUQU5DRS5nZXRDbGFzc3BhdGhfRmlsZXNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDTEFTU1BBVEhfX0lEID0gZUlOU1RBTkNFLmdldENsYXNzcGF0aF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4Y2x1ZGVUeXBlSW1wbCA8ZW0+RXhjbHVkZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4Y2x1ZGVUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0RXhjbHVkZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhDTFVERV9UWVBFID0gZUlOU1RBTkNFLmdldEV4Y2x1ZGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVhDTFVERV9UWVBFX19OQU1FID0gZUlOU1RBTkNFLmdldEV4Y2x1ZGVUeXBlX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5FeHRlcm5hbEltcGwgPGVtPkV4dGVybmFsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4dGVybmFsSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0RXh0ZXJuYWwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhURVJOQUwgPSBlSU5TVEFOQ0UuZ2V0RXh0ZXJuYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVhURVJOQUxfX1ZBTFVFID0gZUlOU1RBTkNFLmdldEV4dGVybmFsX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVYVEVSTkFMX19PUyA9IGVJTlNUQU5DRS5nZXRFeHRlcm5hbF9PcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkZpbGVzZXRUeXBlSW1wbCA8ZW0+RmlsZXNldCBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkZpbGVzZXRUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0RmlsZXNldFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRklMRVNFVF9UWVBFID0gZUlOU1RBTkNFLmdldEZpbGVzZXRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMRVNFVF9UWVBFX19HUk9VUCA9IGVJTlNUQU5DRS5nZXRGaWxlc2V0VHlwZV9Hcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRklMRVNFVF9UWVBFX19JTkNMVURFID0gZUlOU1RBTkNFLmdldEZpbGVzZXRUeXBlX0luY2x1ZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJTEVTRVRfVFlQRV9fRVhDTFVERSA9IGVJTlNUQU5DRS5nZXRGaWxlc2V0VHlwZV9FeGNsdWRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNlc2Vuc2l0aXZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRklMRVNFVF9UWVBFX19DQVNFU0VOU0lUSVZFID0gZUlOU1RBTkNFLmdldEZpbGVzZXRUeXBlX0Nhc2VzZW5zaXRpdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJTEVTRVRfVFlQRV9fRElSID0gZUlOU1RBTkNFLmdldEZpbGVzZXRUeXBlX0RpcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkluY2x1ZGVUeXBlSW1wbCA8ZW0+SW5jbHVkZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkluY2x1ZGVUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0SW5jbHVkZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSU5DTFVERV9UWVBFID0gZUlOU1RBTkNFLmdldEluY2x1ZGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU5DTFVERV9UWVBFX19OQU1FID0gZUlOU1RBTkNFLmdldEluY2x1ZGVUeXBlX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5KbmRpQ29ubmVjdGlvbkltcGwgPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5KbmRpQ29ubmVjdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldEpuZGlDb25uZWN0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEpORElfQ09OTkVDVElPTiA9IGVJTlNUQU5DRS5nZXRKbmRpQ29ubmVjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvdmlkZXIgVXJsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSk5ESV9DT05ORUNUSU9OX19QUk9WSURFUl9VUkwgPSBlSU5TVEFOQ0UuZ2V0Sm5kaUNvbm5lY3Rpb25fUHJvdmlkZXJVcmwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBKTkRJX0NPTk5FQ1RJT05fX0dST1VQID0gZUlOU1RBTkNFLmdldEpuZGlDb25uZWN0aW9uX0dyb3VwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KbmRpIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0Sm5kaUNvbm5lY3Rpb25fSm5kaVByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIENvbnRleHQgRmFjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlkgPSBlSU5TVEFOQ0UuZ2V0Sm5kaUNvbm5lY3Rpb25fSW5pdGlhbENvbnRleHRGYWN0b3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwgPGVtPkxhdW5jaCBDb25maWd1cmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExBVU5DSF9DT05GSUdVUkFUSU9OID0gZUlOU1RBTkNFLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52aXJvbm1lbnQgVmFyaWFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExBVU5DSF9DT05GSUdVUkFUSU9OX19FTlZJUk9OTUVOVF9WQVJJQUJMRSA9IGVJTlNUQU5DRS5nZXRMYXVuY2hDb25maWd1cmF0aW9uX0Vudmlyb25tZW50VmFyaWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMSA9IGVJTlNUQU5DRS5nZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvZ3JhbSBBcmd1bWVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExBVU5DSF9DT05GSUdVUkFUSU9OX19QUk9HUkFNX0FSR1VNRU5UUyA9IGVJTlNUQU5DRS5nZXRMYXVuY2hDb25maWd1cmF0aW9uX1Byb2dyYW1Bcmd1bWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmtpbmcgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTEFVTkNIX0NPTkZJR1VSQVRJT05fX1dPUktJTkdfRElSRUNUT1JZID0gZUlOU1RBTkNFLmdldExhdW5jaENvbmZpZ3VyYXRpb25fV29ya2luZ0RpcmVjdG9yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExBVU5DSF9DT05GSUdVUkFUSU9OX19NQUlOX0NMQVNTID0gZUlOU1RBTkNFLmdldExhdW5jaENvbmZpZ3VyYXRpb25fTWFpbkNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZtIFBhcmFtZXRlcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExBVU5DSF9DT05GSUdVUkFUSU9OX19WTV9QQVJBTUVURVJTID0gZUlOU1RBTkNFLmdldExhdW5jaENvbmZpZ3VyYXRpb25fVm1QYXJhbWV0ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzc3BhdGggUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0NMQVNTUEFUSF9SRUZFUkVOQ0UgPSBlSU5TVEFOQ0UuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9DbGFzc3BhdGhSZWZlcmVuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlYnVnIFBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMQVVOQ0hfQ09ORklHVVJBVElPTl9fREVCVUdfUE9SVCA9IGVJTlNUQU5DRS5nZXRMYXVuY2hDb25maWd1cmF0aW9uX0RlYnVnUG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBMQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAzID0gZUlOU1RBTkNFLmdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VYVEVSTkFMID0gZUlOU1RBTkNFLmdldExhdW5jaENvbmZpZ3VyYXRpb25fRXh0ZXJuYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Nb2R1bGVJbXBsIDxlbT5Nb2R1bGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTW9kdWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0TW9kdWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1PRFVMRSA9IGVJTlNUQU5DRS5nZXRNb2R1bGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNT0RVTEVfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TW9kdWxlX1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1Ymxpc2ggRGlyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTU9EVUxFX19QVUJMSVNIX0RJUiA9IGVJTlNUQU5DRS5nZXRNb2R1bGVfUHVibGlzaERpcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVibGlzaGVyIFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1PRFVMRV9fUFVCTElTSEVSX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRNb2R1bGVfUHVibGlzaGVyUmVmZXJlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUG9ydEltcGwgPGVtPlBvcnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUG9ydEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFBvcnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUE9SVCA9IGVJTlNUQU5DRS5nZXRQb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5ObzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPUlRfX05PID0gZUlOU1RBTkNFLmdldFBvcnRfTm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX19OQU1FID0gZUlOU1RBTkNFLmdldFBvcnRfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvdG9jb2w8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT1JUX19QUk9UT0NPTCA9IGVJTlNUQU5DRS5nZXRQb3J0X1Byb3RvY29sKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvamVjdEltcGwgPGVtPlByb2plY3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvamVjdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFByb2plY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPSkVDVCA9IGVJTlNUQU5DRS5nZXRQcm9qZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzc3BhdGggUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPSkVDVF9fQ0xBU1NQQVRIX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRQcm9qZWN0X0NsYXNzcGF0aFJlZmVyZW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb3BlcnR5SW1wbCA8ZW0+UHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvcGVydHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRQcm9wZXJ0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST1BFUlRZX19DT05URVhUID0gZUlOU1RBTkNFLmdldFByb3BlcnR5X0NvbnRleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fREVGQVVMVCA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eV9EZWZhdWx0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST1BFUlRZX19JRCA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eV9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfTGFiZWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fVFlQRSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eV9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVySW1wbCA8ZW0+UHVibGlzaGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlB1Ymxpc2hlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFB1Ymxpc2hlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQVUJMSVNIRVIgPSBlSU5TVEFOQ0UuZ2V0UHVibGlzaGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFVCTElTSEVSX19HUk9VUCA9IGVJTlNUQU5DRS5nZXRQdWJsaXNoZXJfR3JvdXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1Ymxpc2hlcmRhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBVQkxJU0hFUl9fUFVCTElTSEVSREFUQSA9IGVJTlNUQU5DRS5nZXRQdWJsaXNoZXJfUHVibGlzaGVyZGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQVUJMSVNIRVJfX0lEID0gZUlOU1RBTkNFLmdldFB1Ymxpc2hlcl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlB1Ymxpc2hlckRhdGFJbXBsIDxlbT5QdWJsaXNoZXIgRGF0YTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5QdWJsaXNoZXJEYXRhSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0UHVibGlzaGVyRGF0YSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQVUJMSVNIRVJfREFUQSA9IGVJTlNUQU5DRS5nZXRQdWJsaXNoZXJEYXRhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhbmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBVQkxJU0hFUl9EQVRBX19EQVRBTkFNRSA9IGVJTlNUQU5DRS5nZXRQdWJsaXNoZXJEYXRhX0RhdGFuYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhdmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQVUJMSVNIRVJfREFUQV9fREFUQVZBTFVFID0gZUlOU1RBTkNFLmdldFB1Ymxpc2hlckRhdGFfRGF0YXZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwgPGVtPlNlcnZlciBSdW50aW1lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFUlZFUl9SVU5USU1FID0gZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWRVJfUlVOVElNRV9fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZV9Hcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZFUl9SVU5USU1FX19QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX1Byb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZFUl9SVU5USU1FX19HUk9VUDEgPSBlSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZV9Hcm91cDEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZFUl9SVU5USU1FX19QT1JUID0gZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWVfUG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRVJWRVJfUlVOVElNRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWVfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFUlZFUl9SVU5USU1FX19NT0RVTEUgPSBlSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZV9Nb2R1bGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWRVJfUlVOVElNRV9fUFJPSkVDVCA9IGVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX1Byb2plY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkVSX1JVTlRJTUVfX1NUQVJUID0gZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWVfU3RhcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWRVJfUlVOVElNRV9fU1RPUCA9IGVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX1N0b3AoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkVSX1JVTlRJTUVfX0dST1VQMyA9IGVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVibGlzaGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRVJWRVJfUlVOVElNRV9fUFVCTElTSEVSID0gZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWVfUHVibGlzaGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFUlZFUl9SVU5USU1FX19HUk9VUDQgPSBlSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZV9Hcm91cDQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzcGF0aDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkVSX1JVTlRJTUVfX0NMQVNTUEFUSCA9IGVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Sm5kaSBDb25uZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTiA9IGVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX0puZGlDb25uZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkVSX1JVTlRJTUVfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VSVkVSX1JVTlRJTUVfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZV9WZXJzaW9uKCk7Ci0KLQl9Ci0KLX0gLy9TZXJ2ZXJUeXBlUGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0FyY2hpdmVUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0FyY2hpdmVUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWY2ZDVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9BcmNoaXZlVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFyY2hpdmUgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyY2hpdmVUeXBlSW1wbCNnZXRQYXRoIDxlbT5QYXRoPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZVR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBcmNoaXZlVHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhdGgoKSA8ZW0+UGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXRoKCkgPGVtPlBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGF0aCA9IFBBVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXJjaGl2ZVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQVJDSElWRV9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgbmV3UGF0aCkgewotCQlTdHJpbmcgb2xkUGF0aCA9IHBhdGg7Ci0JCXBhdGggPSBuZXdQYXRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5BUkNISVZFX1RZUEVfX1BBVEgsIG9sZFBhdGgsIHBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSQ0hJVkVfVFlQRV9fUEFUSDoKLQkJCQlyZXR1cm4gZ2V0UGF0aCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSQ0hJVkVfVFlQRV9fUEFUSDoKLQkJCQlzZXRQYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSQ0hJVkVfVFlQRV9fUEFUSDoKLQkJCQlzZXRQYXRoKFBBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkNISVZFX1RZUEVfX1BBVEg6Ci0JCQkJcmV0dXJuIFBBVEhfRURFRkFVTFQgPT0gbnVsbCA/IHBhdGggIT0gbnVsbCA6ICFQQVRIX0VERUZBVUxULmVxdWFscyhwYXRoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhdGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BcmNoaXZlVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Bcmd1bWVudFBhaXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvQXJndW1lbnRQYWlySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmFmZGJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Bcmd1bWVudFBhaXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJndW1lbnQgUGFpcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyZ3VtZW50UGFpckltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyZ3VtZW50UGFpckltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJndW1lbnRQYWlySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXJndW1lbnRQYWlyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFyZ3VtZW50UGFpckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5BUkdVTUVOVF9QQUlSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuQVJHVU1FTlRfUEFJUl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQVJHVU1FTlRfUEFJUl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSR1VNRU5UX1BBSVJfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQVJHVU1FTlRfUEFJUl9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Bcmd1bWVudFBhaXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvQ2xhc3NwYXRoSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0NsYXNzcGF0aEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmNmJkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvQ2xhc3NwYXRoSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGg7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzc3BhdGg8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5DbGFzc3BhdGhJbXBsI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkNsYXNzcGF0aEltcGwjZ2V0QXJjaGl2ZSA8ZW0+QXJjaGl2ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkNsYXNzcGF0aEltcGwjZ2V0RmlsZXNldCA8ZW0+RmlsZXNldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkNsYXNzcGF0aEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ2xhc3NwYXRoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzc3BhdGhJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQ0xBU1NQQVRIOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwKCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkgewotCQkJZ3JvdXAgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fR1JPVVApOwotCQl9Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5DTEFTU1BBVEhfX0FSQ0hJVkUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRGaWxlc2V0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLkNMQVNTUEFUSF9fRklMRVNFVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0dST1VQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0FSQ0hJVkU6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBcmNoaXZlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19GSUxFU0VUOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsZXNldCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19HUk9VUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0FSQ0hJVkU6Ci0JCQkJcmV0dXJuIGdldEFyY2hpdmUoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19GSUxFU0VUOgotCQkJCXJldHVybiBnZXRGaWxlc2V0KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19HUk9VUDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fQVJDSElWRToKLQkJCQlnZXRBcmNoaXZlKCkuY2xlYXIoKTsKLQkJCQlnZXRBcmNoaXZlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fRklMRVNFVDoKLQkJCQlnZXRGaWxlc2V0KCkuY2xlYXIoKTsKLQkJCQlnZXRGaWxlc2V0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0FSQ0hJVkU6Ci0JCQkJZ2V0QXJjaGl2ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0ZJTEVTRVQ6Ci0JCQkJZ2V0RmlsZXNldCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19HUk9VUDoKLQkJCQlyZXR1cm4gZ3JvdXAgIT0gbnVsbCAmJiAhZ3JvdXAuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0FSQ0hJVkU6Ci0JCQkJcmV0dXJuICFnZXRBcmNoaXZlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0ZJTEVTRVQ6Ci0JCQkJcmV0dXJuICFnZXRGaWxlc2V0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9DbGFzc3BhdGhJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvRXhjbHVkZVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvRXhjbHVkZVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYTBiMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0V4Y2x1ZGVUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhjbHVkZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuRXhjbHVkZVR5cGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNsdWRlVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4Y2x1ZGVUeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeGNsdWRlVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5FWENMVURFX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLkVYQ0xVREVfVFlQRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhDTFVERV9UWVBFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhDTFVERV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhDTFVERV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkVYQ0xVREVfVFlQRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4Y2x1ZGVUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0V4dGVybmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0V4dGVybmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTNlODBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9FeHRlcm5hbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVybmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuRXh0ZXJuYWxJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4dGVybmFsSW1wbCNnZXRPcyA8ZW0+T3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4dGVybmFsIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcygpIDxlbT5PczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9zKCkgPGVtPk9zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvcyA9IE9TX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVybmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLkVYVEVSTkFMOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLkVYVEVSTkFMX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcygpIHsKLQkJcmV0dXJuIG9zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9zKFN0cmluZyBuZXdPcykgewotCQlTdHJpbmcgb2xkT3MgPSBvczsKLQkJb3MgPSBuZXdPczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUxfX09TLCBvbGRPcywgb3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkVYVEVSTkFMX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUxfX09TOgotCQkJCXJldHVybiBnZXRPcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkVYVEVSTkFMX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkVYVEVSTkFMX19PUzoKLQkJCQlzZXRPcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWFRFUk5BTF9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUxfX09TOgotCQkJCXNldE9zKE9TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUxfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWFRFUk5BTF9fT1M6Ci0JCQkJcmV0dXJuIE9TX0VERUZBVUxUID09IG51bGwgPyBvcyAhPSBudWxsIDogIU9TX0VERUZBVUxULmVxdWFscyhvcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9zOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4dGVybmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0ZpbGVzZXRUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0ZpbGVzZXRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDA3Yzg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9GaWxlc2V0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWxlc2V0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5GaWxlc2V0VHlwZUltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuRmlsZXNldFR5cGVJbXBsI2dldEluY2x1ZGUgPGVtPkluY2x1ZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5GaWxlc2V0VHlwZUltcGwjZ2V0RXhjbHVkZSA8ZW0+RXhjbHVkZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkZpbGVzZXRUeXBlSW1wbCNpc0Nhc2VzZW5zaXRpdmUgPGVtPkNhc2VzZW5zaXRpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5GaWxlc2V0VHlwZUltcGwjZ2V0RGlyIDxlbT5EaXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlc2V0VHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEZpbGVzZXRUeXBlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYXNlc2Vuc2l0aXZlKCkgPGVtPkNhc2VzZW5zaXRpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzZXNlbnNpdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBU0VTRU5TSVRJVkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzZXNlbnNpdGl2ZSgpIDxlbT5DYXNlc2Vuc2l0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2VzZW5zaXRpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBDQVNFU0VOU0lUSVZFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDYXNlc2Vuc2l0aXZlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNlc2Vuc2l0aXZlRVNldDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXIoKSA8ZW0+RGlyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXIoKSA8ZW0+RGlyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGlyID0gRElSX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEZpbGVzZXRUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLkZJTEVTRVRfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEluY2x1ZGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuRklMRVNFVF9UWVBFX19JTkNMVURFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXhjbHVkZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5GSUxFU0VUX1RZUEVfX0VYQ0xVREUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FzZXNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzZXNlbnNpdGl2ZShib29sZWFuIG5ld0Nhc2VzZW5zaXRpdmUpIHsKLQkJYm9vbGVhbiBvbGRDYXNlc2Vuc2l0aXZlID0gY2FzZXNlbnNpdGl2ZTsKLQkJY2FzZXNlbnNpdGl2ZSA9IG5ld0Nhc2VzZW5zaXRpdmU7Ci0JCWJvb2xlYW4gb2xkQ2FzZXNlbnNpdGl2ZUVTZXQgPSBjYXNlc2Vuc2l0aXZlRVNldDsKLQkJY2FzZXNlbnNpdGl2ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0NBU0VTRU5TSVRJVkUsIG9sZENhc2VzZW5zaXRpdmUsIGNhc2VzZW5zaXRpdmUsICFvbGRDYXNlc2Vuc2l0aXZlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q2FzZXNlbnNpdGl2ZSgpIHsKLQkJYm9vbGVhbiBvbGRDYXNlc2Vuc2l0aXZlID0gY2FzZXNlbnNpdGl2ZTsKLQkJYm9vbGVhbiBvbGRDYXNlc2Vuc2l0aXZlRVNldCA9IGNhc2VzZW5zaXRpdmVFU2V0OwotCQljYXNlc2Vuc2l0aXZlID0gQ0FTRVNFTlNJVElWRV9FREVGQVVMVDsKLQkJY2FzZXNlbnNpdGl2ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0NBU0VTRU5TSVRJVkUsIG9sZENhc2VzZW5zaXRpdmUsIENBU0VTRU5TSVRJVkVfRURFRkFVTFQsIG9sZENhc2VzZW5zaXRpdmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDYXNlc2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXIoKSB7Ci0JCXJldHVybiBkaXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlyKFN0cmluZyBuZXdEaXIpIHsKLQkJU3RyaW5nIG9sZERpciA9IGRpcjsKLQkJZGlyID0gbmV3RGlyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0RJUiwgb2xkRGlyLCBkaXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkZJTEVTRVRfVFlQRV9fR1JPVVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkZJTEVTRVRfVFlQRV9fSU5DTFVERToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluY2x1ZGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0VYQ0xVREU6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeGNsdWRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0dST1VQOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkZJTEVTRVRfVFlQRV9fSU5DTFVERToKLQkJCQlyZXR1cm4gZ2V0SW5jbHVkZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0VYQ0xVREU6Ci0JCQkJcmV0dXJuIGdldEV4Y2x1ZGUoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFX19DQVNFU0VOU0lUSVZFOgotCQkJCXJldHVybiBpc0Nhc2VzZW5zaXRpdmUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkZJTEVTRVRfVFlQRV9fRElSOgotCQkJCXJldHVybiBnZXREaXIoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0dST1VQOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFX19JTkNMVURFOgotCQkJCWdldEluY2x1ZGUoKS5jbGVhcigpOwotCQkJCWdldEluY2x1ZGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFX19FWENMVURFOgotCQkJCWdldEV4Y2x1ZGUoKS5jbGVhcigpOwotCQkJCWdldEV4Y2x1ZGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFX19DQVNFU0VOU0lUSVZFOgotCQkJCXNldENhc2VzZW5zaXRpdmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0RJUjoKLQkJCQlzZXREaXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0lOQ0xVREU6Ci0JCQkJZ2V0SW5jbHVkZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0VYQ0xVREU6Ci0JCQkJZ2V0RXhjbHVkZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0NBU0VTRU5TSVRJVkU6Ci0JCQkJdW5zZXRDYXNlc2Vuc2l0aXZlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0RJUjoKLQkJCQlzZXREaXIoRElSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFX19HUk9VUDoKLQkJCQlyZXR1cm4gZ3JvdXAgIT0gbnVsbCAmJiAhZ3JvdXAuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0lOQ0xVREU6Ci0JCQkJcmV0dXJuICFnZXRJbmNsdWRlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0VYQ0xVREU6Ci0JCQkJcmV0dXJuICFnZXRFeGNsdWRlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0NBU0VTRU5TSVRJVkU6Ci0JCQkJcmV0dXJuIGlzU2V0Q2FzZXNlbnNpdGl2ZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5GSUxFU0VUX1RZUEVfX0RJUjoKLQkJCQlyZXR1cm4gRElSX0VERUZBVUxUID09IG51bGwgPyBkaXIgIT0gbnVsbCA6ICFESVJfRURFRkFVTFQuZXF1YWxzKGRpcik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2VzZW5zaXRpdmU6ICIpOwotCQlpZiAoY2FzZXNlbnNpdGl2ZUVTZXQpIHJlc3VsdC5hcHBlbmQoY2FzZXNlbnNpdGl2ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGlyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRmlsZXNldFR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvSW5jbHVkZVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvSW5jbHVkZVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjEzODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0luY2x1ZGVUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkluY2x1ZGVUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5jbHVkZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuSW5jbHVkZVR5cGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmNsdWRlVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEluY2x1ZGVUeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbmNsdWRlVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5JTkNMVURFX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLklOQ0xVREVfVFlQRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSU5DTFVERV9UWVBFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSU5DTFVERV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSU5DTFVERV9UWVBFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLklOQ0xVREVfVFlQRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0luY2x1ZGVUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0puZGlDb25uZWN0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0puZGlDb25uZWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGUyOGQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9KbmRpQ29ubmVjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KbmRpIENvbm5lY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5KbmRpQ29ubmVjdGlvbkltcGwjZ2V0UHJvdmlkZXJVcmwgPGVtPlByb3ZpZGVyIFVybDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkpuZGlDb25uZWN0aW9uSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5KbmRpQ29ubmVjdGlvbkltcGwjZ2V0Sm5kaVByb3BlcnR5IDxlbT5KbmRpIFByb3BlcnR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuSm5kaUNvbm5lY3Rpb25JbXBsI2dldEluaXRpYWxDb250ZXh0RmFjdG9yeSA8ZW0+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKbmRpQ29ubmVjdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEpuZGlDb25uZWN0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvdmlkZXJVcmwoKSA8ZW0+UHJvdmlkZXIgVXJsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm92aWRlclVybCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfVVJMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3ZpZGVyVXJsKCkgPGVtPlByb3ZpZGVyIFVybDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvdmlkZXJVcmwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvdmlkZXJVcmwgPSBQUk9WSURFUl9VUkxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KCkgPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfQ09OVEVYVF9GQUNUT1JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpIDxlbT5Jbml0aWFsIENvbnRleHQgRmFjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxDb250ZXh0RmFjdG9yeSA9IElOSVRJQUxfQ09OVEVYVF9GQUNUT1JZX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEpuZGlDb25uZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLkpORElfQ09OTkVDVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyVXJsKCkgewotCQlyZXR1cm4gcHJvdmlkZXJVcmw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvdmlkZXJVcmwoU3RyaW5nIG5ld1Byb3ZpZGVyVXJsKSB7Ci0JCVN0cmluZyBvbGRQcm92aWRlclVybCA9IHByb3ZpZGVyVXJsOwotCQlwcm92aWRlclVybCA9IG5ld1Byb3ZpZGVyVXJsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX1BST1ZJREVSX1VSTCwgb2xkUHJvdmlkZXJVcmwsIHByb3ZpZGVyVXJsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19HUk9VUCk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRKbmRpUHJvcGVydHkoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuSk5ESV9DT05ORUNUSU9OX19KTkRJX1BST1BFUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGluaXRpYWxDb250ZXh0RmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoU3RyaW5nIG5ld0luaXRpYWxDb250ZXh0RmFjdG9yeSkgewotCQlTdHJpbmcgb2xkSW5pdGlhbENvbnRleHRGYWN0b3J5ID0gaW5pdGlhbENvbnRleHRGYWN0b3J5OwotCQlpbml0aWFsQ29udGV4dEZhY3RvcnkgPSBuZXdJbml0aWFsQ29udGV4dEZhY3Rvcnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlksIG9sZEluaXRpYWxDb250ZXh0RmFjdG9yeSwgaW5pdGlhbENvbnRleHRGYWN0b3J5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0dST1VQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFk6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRKbmRpUHJvcGVydHkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fUFJPVklERVJfVVJMOgotCQkJCXJldHVybiBnZXRQcm92aWRlclVybCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0dST1VQOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSk5ESV9QUk9QRVJUWToKLQkJCQlyZXR1cm4gZ2V0Sm5kaVByb3BlcnR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlk6Ci0JCQkJcmV0dXJuIGdldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fUFJPVklERVJfVVJMOgotCQkJCXNldFByb3ZpZGVyVXJsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19HUk9VUDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSk5ESV9QUk9QRVJUWToKLQkJCQlnZXRKbmRpUHJvcGVydHkoKS5jbGVhcigpOwotCQkJCWdldEpuZGlQcm9wZXJ0eSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0lOSVRJQUxfQ09OVEVYVF9GQUNUT1JZOgotCQkJCXNldEluaXRpYWxDb250ZXh0RmFjdG9yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX1BST1ZJREVSX1VSTDoKLQkJCQlzZXRQcm92aWRlclVybChQUk9WSURFUl9VUkxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFk6Ci0JCQkJZ2V0Sm5kaVByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlk6Ci0JCQkJc2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KElOSVRJQUxfQ09OVEVYVF9GQUNUT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19QUk9WSURFUl9VUkw6Ci0JCQkJcmV0dXJuIFBST1ZJREVSX1VSTF9FREVGQVVMVCA9PSBudWxsID8gcHJvdmlkZXJVcmwgIT0gbnVsbCA6ICFQUk9WSURFUl9VUkxfRURFRkFVTFQuZXF1YWxzKHByb3ZpZGVyVXJsKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19HUk9VUDoKLQkJCQlyZXR1cm4gZ3JvdXAgIT0gbnVsbCAmJiAhZ3JvdXAuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFk6Ci0JCQkJcmV0dXJuICFnZXRKbmRpUHJvcGVydHkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlk6Ci0JCQkJcmV0dXJuIElOSVRJQUxfQ09OVEVYVF9GQUNUT1JZX0VERUZBVUxUID09IG51bGwgPyBpbml0aWFsQ29udGV4dEZhY3RvcnkgIT0gbnVsbCA6ICFJTklUSUFMX0NPTlRFWFRfRkFDVE9SWV9FREVGQVVMVC5lcXVhbHMoaW5pdGlhbENvbnRleHRGYWN0b3J5KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByb3ZpZGVyVXJsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm92aWRlclVybCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsQ29udGV4dEZhY3Rvcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluaXRpYWxDb250ZXh0RmFjdG9yeSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0puZGlDb25uZWN0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0xhdW5jaENvbmZpZ3VyYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvTGF1bmNoQ29uZmlndXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2NmQ2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvTGF1bmNoQ29uZmlndXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGF1bmNoIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbCNnZXRFbnZpcm9ubWVudFZhcmlhYmxlIDxlbT5FbnZpcm9ubWVudCBWYXJpYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0UHJvZ3JhbUFyZ3VtZW50cyA8ZW0+UHJvZ3JhbSBBcmd1bWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbCNnZXRXb3JraW5nRGlyZWN0b3J5IDxlbT5Xb3JraW5nIERpcmVjdG9yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsI2dldE1haW5DbGFzcyA8ZW0+TWFpbiBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0Vm1QYXJhbWV0ZXJzIDxlbT5WbSBQYXJhbWV0ZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0RGVidWdQb3J0IDxlbT5EZWJ1ZyBQb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbCNnZXRFeHRlcm5hbCA8ZW0+RXh0ZXJuYWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hDb25maWd1cmF0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTGF1bmNoQ29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAxKCkgPGVtPkdyb3VwMTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nRGlyZWN0b3J5KCkgPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JraW5nRGlyZWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLSU5HX0RJUkVDVE9SWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nRGlyZWN0b3J5KCkgPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JraW5nRGlyZWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnkgPSBXT1JLSU5HX0RJUkVDVE9SWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluQ2xhc3MoKSA8ZW0+TWFpbiBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5DbGFzcygpIDxlbT5NYWluIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFpbkNsYXNzID0gTUFJTl9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCkgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKSA8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzcGF0aFJlZmVyZW5jZSA9IENMQVNTUEFUSF9SRUZFUkVOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVidWdQb3J0KCkgPGVtPkRlYnVnIFBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlYnVnUG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfUE9SVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWJ1Z1BvcnQoKSA8ZW0+RGVidWcgUG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVidWdQb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlYnVnUG9ydCA9IERFQlVHX1BPUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDMoKSA8ZW0+R3JvdXAzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExhdW5jaENvbmZpZ3VyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuTEFVTkNIX0NPTkZJR1VSQVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVudmlyb25tZW50VmFyaWFibGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VOVklST05NRU5UX1ZBUklBQkxFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQcm9ncmFtQXJndW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5MQVVOQ0hfQ09ORklHVVJBVElPTl9fUFJPR1JBTV9BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V29ya2luZ0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHdvcmtpbmdEaXJlY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya2luZ0RpcmVjdG9yeShTdHJpbmcgbmV3V29ya2luZ0RpcmVjdG9yeSkgewotCQlTdHJpbmcgb2xkV29ya2luZ0RpcmVjdG9yeSA9IHdvcmtpbmdEaXJlY3Rvcnk7Ci0JCXdvcmtpbmdEaXJlY3RvcnkgPSBuZXdXb3JraW5nRGlyZWN0b3J5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fV09SS0lOR19ESVJFQ1RPUlksIG9sZFdvcmtpbmdEaXJlY3RvcnksIHdvcmtpbmdEaXJlY3RvcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1haW5DbGFzcygpIHsKLQkJcmV0dXJuIG1haW5DbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjbGVhbldoaXRlU3BhY2UoU3RyaW5nIHN0cmluZykKLQl7Ci0JCWlmKHN0cmluZz09bnVsbCkKLQkJCXJldHVybiBudWxsOwotICAgICAgICBjaGFyW10gY2hhcnMgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewotCQkJaWYoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaGFyc1tpXSkpCi0JCQkJY2hhcnNbaV09JyAnOwotCQl9Ci0JCXJldHVybiAobmV3IFN0cmluZyhjaGFycykpLnRyaW0oKTsKLQkJCi0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1haW5DbGFzcyhTdHJpbmcgbmV3TWFpbkNsYXNzKSB7Ci0JCVN0cmluZyBvbGRNYWluQ2xhc3MgPSBtYWluQ2xhc3M7Ci0JCW1haW5DbGFzcyA9IG5ld01haW5DbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1MsIG9sZE1haW5DbGFzcywgbWFpbkNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Vm1QYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5MQVVOQ0hfQ09ORklHVVJBVElPTl9fVk1fUEFSQU1FVEVSUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBjbGFzc3BhdGhSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZyBuZXdDbGFzc3BhdGhSZWZlcmVuY2UpIHsKLQkJU3RyaW5nIG9sZENsYXNzcGF0aFJlZmVyZW5jZSA9IGNsYXNzcGF0aFJlZmVyZW5jZTsKLQkJY2xhc3NwYXRoUmVmZXJlbmNlID0gbmV3Q2xhc3NwYXRoUmVmZXJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRSwgb2xkQ2xhc3NwYXRoUmVmZXJlbmNlLCBjbGFzc3BhdGhSZWZlcmVuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlYnVnUG9ydCgpIHsKLQkJcmV0dXJuIGRlYnVnUG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWJ1Z1BvcnQoU3RyaW5nIG5ld0RlYnVnUG9ydCkgewotCQlTdHJpbmcgb2xkRGVidWdQb3J0ID0gZGVidWdQb3J0OwotCQlkZWJ1Z1BvcnQgPSBuZXdEZWJ1Z1BvcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19ERUJVR19QT1JULCBvbGREZWJ1Z1BvcnQsIGRlYnVnUG9ydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV4dGVybmFsKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRVhURVJOQUwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRU5WSVJPTk1FTlRfVkFSSUFCTEU6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAzOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VYVEVSTkFMOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXh0ZXJuYWwoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRU5WSVJPTk1FTlRfVkFSSUFCTEU6Ci0JCQkJcmV0dXJuIGdldEVudmlyb25tZW50VmFyaWFibGUoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMToKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDEoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19QUk9HUkFNX0FSR1VNRU5UUzoKLQkJCQlyZXR1cm4gZ2V0UHJvZ3JhbUFyZ3VtZW50cygpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fV09SS0lOR19ESVJFQ1RPUlk6Ci0JCQkJcmV0dXJuIGdldFdvcmtpbmdEaXJlY3RvcnkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldE1haW5DbGFzcygpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX1ZNX1BBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuIGdldFZtUGFyYW1ldGVycygpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19ERUJVR19QT1JUOgotCQkJCXJldHVybiBnZXREZWJ1Z1BvcnQoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMzoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDMoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19FWFRFUk5BTDoKLQkJCQlyZXR1cm4gZ2V0RXh0ZXJuYWwoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVA6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRU5WSVJPTk1FTlRfVkFSSUFCTEU6Ci0JCQkJZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAxOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19QUk9HUkFNX0FSR1VNRU5UUzoKLQkJCQlnZXRQcm9ncmFtQXJndW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9ncmFtQXJndW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19XT1JLSU5HX0RJUkVDVE9SWToKLQkJCQlzZXRXb3JraW5nRGlyZWN0b3J5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1M6Ci0JCQkJc2V0TWFpbkNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fVk1fUEFSQU1FVEVSUzoKLQkJCQlnZXRWbVBhcmFtZXRlcnMoKS5jbGVhcigpOwotCQkJCWdldFZtUGFyYW1ldGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlzZXRDbGFzc3BhdGhSZWZlcmVuY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fREVCVUdfUE9SVDoKLQkJCQlzZXREZWJ1Z1BvcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19FWFRFUk5BTDoKLQkJCQlnZXRFeHRlcm5hbCgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXh0ZXJuYWwoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRU5WSVJPTk1FTlRfVkFSSUFCTEU6Ci0JCQkJZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fUFJPR1JBTV9BUkdVTUVOVFM6Ci0JCQkJZ2V0UHJvZ3JhbUFyZ3VtZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fV09SS0lOR19ESVJFQ1RPUlk6Ci0JCQkJc2V0V29ya2luZ0RpcmVjdG9yeShXT1JLSU5HX0RJUkVDVE9SWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fTUFJTl9DTEFTUzoKLQkJCQlzZXRNYWluQ2xhc3MoTUFJTl9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fVk1fUEFSQU1FVEVSUzoKLQkJCQlnZXRWbVBhcmFtZXRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0NMQVNTUEFUSF9SRUZFUkVOQ0U6Ci0JCQkJc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKENMQVNTUEFUSF9SRUZFUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0RFQlVHX1BPUlQ6Ci0JCQkJc2V0RGVidWdQb3J0KERFQlVHX1BPUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMzoKLQkJCQlnZXRHcm91cDMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VYVEVSTkFMOgotCQkJCWdldEV4dGVybmFsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQOgotCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19FTlZJUk9OTUVOVF9WQVJJQUJMRToKLQkJCQlyZXR1cm4gIWdldEVudmlyb25tZW50VmFyaWFibGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fUFJPR1JBTV9BUkdVTUVOVFM6Ci0JCQkJcmV0dXJuICFnZXRQcm9ncmFtQXJndW1lbnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fV09SS0lOR19ESVJFQ1RPUlk6Ci0JCQkJcmV0dXJuIFdPUktJTkdfRElSRUNUT1JZX0VERUZBVUxUID09IG51bGwgPyB3b3JraW5nRGlyZWN0b3J5ICE9IG51bGwgOiAhV09SS0lOR19ESVJFQ1RPUllfRURFRkFVTFQuZXF1YWxzKHdvcmtpbmdEaXJlY3RvcnkpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fTUFJTl9DTEFTUzoKLQkJCQlyZXR1cm4gTUFJTl9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gbWFpbkNsYXNzICE9IG51bGwgOiAhTUFJTl9DTEFTU19FREVGQVVMVC5lcXVhbHMobWFpbkNsYXNzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19WTV9QQVJBTUVURVJTOgotCQkJCXJldHVybiAhZ2V0Vm1QYXJhbWV0ZXJzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVCA9PSBudWxsID8gY2xhc3NwYXRoUmVmZXJlbmNlICE9IG51bGwgOiAhQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVC5lcXVhbHMoY2xhc3NwYXRoUmVmZXJlbmNlKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0RFQlVHX1BPUlQ6Ci0JCQkJcmV0dXJuIERFQlVHX1BPUlRfRURFRkFVTFQgPT0gbnVsbCA/IGRlYnVnUG9ydCAhPSBudWxsIDogIURFQlVHX1BPUlRfRURFRkFVTFQuZXF1YWxzKGRlYnVnUG9ydCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDM6Ci0JCQkJcmV0dXJuIGdyb3VwMyAhPSBudWxsICYmICFncm91cDMuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRVhURVJOQUw6Ci0JCQkJcmV0dXJuICFnZXRFeHRlcm5hbCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtpbmdEaXJlY3Rvcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmtpbmdEaXJlY3RvcnkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1haW5DbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFpbkNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2xhc3NwYXRoUmVmZXJlbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjbGFzc3BhdGhSZWZlcmVuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlYnVnUG9ydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVidWdQb3J0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9ncmFtQXJndW1lbnRzQXNTdHJpbmcoKSB7Ci0JCXJldHVybiBjb25jYXRMaXN0KGdldFByb2dyYW1Bcmd1bWVudHMoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWbVBhcmFtZXRlcnNBc1N0cmluZygpIHsKLQkJcmV0dXJuIGNvbmNhdExpc3QoZ2V0Vm1QYXJhbWV0ZXJzKCkpOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgICAqLwotCXByaXZhdGUgU3RyaW5nIGNvbmNhdExpc3QoTGlzdCBsaXN0KXsKLQkJU3RyaW5nQnVmZmVyIGNvbmNhdFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0JCQljb25jYXRTdHJpbmcuYXBwZW5kKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQljb25jYXRTdHJpbmcuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmNhdFN0cmluZy50b1N0cmluZygpOwotCX0KLQkKLX0gLy9MYXVuY2hDb25maWd1cmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL01vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Nb2R1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhN2MzYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL01vZHVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Nb2R1bGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Nb2R1bGVJbXBsI2dldFB1Ymxpc2hEaXIgPGVtPlB1Ymxpc2ggRGlyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTW9kdWxlSW1wbCNnZXRQdWJsaXNoZXJSZWZlcmVuY2UgPGVtPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNb2R1bGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1Ymxpc2hEaXIoKSA8ZW0+UHVibGlzaCBEaXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1Ymxpc2hEaXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfRElSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1Ymxpc2hEaXIoKSA8ZW0+UHVibGlzaCBEaXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1Ymxpc2hEaXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGlzaERpciA9IFBVQkxJU0hfRElSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1Ymxpc2hlclJlZmVyZW5jZSgpIDxlbT5QdWJsaXNoZXIgUmVmZXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdWJsaXNoZXJSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFUl9SRUZFUkVOQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVibGlzaGVyUmVmZXJlbmNlKCkgPGVtPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1Ymxpc2hlclJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdWJsaXNoZXJSZWZlcmVuY2UgPSBQVUJMSVNIRVJfUkVGRVJFTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5NT0RVTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRV9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaERpcigpIHsKLQkJcmV0dXJuIHB1Ymxpc2hEaXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaERpcihTdHJpbmcgbmV3UHVibGlzaERpcikgewotCQlTdHJpbmcgb2xkUHVibGlzaERpciA9IHB1Ymxpc2hEaXI7Ci0JCXB1Ymxpc2hEaXIgPSBuZXdQdWJsaXNoRGlyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1BVQkxJU0hfRElSLCBvbGRQdWJsaXNoRGlyLCBwdWJsaXNoRGlyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoZXJSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBwdWJsaXNoZXJSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaGVyUmVmZXJlbmNlKFN0cmluZyBuZXdQdWJsaXNoZXJSZWZlcmVuY2UpIHsKLQkJU3RyaW5nIG9sZFB1Ymxpc2hlclJlZmVyZW5jZSA9IHB1Ymxpc2hlclJlZmVyZW5jZTsKLQkJcHVibGlzaGVyUmVmZXJlbmNlID0gbmV3UHVibGlzaGVyUmVmZXJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1BVQkxJU0hFUl9SRUZFUkVOQ0UsIG9sZFB1Ymxpc2hlclJlZmVyZW5jZSwgcHVibGlzaGVyUmVmZXJlbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIX0RJUjoKLQkJCQlyZXR1cm4gZ2V0UHVibGlzaERpcigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1BVQkxJU0hFUl9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuIGdldFB1Ymxpc2hlclJlZmVyZW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRV9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIX0RJUjoKLQkJCQlzZXRQdWJsaXNoRGlyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIRVJfUkVGRVJFTkNFOgotCQkJCXNldFB1Ymxpc2hlclJlZmVyZW5jZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRV9fUFVCTElTSF9ESVI6Ci0JCQkJc2V0UHVibGlzaERpcihQVUJMSVNIX0RJUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1BVQkxJU0hFUl9SRUZFUkVOQ0U6Ci0JCQkJc2V0UHVibGlzaGVyUmVmZXJlbmNlKFBVQkxJU0hFUl9SRUZFUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIX0RJUjoKLQkJCQlyZXR1cm4gUFVCTElTSF9ESVJfRURFRkFVTFQgPT0gbnVsbCA/IHB1Ymxpc2hEaXIgIT0gbnVsbCA6ICFQVUJMSVNIX0RJUl9FREVGQVVMVC5lcXVhbHMocHVibGlzaERpcik7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRV9fUFVCTElTSEVSX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gUFVCTElTSEVSX1JFRkVSRU5DRV9FREVGQVVMVCA9PSBudWxsID8gcHVibGlzaGVyUmVmZXJlbmNlICE9IG51bGwgOiAhUFVCTElTSEVSX1JFRkVSRU5DRV9FREVGQVVMVC5lcXVhbHMocHVibGlzaGVyUmVmZXJlbmNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1Ymxpc2hEaXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHB1Ymxpc2hEaXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1Ymxpc2hlclJlZmVyZW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHVibGlzaGVyUmVmZXJlbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTW9kdWxlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1BvcnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzYTYxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlBvcnRJbXBsI2dldE5vIDxlbT5ObzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlBvcnRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Qb3J0SW1wbCNnZXRQcm90b2NvbCA8ZW0+UHJvdG9jb2w8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUG9ydCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vKCkgPGVtPk5vPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRObygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm8oKSA8ZW0+Tm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vID0gTk9fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm90b2NvbCgpIDxlbT5Qcm90b2NvbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvdG9jb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3RvY29sKCkgPGVtPlByb3RvY29sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm90b2NvbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbCA9IFBST1RPQ09MX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvcnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuUE9SVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vKCkgewotCQlyZXR1cm4gbm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm8oU3RyaW5nIG5ld05vKSB7Ci0JCVN0cmluZyBvbGRObyA9IG5vOwotCQlubyA9IG5ld05vOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19OTywgb2xkTm8sIG5vKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotCQlyZXR1cm4gcHJvdG9jb2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvdG9jb2woU3RyaW5nIG5ld1Byb3RvY29sKSB7Ci0JCVN0cmluZyBvbGRQcm90b2NvbCA9IHByb3RvY29sOwotCQlwcm90b2NvbCA9IG5ld1Byb3RvY29sOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19QUk9UT0NPTCwgb2xkUHJvdG9jb2wsIHByb3RvY29sKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19OTzoKLQkJCQlyZXR1cm4gZ2V0Tm8oKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUE9SVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19QUk9UT0NPTDoKLQkJCQlyZXR1cm4gZ2V0UHJvdG9jb2woKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19OTzoKLQkJCQlzZXRObygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX1BST1RPQ09MOgotCQkJCXNldFByb3RvY29sKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05POgotCQkJCXNldE5vKE5PX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX1BST1RPQ09MOgotCQkJCXNldFByb3RvY29sKFBST1RPQ09MX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUE9SVF9fTk86Ci0JCQkJcmV0dXJuIE5PX0VERUZBVUxUID09IG51bGwgPyBubyAhPSBudWxsIDogIU5PX0VERUZBVUxULmVxdWFscyhubyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUE9SVF9fUFJPVE9DT0w6Ci0JCQkJcmV0dXJuIFBST1RPQ09MX0VERUZBVUxUID09IG51bGwgPyBwcm90b2NvbCAhPSBudWxsIDogIVBST1RPQ09MX0VERUZBVUxULmVxdWFscyhwcm90b2NvbCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChubzogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb3RvY29sOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm90b2NvbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BvcnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUHJvamVjdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Qcm9qZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjAxYTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Qcm9qZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb2plY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvamVjdEltcGwjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFByb2plY3QgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKSA8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhfUkVGRVJFTkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NwYXRoUmVmZXJlbmNlID0gQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9qZWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLlBST0pFQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBjbGFzc3BhdGhSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZyBuZXdDbGFzc3BhdGhSZWZlcmVuY2UpIHsKLQkJU3RyaW5nIG9sZENsYXNzcGF0aFJlZmVyZW5jZSA9IGNsYXNzcGF0aFJlZmVyZW5jZTsKLQkJY2xhc3NwYXRoUmVmZXJlbmNlID0gbmV3Q2xhc3NwYXRoUmVmZXJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9KRUNUX19DTEFTU1BBVEhfUkVGRVJFTkNFLCBvbGRDbGFzc3BhdGhSZWZlcmVuY2UsIGNsYXNzcGF0aFJlZmVyZW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPSkVDVF9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPSkVDVF9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlzZXRDbGFzc3BhdGhSZWZlcmVuY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPSkVDVF9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlzZXRDbGFzc3BhdGhSZWZlcmVuY2UoQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST0pFQ1RfX0NMQVNTUEFUSF9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuIENMQVNTUEFUSF9SRUZFUkVOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzcGF0aFJlZmVyZW5jZSAhPSBudWxsIDogIUNMQVNTUEFUSF9SRUZFUkVOQ0VfRURFRkFVTFQuZXF1YWxzKGNsYXNzcGF0aFJlZmVyZW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjbGFzc3BhdGhSZWZlcmVuY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNsYXNzcGF0aFJlZmVyZW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2plY3RJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUHJvcGVydHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNTM5ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1Byb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvcGVydHlJbXBsI2dldENvbnRleHQgPGVtPkNvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0RGVmYXVsdCA8ZW0+RGVmYXVsdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb3BlcnR5SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0TGFiZWwgPGVtPkxhYmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvcGVydHlJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFByb3BlcnR5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGV4dCgpIDxlbT5Db250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRleHQoKSA8ZW0+Q29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0ID0gQ09OVEVYVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0KCkgPGVtPkRlZmF1bHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdCgpIDxlbT5EZWZhdWx0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRfID0gREVGQVVMVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhYmVsKCkgPGVtPkxhYmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYWJlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFiZWwoKSA8ZW0+TGFiZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsID0gTEFCRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5QUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRleHQoU3RyaW5nIG5ld0NvbnRleHQpIHsKLQkJU3RyaW5nIG9sZENvbnRleHQgPSBjb250ZXh0OwotCQljb250ZXh0ID0gbmV3Q29udGV4dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0NPTlRFWFQsIG9sZENvbnRleHQsIGNvbnRleHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0XzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuZXdEZWZhdWx0KSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0ID0gZGVmYXVsdF87Ci0JCWRlZmF1bHRfID0gbmV3RGVmYXVsdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0RFRkFVTFQsIG9sZERlZmF1bHQsIGRlZmF1bHRfKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAgICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJaWYobGFiZWwuc3RhcnRzV2l0aCgiJSIsMCkpCi0JCXsKLQkJCVNlcnZlclJ1bnRpbWUgcnQgPSAoU2VydmVyUnVudGltZSllUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCUJ1bmRsZSBidW5kbGUgPVBsYXRmb3JtLmdldEJ1bmRsZShydC5nZXRDb25maWd1cmF0aW9uRWxlbWVudE5hbWVzcGFjZSgpKTsKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhidW5kbGUsbGFiZWwpOwotCQl9Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbmV3TGFiZWwpIHsKLQkJU3RyaW5nIG9sZExhYmVsID0gbGFiZWw7Ci0JCWxhYmVsID0gbmV3TGFiZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19MQUJFTCwgb2xkTGFiZWwsIGxhYmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fQ09OVEVYVDoKLQkJCQlyZXR1cm4gZ2V0Q29udGV4dCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fREVGQVVMVDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19MQUJFTDoKLQkJCQlyZXR1cm4gZ2V0TGFiZWwoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fQ09OVEVYVDoKLQkJCQlzZXRDb250ZXh0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0RFRkFVTFQ6Ci0JCQkJc2V0RGVmYXVsdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19MQUJFTDoKLQkJCQlzZXRMYWJlbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0NPTlRFWFQ6Ci0JCQkJc2V0Q29udGV4dChDT05URVhUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19ERUZBVUxUOgotCQkJCXNldERlZmF1bHQoREVGQVVMVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0xBQkVMOgotCQkJCXNldExhYmVsKExBQkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19DT05URVhUOgotCQkJCXJldHVybiBDT05URVhUX0VERUZBVUxUID09IG51bGwgPyBjb250ZXh0ICE9IG51bGwgOiAhQ09OVEVYVF9FREVGQVVMVC5lcXVhbHMoY29udGV4dCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19ERUZBVUxUOgotCQkJCXJldHVybiBERUZBVUxUX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0XyAhPSBudWxsIDogIURFRkFVTFRfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRfKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fTEFCRUw6Ci0JCQkJcmV0dXJuIExBQkVMX0VERUZBVUxUID09IG51bGwgPyBsYWJlbCAhPSBudWxsIDogIUxBQkVMX0VERUZBVUxULmVxdWFscyhsYWJlbCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb250ZXh0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb250ZXh0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Xyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYWJlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFiZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9wZXJ0eUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9QdWJsaXNoZXJEYXRhSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1B1Ymxpc2hlckRhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MjdhZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1B1Ymxpc2hlckRhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlB1Ymxpc2hlciBEYXRhPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVyRGF0YUltcGwjZ2V0RGF0YW5hbWUgPGVtPkRhdGFuYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVyRGF0YUltcGwjZ2V0RGF0YXZhbHVlIDxlbT5EYXRhdmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZXJEYXRhSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHVibGlzaGVyRGF0YSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFuYW1lKCkgPGVtPkRhdGFuYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXRhbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YW5hbWUoKSA8ZW0+RGF0YW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERhdGFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFuYW1lID0gREFUQU5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YXZhbHVlKCkgPGVtPkRhdGF2YWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF0YXZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YXZhbHVlKCkgPGVtPkRhdGF2YWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF0YXZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGF2YWx1ZSA9IERBVEFWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQdWJsaXNoZXJEYXRhSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLlBVQkxJU0hFUl9EQVRBOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YW5hbWUoKSB7Ci0JCXJldHVybiBkYXRhbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhbmFtZShTdHJpbmcgbmV3RGF0YW5hbWUpIHsKLQkJU3RyaW5nIG9sZERhdGFuYW1lID0gZGF0YW5hbWU7Ci0JCWRhdGFuYW1lID0gbmV3RGF0YW5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9EQVRBX19EQVRBTkFNRSwgb2xkRGF0YW5hbWUsIGRhdGFuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhdmFsdWUoKSB7Ci0JCXJldHVybiBkYXRhdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YXZhbHVlKFN0cmluZyBuZXdEYXRhdmFsdWUpIHsKLQkJU3RyaW5nIG9sZERhdGF2YWx1ZSA9IGRhdGF2YWx1ZTsKLQkJZGF0YXZhbHVlID0gbmV3RGF0YXZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQVZBTFVFLCBvbGREYXRhdmFsdWUsIGRhdGF2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEFfX0RBVEFOQU1FOgotCQkJCXJldHVybiBnZXREYXRhbmFtZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQVZBTFVFOgotCQkJCXJldHVybiBnZXREYXRhdmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQU5BTUU6Ci0JCQkJc2V0RGF0YW5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQVZBTFVFOgotCQkJCXNldERhdGF2YWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQU5BTUU6Ci0JCQkJc2V0RGF0YW5hbWUoREFUQU5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEFfX0RBVEFWQUxVRToKLQkJCQlzZXREYXRhdmFsdWUoREFUQVZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEFfX0RBVEFOQU1FOgotCQkJCXJldHVybiBEQVRBTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGF0YW5hbWUgIT0gbnVsbCA6ICFEQVRBTkFNRV9FREVGQVVMVC5lcXVhbHMoZGF0YW5hbWUpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQVZBTFVFOgotCQkJCXJldHVybiBEQVRBVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGRhdGF2YWx1ZSAhPSBudWxsIDogIURBVEFWQUxVRV9FREVGQVVMVC5lcXVhbHMoZGF0YXZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRhdGFuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkYXRhbmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGF0YXZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkYXRhdmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QdWJsaXNoZXJEYXRhSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1B1Ymxpc2hlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9QdWJsaXNoZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYzQwM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1B1Ymxpc2hlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHVibGlzaGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVySW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5QdWJsaXNoZXJJbXBsI2dldFB1Ymxpc2hlcmRhdGEgPGVtPlB1Ymxpc2hlcmRhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5QdWJsaXNoZXJJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hlckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFB1Ymxpc2hlciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHVibGlzaGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLkxpdGVyYWxzLlBVQkxJU0hFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFB1Ymxpc2hlcmRhdGEoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuUFVCTElTSEVSX19QVUJMSVNIRVJEQVRBKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fR1JPVVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fUFVCTElTSEVSREFUQToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFB1Ymxpc2hlcmRhdGEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fR1JPVVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX19QVUJMSVNIRVJEQVRBOgotCQkJCXJldHVybiBnZXRQdWJsaXNoZXJkYXRhKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX19HUk9VUDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fUFVCTElTSEVSREFUQToKLQkJCQlnZXRQdWJsaXNoZXJkYXRhKCkuY2xlYXIoKTsKLQkJCQlnZXRQdWJsaXNoZXJkYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX1BVQkxJU0hFUkRBVEE6Ci0JCQkJZ2V0UHVibGlzaGVyZGF0YSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX19HUk9VUDoKLQkJCQlyZXR1cm4gZ3JvdXAgIT0gbnVsbCAmJiAhZ3JvdXAuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX1BVQkxJU0hFUkRBVEE6Ci0JCQkJcmV0dXJuICFnZXRQdWJsaXNoZXJkYXRhKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QdWJsaXNoZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvU2VydmVyUnVudGltZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9TZXJ2ZXJSdW50aW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZThiODFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9TZXJ2ZXJSdW50aW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnhtbC5SZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmVyIFJ1bnRpbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRQcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldFBvcnQgPGVtPlBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldE1vZHVsZSA8ZW0+TW9kdWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldFN0b3AgPGVtPlN0b3A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldFB1Ymxpc2hlciA8ZW0+UHVibGlzaGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwjZ2V0R3JvdXA0IDxlbT5Hcm91cDQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRDbGFzc3BhdGggPGVtPkNsYXNzcGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldEpuZGlDb25uZWN0aW9uIDxlbT5KbmRpIENvbm5lY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclJ1bnRpbWVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTZXJ2ZXJSdW50aW1lIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3QoKSA8ZW0+UHJvamVjdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3QgcHJvamVjdDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIExhdW5jaENvbmZpZ3VyYXRpb24gc3RhcnQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdG9wKCkgPGVtPlN0b3A8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBMYXVuY2hDb25maWd1cmF0aW9uIHN0b3A7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDMoKSA8ZW0+R3JvdXAzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXA0KCkgPGVtPkdyb3VwNDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwNDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpuZGlDb25uZWN0aW9uKCkgPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm5kaUNvbm5lY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKbmRpQ29ubmVjdGlvbiBqbmRpQ29ubmVjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvbHZlciByZXNvbHZlciA9IG5ldyBSZXNvbHZlcih0aGlzKTsKLQlwcml2YXRlIFN0cmluZyBkZWNsYXJpbmdDb25maWd1cmF0aW9uRWxlbWVudE5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyBpZCA9bnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmVyUnVudGltZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5TRVJWRVJfUlVOVElNRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVApOwotCQl9Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UHJvcGVydHkoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVkVSX1JVTlRJTUVfX1BST1BFUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQb3J0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5TRVJWRVJfUlVOVElNRV9fUE9SVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5TRVJWRVJfUlVOVElNRV9fTU9EVUxFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcm9qZWN0KFByb2plY3QgbmV3UHJvamVjdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQcm9qZWN0IG9sZFByb2plY3QgPSBwcm9qZWN0OwotCQlwcm9qZWN0ID0gbmV3UHJvamVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1QsIG9sZFByb2plY3QsIG5ld1Byb2plY3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBuZXdQcm9qZWN0KSB7Ci0JCWlmIChuZXdQcm9qZWN0ICE9IHByb2plY3QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJvamVjdCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9KRUNULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcm9qZWN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Byb2plY3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFJPSkVDVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcm9qZWN0KG5ld1Byb2plY3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1QsIG5ld1Byb2plY3QsIG5ld1Byb2plY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN0YXJ0KExhdW5jaENvbmZpZ3VyYXRpb24gbmV3U3RhcnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTGF1bmNoQ29uZmlndXJhdGlvbiBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RBUlQsIG9sZFN0YXJ0LCBuZXdTdGFydCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoTGF1bmNoQ29uZmlndXJhdGlvbiBuZXdTdGFydCkgewotCQlpZiAobmV3U3RhcnQgIT0gc3RhcnQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN0YXJ0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN0YXJ0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUQVJULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTdGFydCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdGFydCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVEFSVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTdGFydChuZXdTdGFydCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RBUlQsIG5ld1N0YXJ0LCBuZXdTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMYXVuY2hDb25maWd1cmF0aW9uIGdldFN0b3AoKSB7Ci0JCXJldHVybiBzdG9wOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN0b3AoTGF1bmNoQ29uZmlndXJhdGlvbiBuZXdTdG9wLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUxhdW5jaENvbmZpZ3VyYXRpb24gb2xkU3RvcCA9IHN0b3A7Ci0JCXN0b3AgPSBuZXdTdG9wOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUCwgb2xkU3RvcCwgbmV3U3RvcCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RvcChMYXVuY2hDb25maWd1cmF0aW9uIG5ld1N0b3ApIHsKLQkJaWYgKG5ld1N0b3AgIT0gc3RvcCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3RvcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzdG9wKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUT1AsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1N0b3AgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U3RvcCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVE9QLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN0b3AobmV3U3RvcCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUCwgbmV3U3RvcCwgbmV3U3RvcCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFB1Ymxpc2hlcigpIHsKLQkJcmV0dXJuIGdldEdyb3VwMygpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXA0KCkgewotCQlpZiAoZ3JvdXA0ID09IG51bGwpIHsKLQkJCWdyb3VwNCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQNCk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwNDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q2xhc3NwYXRoKCkgewotCQlyZXR1cm4gZ2V0R3JvdXA0KCkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5MaXRlcmFscy5TRVJWRVJfUlVOVElNRV9fQ0xBU1NQQVRIKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSm5kaUNvbm5lY3Rpb24gZ2V0Sm5kaUNvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBqbmRpQ29ubmVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRKbmRpQ29ubmVjdGlvbihKbmRpQ29ubmVjdGlvbiBuZXdKbmRpQ29ubmVjdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlKbmRpQ29ubmVjdGlvbiBvbGRKbmRpQ29ubmVjdGlvbiA9IGpuZGlDb25uZWN0aW9uOwotCQlqbmRpQ29ubmVjdGlvbiA9IG5ld0puZGlDb25uZWN0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fSk5ESV9DT05ORUNUSU9OLCBvbGRKbmRpQ29ubmVjdGlvbiwgbmV3Sm5kaUNvbm5lY3Rpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpuZGlDb25uZWN0aW9uKEpuZGlDb25uZWN0aW9uIG5ld0puZGlDb25uZWN0aW9uKSB7Ci0JCWlmIChuZXdKbmRpQ29ubmVjdGlvbiAhPSBqbmRpQ29ubmVjdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoam5kaUNvbm5lY3Rpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpam5kaUNvbm5lY3Rpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fSk5ESV9DT05ORUNUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdKbmRpQ29ubmVjdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKbmRpQ29ubmVjdGlvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19KTkRJX0NPTk5FQ1RJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Sm5kaUNvbm5lY3Rpb24obmV3Sm5kaUNvbm5lY3Rpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTiwgbmV3Sm5kaUNvbm5lY3Rpb24sIG5ld0puZGlDb25uZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9QRVJUWToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QT1JUOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9ydCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fTU9EVUxFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TW9kdWxlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UHJvamVjdChudWxsLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUQVJUOgotCQkJCXJldHVybiBiYXNpY1NldFN0YXJ0KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTdG9wKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAzOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFB1Ymxpc2hlcigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fQ0xBU1NQQVRIOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q2xhc3NwYXRoKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRKbmRpQ29ubmVjdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST1BFUlRZOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAxOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BPUlQ6Ci0JCQkJcmV0dXJuIGdldFBvcnQoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19NT0RVTEU6Ci0JCQkJcmV0dXJuIGdldE1vZHVsZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFJPSkVDVDoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVE9QOgotCQkJCXJldHVybiBnZXRTdG9wKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDM6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAzKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFVCTElTSEVSOgotCQkJCXJldHVybiBnZXRQdWJsaXNoZXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQNDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDQoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwNCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19DTEFTU1BBVEg6Ci0JCQkJcmV0dXJuIGdldENsYXNzcGF0aCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fSk5ESV9DT05ORUNUSU9OOgotCQkJCXJldHVybiBnZXRKbmRpQ29ubmVjdGlvbigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9QRVJUWToKLQkJCQlnZXRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydHkoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUE9SVDoKLQkJCQlnZXRQb3J0KCkuY2xlYXIoKTsKLQkJCQlnZXRQb3J0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX01PRFVMRToKLQkJCQlnZXRNb2R1bGUoKS5jbGVhcigpOwotCQkJCWdldE1vZHVsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFJPSkVDVDoKLQkJCQlzZXRQcm9qZWN0KChQcm9qZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVEFSVDoKLQkJCQlzZXRTdGFydCgoTGF1bmNoQ29uZmlndXJhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUDoKLQkJCQlzZXRTdG9wKChMYXVuY2hDb25maWd1cmF0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDM6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUjoKLQkJCQlnZXRQdWJsaXNoZXIoKS5jbGVhcigpOwotCQkJCWdldFB1Ymxpc2hlcigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVA0OgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDQoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19DTEFTU1BBVEg6Ci0JCQkJZ2V0Q2xhc3NwYXRoKCkuY2xlYXIoKTsKLQkJCQlnZXRDbGFzc3BhdGgoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTjoKLQkJCQlzZXRKbmRpQ29ubmVjdGlvbigoSm5kaUNvbm5lY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9QRVJUWToKLQkJCQlnZXRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUE9SVDoKLQkJCQlnZXRQb3J0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19NT0RVTEU6Ci0JCQkJZ2V0TW9kdWxlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9KRUNUOgotCQkJCXNldFByb2plY3QoKFByb2plY3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKExhdW5jaENvbmZpZ3VyYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUDoKLQkJCQlzZXRTdG9wKChMYXVuY2hDb25maWd1cmF0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMzoKLQkJCQlnZXRHcm91cDMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUjoKLQkJCQlnZXRQdWJsaXNoZXIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQNDoKLQkJCQlnZXRHcm91cDQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0NMQVNTUEFUSDoKLQkJCQlnZXRDbGFzc3BhdGgoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTjoKLQkJCQlzZXRKbmRpQ29ubmVjdGlvbigoSm5kaUNvbm5lY3Rpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQOgotCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9QRVJUWToKLQkJCQlyZXR1cm4gIWdldFByb3BlcnR5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAxOgotCQkJCXJldHVybiBncm91cDEgIT0gbnVsbCAmJiAhZ3JvdXAxLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BPUlQ6Ci0JCQkJcmV0dXJuICFnZXRQb3J0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX01PRFVMRToKLQkJCQlyZXR1cm4gIWdldE1vZHVsZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIHByb2plY3QgIT0gbnVsbDsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUQVJUOgotCQkJCXJldHVybiBzdGFydCAhPSBudWxsOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUDoKLQkJCQlyZXR1cm4gc3RvcCAhPSBudWxsOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAzOgotCQkJCXJldHVybiBncm91cDMgIT0gbnVsbCAmJiAhZ3JvdXAzLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUjoKLQkJCQlyZXR1cm4gIWdldFB1Ymxpc2hlcigpLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQNDoKLQkJCQlyZXR1cm4gZ3JvdXA0ICE9IG51bGwgJiYgIWdyb3VwNC5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19DTEFTU1BBVEg6Ci0JCQkJcmV0dXJuICFnZXRDbGFzc3BhdGgoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19KTkRJX0NPTk5FQ1RJT046Ci0JCQkJcmV0dXJuIGpuZGlDb25uZWN0aW9uICE9IG51bGw7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAxKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwNDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXA0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCXB1YmxpYyBQdWJsaXNoZXIgZ2V0UHVibGlzaGVyKFN0cmluZyBpZCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMuZ2V0UHVibGlzaGVyKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHVibGlzaGVyIHB1Ymxpc2hlciA9IChQdWJsaXNoZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGlkLmVxdWFscyhwdWJsaXNoZXIuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHB1Ymxpc2hlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoU3RyaW5nIHR5cGUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLmdldE1vZHVsZSgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZih0eXBlLmVxdWFscyhtb2R1bGUuZ2V0VHlwZSgpKSkKLQkJCQlyZXR1cm4gbW9kdWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoIGdldENsYXNzcGF0aChTdHJpbmcgcmVmKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5nZXRDbGFzc3BhdGgoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDbGFzc3BhdGggY3AgPSAoQ2xhc3NwYXRoKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihyZWYuZXF1YWxzKGNwLmdldElkKCkpKQotCQkJCXJldHVybiBjcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsKLQkJcmV0dXJuIGZpbGVuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZm4pIHsKLQkJdGhpcy5maWxlbmFtZSA9IGZuOwkJCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWVzKE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCXRoaXMucmVzb2x2ZXIuc2V0UHJvcGVydHlWYWx1ZXMocHJvcGVydGllcyk7Ci0JCQotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFJlc29sdmVyIGdldFJlc29sdmVyKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvbHZlcjsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0RGVjbGFyaW5nQnVuZGxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlKCkgewotICAgICAgICAgICByZXR1cm4gZGVjbGFyaW5nQ29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI3NldENvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLmRlY2xhcmluZ0NvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlPW5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgCi0gICAgfQotCQotCQotfSAvL1NlcnZlclJ1bnRpbWVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvU2VydmVyVHlwZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvU2VydmVyVHlwZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzZiZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1NlcnZlclR5cGVGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgU2VydmVyVHlwZUZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZlclR5cGVGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlTZXJ2ZXJUeXBlRmFjdG9yeSB0aGVTZXJ2ZXJUeXBlRmFjdG9yeSA9IChTZXJ2ZXJUeXBlRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIpOyAKLQkJCWlmICh0aGVTZXJ2ZXJUeXBlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVNlcnZlclR5cGVGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IFNlcnZlclR5cGVGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkNISVZFX1RZUEU6IHJldHVybiBjcmVhdGVBcmNoaXZlVHlwZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSOiByZXR1cm4gY3JlYXRlQXJndW1lbnRQYWlyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSDogcmV0dXJuIGNyZWF0ZUNsYXNzcGF0aCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWENMVURFX1RZUEU6IHJldHVybiBjcmVhdGVFeGNsdWRlVHlwZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWFRFUk5BTDogcmV0dXJuIGNyZWF0ZUV4dGVybmFsKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkZJTEVTRVRfVFlQRTogcmV0dXJuIGNyZWF0ZUZpbGVzZXRUeXBlKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLklOQ0xVREVfVFlQRTogcmV0dXJuIGNyZWF0ZUluY2x1ZGVUeXBlKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTjogcmV0dXJuIGNyZWF0ZUpuZGlDb25uZWN0aW9uKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OOiByZXR1cm4gY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEU6IHJldHVybiBjcmVhdGVNb2R1bGUoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUE9SVDogcmV0dXJuIGNyZWF0ZVBvcnQoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPSkVDVDogcmV0dXJuIGNyZWF0ZVByb2plY3QoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFk6IHJldHVybiBjcmVhdGVQcm9wZXJ0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVI6IHJldHVybiBjcmVhdGVQdWJsaXNoZXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEE6IHJldHVybiBjcmVhdGVQdWJsaXNoZXJEYXRhKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FOiByZXR1cm4gY3JlYXRlU2VydmVyUnVudGltZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFyY2hpdmVUeXBlIGNyZWF0ZUFyY2hpdmVUeXBlKCkgewotCQlBcmNoaXZlVHlwZUltcGwgYXJjaGl2ZVR5cGUgPSBuZXcgQXJjaGl2ZVR5cGVJbXBsKCk7Ci0JCXJldHVybiBhcmNoaXZlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJndW1lbnRQYWlyIGNyZWF0ZUFyZ3VtZW50UGFpcigpIHsKLQkJQXJndW1lbnRQYWlySW1wbCBhcmd1bWVudFBhaXIgPSBuZXcgQXJndW1lbnRQYWlySW1wbCgpOwotCQlyZXR1cm4gYXJndW1lbnRQYWlyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotCQlDbGFzc3BhdGhJbXBsIGNsYXNzcGF0aCA9IG5ldyBDbGFzc3BhdGhJbXBsKCk7Ci0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4Y2x1ZGVUeXBlIGNyZWF0ZUV4Y2x1ZGVUeXBlKCkgewotCQlFeGNsdWRlVHlwZUltcGwgZXhjbHVkZVR5cGUgPSBuZXcgRXhjbHVkZVR5cGVJbXBsKCk7Ci0JCXJldHVybiBleGNsdWRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXh0ZXJuYWwgY3JlYXRlRXh0ZXJuYWwoKSB7Ci0JCUV4dGVybmFsSW1wbCBleHRlcm5hbCA9IG5ldyBFeHRlcm5hbEltcGwoKTsKLQkJcmV0dXJuIGV4dGVybmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGaWxlc2V0VHlwZSBjcmVhdGVGaWxlc2V0VHlwZSgpIHsKLQkJRmlsZXNldFR5cGVJbXBsIGZpbGVzZXRUeXBlID0gbmV3IEZpbGVzZXRUeXBlSW1wbCgpOwotCQlyZXR1cm4gZmlsZXNldFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluY2x1ZGVUeXBlIGNyZWF0ZUluY2x1ZGVUeXBlKCkgewotCQlJbmNsdWRlVHlwZUltcGwgaW5jbHVkZVR5cGUgPSBuZXcgSW5jbHVkZVR5cGVJbXBsKCk7Ci0JCXJldHVybiBpbmNsdWRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSm5kaUNvbm5lY3Rpb24gY3JlYXRlSm5kaUNvbm5lY3Rpb24oKSB7Ci0JCUpuZGlDb25uZWN0aW9uSW1wbCBqbmRpQ29ubmVjdGlvbiA9IG5ldyBKbmRpQ29ubmVjdGlvbkltcGwoKTsKLQkJcmV0dXJuIGpuZGlDb25uZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMYXVuY2hDb25maWd1cmF0aW9uIGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oKSB7Ci0JCUxhdW5jaENvbmZpZ3VyYXRpb25JbXBsIGxhdW5jaENvbmZpZ3VyYXRpb24gPSBuZXcgTGF1bmNoQ29uZmlndXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGxhdW5jaENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZHVsZSBjcmVhdGVNb2R1bGUoKSB7Ci0JCU1vZHVsZUltcGwgbW9kdWxlID0gbmV3IE1vZHVsZUltcGwoKTsKLQkJcmV0dXJuIG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9ydCBjcmVhdGVQb3J0KCkgewotCQlQb3J0SW1wbCBwb3J0ID0gbmV3IFBvcnRJbXBsKCk7Ci0JCXJldHVybiBwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9qZWN0IGNyZWF0ZVByb2plY3QoKSB7Ci0JCVByb2plY3RJbXBsIHByb2plY3QgPSBuZXcgUHJvamVjdEltcGwoKTsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb3BlcnR5IGNyZWF0ZVByb3BlcnR5KCkgewotCQlQcm9wZXJ0eUltcGwgcHJvcGVydHkgPSBuZXcgUHJvcGVydHlJbXBsKCk7Ci0JCXJldHVybiBwcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHVibGlzaGVyIGNyZWF0ZVB1Ymxpc2hlcigpIHsKLQkJUHVibGlzaGVySW1wbCBwdWJsaXNoZXIgPSBuZXcgUHVibGlzaGVySW1wbCgpOwotCQlyZXR1cm4gcHVibGlzaGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQdWJsaXNoZXJEYXRhIGNyZWF0ZVB1Ymxpc2hlckRhdGEoKSB7Ci0JCVB1Ymxpc2hlckRhdGFJbXBsIHB1Ymxpc2hlckRhdGEgPSBuZXcgUHVibGlzaGVyRGF0YUltcGwoKTsKLQkJcmV0dXJuIHB1Ymxpc2hlckRhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZlclJ1bnRpbWUgY3JlYXRlU2VydmVyUnVudGltZSgpIHsKLQkJU2VydmVyUnVudGltZUltcGwgc2VydmVyUnVudGltZSA9IG5ldyBTZXJ2ZXJSdW50aW1lSW1wbCgpOwotCQlyZXR1cm4gc2VydmVyUnVudGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZVBhY2thZ2UgZ2V0U2VydmVyVHlwZVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoU2VydmVyVHlwZVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyVHlwZVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9TZXJ2ZXJUeXBlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9TZXJ2ZXJUeXBlUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9TZXJ2ZXJUeXBlUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4MzEyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvU2VydmVyVHlwZVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeGNsdWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclR5cGVQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFNlcnZlclR5cGVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcmNoaXZlVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcmd1bWVudFBhaXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2xhc3NwYXRoRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4Y2x1ZGVUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4dGVybmFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZpbGVzZXRUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGluY2x1ZGVUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGpuZGlDb25uZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbW9kdWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBvcnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvamVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdWJsaXNoZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHVibGlzaGVyRGF0YUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZXJ2ZXJSdW50aW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNlcnZlclR5cGVQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgU2VydmVyVHlwZUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyVHlwZVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFNlcnZlclR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcnZlclR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJU2VydmVyVHlwZVBhY2thZ2VJbXBsIHRoZVNlcnZlclR5cGVQYWNrYWdlID0gKFNlcnZlclR5cGVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBTZXJ2ZXJUeXBlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBTZXJ2ZXJUeXBlUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlU2VydmVyVHlwZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVTZXJ2ZXJUeXBlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVTZXJ2ZXJUeXBlUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlU2VydmVyVHlwZVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcmNoaXZlVHlwZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmVUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFyY2hpdmVUeXBlX1BhdGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcmNoaXZlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXJndW1lbnRQYWlyKCkgewotCQlyZXR1cm4gYXJndW1lbnRQYWlyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFyZ3VtZW50UGFpcl9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJndW1lbnRQYWlyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJndW1lbnRQYWlyX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJndW1lbnRQYWlyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBjbGFzc3BhdGhFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2xhc3NwYXRoX0dyb3VwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2xhc3NwYXRoRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2xhc3NwYXRoX0FyY2hpdmUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljbGFzc3BhdGhFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDbGFzc3BhdGhfRmlsZXNldCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNsYXNzcGF0aEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENsYXNzcGF0aF9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNsYXNzcGF0aEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXhjbHVkZVR5cGUoKSB7Ci0JCXJldHVybiBleGNsdWRlVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeGNsdWRlVHlwZV9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXhjbHVkZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4dGVybmFsKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZXJuYWxfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlleHRlcm5hbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVybmFsX09zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXh0ZXJuYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZpbGVzZXRUeXBlKCkgewotCQlyZXR1cm4gZmlsZXNldFR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsZXNldFR5cGVfR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWxlc2V0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbGVzZXRUeXBlX0luY2x1ZGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWxlc2V0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbGVzZXRUeXBlX0V4Y2x1ZGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWxlc2V0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbGVzZXRUeXBlX0Nhc2VzZW5zaXRpdmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWxlc2V0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbGVzZXRUeXBlX0RpcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbGVzZXRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbmNsdWRlVHlwZSgpIHsKLQkJcmV0dXJuIGluY2x1ZGVUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEluY2x1ZGVUeXBlX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbmNsdWRlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Sm5kaUNvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBqbmRpQ29ubmVjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKbmRpQ29ubmVjdGlvbl9Qcm92aWRlclVybCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpuZGlDb25uZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Sm5kaUNvbm5lY3Rpb25fR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqbmRpQ29ubmVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEpuZGlDb25uZWN0aW9uX0puZGlQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWpuZGlDb25uZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Sm5kaUNvbm5lY3Rpb25fSW5pdGlhbENvbnRleHRGYWN0b3J5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpam5kaUNvbm5lY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExhdW5jaENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FbnZpcm9ubWVudFZhcmlhYmxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAxKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fUHJvZ3JhbUFyZ3VtZW50cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX1dvcmtpbmdEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9NYWluQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9WbVBhcmFtZXRlcnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9DbGFzc3BhdGhSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9EZWJ1Z1BvcnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fRXh0ZXJuYWwoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZHVsZV9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kdWxlX1B1Ymxpc2hEaXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2R1bGVfUHVibGlzaGVyUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kdWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQb3J0KCkgewotCQlyZXR1cm4gcG9ydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0X05vKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0X1Byb3RvY29sKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DbGFzc3BhdGhSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9qZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X0NvbnRleHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X0RlZmF1bHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9MYWJlbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQdWJsaXNoZXIoKSB7Ci0JCXJldHVybiBwdWJsaXNoZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHVibGlzaGVyX0dyb3VwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHVibGlzaGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHVibGlzaGVyX1B1Ymxpc2hlcmRhdGEoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdWJsaXNoZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQdWJsaXNoZXJfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdWJsaXNoZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFB1Ymxpc2hlckRhdGEoKSB7Ci0JCXJldHVybiBwdWJsaXNoZXJEYXRhRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFB1Ymxpc2hlckRhdGFfRGF0YW5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdWJsaXNoZXJEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHVibGlzaGVyRGF0YV9EYXRhdmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdWJsaXNoZXJEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZXJ2ZXJSdW50aW1lKCkgewotCQlyZXR1cm4gc2VydmVyUnVudGltZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfUHJvcGVydHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9Hcm91cDEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9Qb3J0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfTW9kdWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfUHJvamVjdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1N0YXJ0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfU3RvcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1B1Ymxpc2hlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9Hcm91cDQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfQ2xhc3NwYXRoKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX0puZGlDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVGYWN0b3J5IGdldFNlcnZlclR5cGVGYWN0b3J5KCkgewotCQlyZXR1cm4gKFNlcnZlclR5cGVGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWFyY2hpdmVUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSQ0hJVkVfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJjaGl2ZVR5cGVFQ2xhc3MsIEFSQ0hJVkVfVFlQRV9fUEFUSCk7Ci0KLQkJYXJndW1lbnRQYWlyRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSR1VNRU5UX1BBSVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGFyZ3VtZW50UGFpckVDbGFzcywgQVJHVU1FTlRfUEFJUl9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJndW1lbnRQYWlyRUNsYXNzLCBBUkdVTUVOVF9QQUlSX19WQUxVRSk7Ci0KLQkJY2xhc3NwYXRoRUNsYXNzID0gY3JlYXRlRUNsYXNzKENMQVNTUEFUSCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY2xhc3NwYXRoRUNsYXNzLCBDTEFTU1BBVEhfX0dST1VQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjbGFzc3BhdGhFQ2xhc3MsIENMQVNTUEFUSF9fQVJDSElWRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY2xhc3NwYXRoRUNsYXNzLCBDTEFTU1BBVEhfX0ZJTEVTRVQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNsYXNzcGF0aEVDbGFzcywgQ0xBU1NQQVRIX19JRCk7Ci0KLQkJZXhjbHVkZVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVhDTFVERV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShleGNsdWRlVHlwZUVDbGFzcywgRVhDTFVERV9UWVBFX19OQU1FKTsKLQotCQlleHRlcm5hbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFWFRFUk5BTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXh0ZXJuYWxFQ2xhc3MsIEVYVEVSTkFMX19WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXh0ZXJuYWxFQ2xhc3MsIEVYVEVSTkFMX19PUyk7Ci0KLQkJZmlsZXNldFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklMRVNFVF9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWxlc2V0VHlwZUVDbGFzcywgRklMRVNFVF9UWVBFX19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsZXNldFR5cGVFQ2xhc3MsIEZJTEVTRVRfVFlQRV9fSU5DTFVERSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmlsZXNldFR5cGVFQ2xhc3MsIEZJTEVTRVRfVFlQRV9fRVhDTFVERSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsZXNldFR5cGVFQ2xhc3MsIEZJTEVTRVRfVFlQRV9fQ0FTRVNFTlNJVElWRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsZXNldFR5cGVFQ2xhc3MsIEZJTEVTRVRfVFlQRV9fRElSKTsKLQotCQlpbmNsdWRlVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTkNMVURFX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGluY2x1ZGVUeXBlRUNsYXNzLCBJTkNMVURFX1RZUEVfX05BTUUpOwotCi0JCWpuZGlDb25uZWN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpORElfQ09OTkVDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoam5kaUNvbm5lY3Rpb25FQ2xhc3MsIEpORElfQ09OTkVDVElPTl9fUFJPVklERVJfVVJMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqbmRpQ29ubmVjdGlvbkVDbGFzcywgSk5ESV9DT05ORUNUSU9OX19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoam5kaUNvbm5lY3Rpb25FQ2xhc3MsIEpORElfQ09OTkVDVElPTl9fSk5ESV9QUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoam5kaUNvbm5lY3Rpb25FQ2xhc3MsIEpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlkpOwotCi0JCWxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTEFVTkNIX0NPTkZJR1VSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VOVklST05NRU5UX1ZBUklBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fUFJPR1JBTV9BUkdVTUVOVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19XT1JLSU5HX0RJUkVDVE9SWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19WTV9QQVJBTUVURVJTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0RFQlVHX1BPUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19FWFRFUk5BTCk7Ci0KLQkJbW9kdWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1PRFVMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobW9kdWxlRUNsYXNzLCBNT0RVTEVfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19QVUJMSVNIX0RJUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobW9kdWxlRUNsYXNzLCBNT0RVTEVfX1BVQkxJU0hFUl9SRUZFUkVOQ0UpOwotCi0JCXBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9SVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydEVDbGFzcywgUE9SVF9fTk8pOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRFQ2xhc3MsIFBPUlRfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRFQ2xhc3MsIFBPUlRfX1BST1RPQ09MKTsKLQotCQlwcm9qZWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0pFQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2plY3RFQ2xhc3MsIFBST0pFQ1RfX0NMQVNTUEFUSF9SRUZFUkVOQ0UpOwotCi0JCXByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST1BFUlRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eUVDbGFzcywgUFJPUEVSVFlfX0NPTlRFWFQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fREVGQVVMVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlFQ2xhc3MsIFBST1BFUlRZX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlFQ2xhc3MsIFBST1BFUlRZX19MQUJFTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlFQ2xhc3MsIFBST1BFUlRZX19UWVBFKTsKLQotCQlwdWJsaXNoZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFVCTElTSEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdWJsaXNoZXJFQ2xhc3MsIFBVQkxJU0hFUl9fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKHB1Ymxpc2hlckVDbGFzcywgUFVCTElTSEVSX19QVUJMSVNIRVJEQVRBKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdWJsaXNoZXJFQ2xhc3MsIFBVQkxJU0hFUl9fSUQpOwotCi0JCXB1Ymxpc2hlckRhdGFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFVCTElTSEVSX0RBVEEpOwotCQljcmVhdGVFQXR0cmlidXRlKHB1Ymxpc2hlckRhdGFFQ2xhc3MsIFBVQkxJU0hFUl9EQVRBX19EQVRBTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHVibGlzaGVyRGF0YUVDbGFzcywgUFVCTElTSEVSX0RBVEFfX0RBVEFWQUxVRSk7Ci0KLQkJc2VydmVyUnVudGltZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRVJWRVJfUlVOVElNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0dST1VQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19HUk9VUDEpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19QT1JUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fTU9EVUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fUFJPSkVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX1NUQVJUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fU1RPUCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0dST1VQMyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0dST1VQNCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0NMQVNTUEFUSCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19WRVJTSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYXJjaGl2ZVR5cGVFQ2xhc3MsIEFyY2hpdmVUeXBlLmNsYXNzLCAiQXJjaGl2ZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFyY2hpdmVUeXBlX1BhdGgoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwYXRoIiwgbnVsbCwgMCwgMSwgQXJjaGl2ZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXJndW1lbnRQYWlyRUNsYXNzLCBBcmd1bWVudFBhaXIuY2xhc3MsICJBcmd1bWVudFBhaXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFyZ3VtZW50UGFpcl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIEFyZ3VtZW50UGFpci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFyZ3VtZW50UGFpcl9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMSwgMSwgQXJndW1lbnRQYWlyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNsYXNzcGF0aEVDbGFzcywgQ2xhc3NwYXRoLmNsYXNzLCAiQ2xhc3NwYXRoIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDbGFzc3BhdGhfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIENsYXNzcGF0aC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENsYXNzcGF0aF9BcmNoaXZlKCksIHRoaXMuZ2V0QXJjaGl2ZVR5cGUoKSwgbnVsbCwgImFyY2hpdmUiLCBudWxsLCAwLCAtMSwgQ2xhc3NwYXRoLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDbGFzc3BhdGhfRmlsZXNldCgpLCB0aGlzLmdldEZpbGVzZXRUeXBlKCksIG51bGwsICJmaWxlc2V0IiwgbnVsbCwgMCwgLTEsIENsYXNzcGF0aC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2xhc3NwYXRoX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBDbGFzc3BhdGguY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXhjbHVkZVR5cGVFQ2xhc3MsIEV4Y2x1ZGVUeXBlLmNsYXNzLCAiRXhjbHVkZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV4Y2x1ZGVUeXBlX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRXhjbHVkZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXh0ZXJuYWxFQ2xhc3MsIEV4dGVybmFsLmNsYXNzLCAiRXh0ZXJuYWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV4dGVybmFsX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBFeHRlcm5hbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV4dGVybmFsX09zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3MiLCBudWxsLCAwLCAxLCBFeHRlcm5hbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhmaWxlc2V0VHlwZUVDbGFzcywgRmlsZXNldFR5cGUuY2xhc3MsICJGaWxlc2V0VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsZXNldFR5cGVfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIEZpbGVzZXRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsZXNldFR5cGVfSW5jbHVkZSgpLCB0aGlzLmdldEluY2x1ZGVUeXBlKCksIG51bGwsICJpbmNsdWRlIiwgbnVsbCwgMCwgLTEsIEZpbGVzZXRUeXBlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWxlc2V0VHlwZV9FeGNsdWRlKCksIHRoaXMuZ2V0RXhjbHVkZVR5cGUoKSwgbnVsbCwgImV4Y2x1ZGUiLCBudWxsLCAwLCAtMSwgRmlsZXNldFR5cGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbGVzZXRUeXBlX0Nhc2VzZW5zaXRpdmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiY2FzZXNlbnNpdGl2ZSIsIG51bGwsIDAsIDEsIEZpbGVzZXRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWxlc2V0VHlwZV9EaXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkaXIiLCBudWxsLCAwLCAxLCBGaWxlc2V0VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpbmNsdWRlVHlwZUVDbGFzcywgSW5jbHVkZVR5cGUuY2xhc3MsICJJbmNsdWRlVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5jbHVkZVR5cGVfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBJbmNsdWRlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqbmRpQ29ubmVjdGlvbkVDbGFzcywgSm5kaUNvbm5lY3Rpb24uY2xhc3MsICJKbmRpQ29ubmVjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Sm5kaUNvbm5lY3Rpb25fUHJvdmlkZXJVcmwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm92aWRlclVybCIsIG51bGwsIDEsIDEsIEpuZGlDb25uZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Sm5kaUNvbm5lY3Rpb25fR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIEpuZGlDb25uZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Sm5kaUNvbm5lY3Rpb25fSm5kaVByb3BlcnR5KCksIHRoaXMuZ2V0QXJndW1lbnRQYWlyKCksIG51bGwsICJqbmRpUHJvcGVydHkiLCBudWxsLCAwLCAtMSwgSm5kaUNvbm5lY3Rpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpuZGlDb25uZWN0aW9uX0luaXRpYWxDb250ZXh0RmFjdG9yeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImluaXRpYWxDb250ZXh0RmFjdG9yeSIsIG51bGwsIDEsIDEsIEpuZGlDb25uZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExhdW5jaENvbmZpZ3VyYXRpb24uY2xhc3MsICJMYXVuY2hDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cCIsIG51bGwsIDAsIC0xLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FbnZpcm9ubWVudFZhcmlhYmxlKCksIHRoaXMuZ2V0QXJndW1lbnRQYWlyKCksIG51bGwsICJlbnZpcm9ubWVudFZhcmlhYmxlIiwgbnVsbCwgMCwgLTEsIExhdW5jaENvbmZpZ3VyYXRpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAxKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDEiLCBudWxsLCAwLCAtMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fUHJvZ3JhbUFyZ3VtZW50cygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb2dyYW1Bcmd1bWVudHMiLCBudWxsLCAwLCAtMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fV29ya2luZ0RpcmVjdG9yeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndvcmtpbmdEaXJlY3RvcnkiLCBudWxsLCAxLCAxLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9NYWluQ2xhc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYWluQ2xhc3MiLCBudWxsLCAwLCAxLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9WbVBhcmFtZXRlcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2bVBhcmFtZXRlcnMiLCBudWxsLCAwLCAtMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fQ2xhc3NwYXRoUmVmZXJlbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2xhc3NwYXRoUmVmZXJlbmNlIiwgbnVsbCwgMCwgMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fRGVidWdQb3J0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVidWdQb3J0IiwgbnVsbCwgMCwgMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAzKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDMiLCBudWxsLCAwLCAtMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fRXh0ZXJuYWwoKSwgdGhpcy5nZXRFeHRlcm5hbCgpLCBudWxsLCAiZXh0ZXJuYWwiLCBudWxsLCAwLCAtMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1vZHVsZUVDbGFzcywgTW9kdWxlLmNsYXNzLCAiTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAxLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfUHVibGlzaERpcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInB1Ymxpc2hEaXIiLCBudWxsLCAxLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfUHVibGlzaGVyUmVmZXJlbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHVibGlzaGVyUmVmZXJlbmNlIiwgbnVsbCwgMSwgMSwgTW9kdWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBvcnRFQ2xhc3MsIFBvcnQuY2xhc3MsICJQb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0X05vKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibm8iLCBudWxsLCAxLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydF9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0X1Byb3RvY29sKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvdG9jb2wiLCBudWxsLCAxLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2plY3RFQ2xhc3MsIFByb2plY3QuY2xhc3MsICJQcm9qZWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9qZWN0X0NsYXNzcGF0aFJlZmVyZW5jZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNsYXNzcGF0aFJlZmVyZW5jZSIsIG51bGwsIDEsIDEsIFByb2plY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvcGVydHlFQ2xhc3MsIFByb3BlcnR5LmNsYXNzLCAiUHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5X0NvbnRleHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb250ZXh0IiwgbnVsbCwgMCwgMSwgUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eV9EZWZhdWx0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVmYXVsdCIsIG51bGwsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlfTGFiZWwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJsYWJlbCIsIG51bGwsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlfVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdWJsaXNoZXJFQ2xhc3MsIFB1Ymxpc2hlci5jbGFzcywgIlB1Ymxpc2hlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHVibGlzaGVyX0dyb3VwKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cCIsIG51bGwsIDAsIC0xLCBQdWJsaXNoZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQdWJsaXNoZXJfUHVibGlzaGVyZGF0YSgpLCB0aGlzLmdldFB1Ymxpc2hlckRhdGEoKSwgbnVsbCwgInB1Ymxpc2hlcmRhdGEiLCBudWxsLCAxLCAtMSwgUHVibGlzaGVyLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQdWJsaXNoZXJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFB1Ymxpc2hlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdWJsaXNoZXJEYXRhRUNsYXNzLCBQdWJsaXNoZXJEYXRhLmNsYXNzLCAiUHVibGlzaGVyRGF0YSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHVibGlzaGVyRGF0YV9EYXRhbmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRhdGFuYW1lIiwgbnVsbCwgMSwgMSwgUHVibGlzaGVyRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFB1Ymxpc2hlckRhdGFfRGF0YXZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGF0YXZhbHVlIiwgbnVsbCwgMSwgMSwgUHVibGlzaGVyRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAiU2VydmVyUnVudGltZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmVyUnVudGltZV9Hcm91cCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAiLCBudWxsLCAwLCAtMSwgU2VydmVyUnVudGltZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZlclJ1bnRpbWVfUHJvcGVydHkoKSwgdGhpcy5nZXRQcm9wZXJ0eSgpLCBudWxsLCAicHJvcGVydHkiLCBudWxsLCAwLCAtMSwgU2VydmVyUnVudGltZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmVyUnVudGltZV9Hcm91cDEoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMSIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmVyUnVudGltZV9Qb3J0KCksIHRoaXMuZ2V0UG9ydCgpLCBudWxsLCAicG9ydCIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2ZXJSdW50aW1lX01vZHVsZSgpLCB0aGlzLmdldE1vZHVsZSgpLCBudWxsLCAibW9kdWxlIiwgbnVsbCwgMSwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZlclJ1bnRpbWVfUHJvamVjdCgpLCB0aGlzLmdldFByb2plY3QoKSwgbnVsbCwgInByb2plY3QiLCBudWxsLCAxLCAxLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2ZXJSdW50aW1lX1N0YXJ0KCksIHRoaXMuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpLCBudWxsLCAic3RhcnQiLCBudWxsLCAxLCAxLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2ZXJSdW50aW1lX1N0b3AoKSwgdGhpcy5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCksIG51bGwsICJzdG9wIiwgbnVsbCwgMSwgMSwgU2VydmVyUnVudGltZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmVyUnVudGltZV9Hcm91cDMoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMyIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmVyUnVudGltZV9QdWJsaXNoZXIoKSwgdGhpcy5nZXRQdWJsaXNoZXIoKSwgbnVsbCwgInB1Ymxpc2hlciIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwNCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXA0IiwgbnVsbCwgMCwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpLCB0aGlzLmdldENsYXNzcGF0aCgpLCBudWxsLCAiY2xhc3NwYXRoIiwgbnVsbCwgMSwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZlclJ1bnRpbWVfSm5kaUNvbm5lY3Rpb24oKSwgdGhpcy5nZXRKbmRpQ29ubmVjdGlvbigpLCBudWxsLCAiam5kaUNvbm5lY3Rpb24iLCBudWxsLCAxLCAxLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2ZXJSdW50aW1lX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgU2VydmVyUnVudGltZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZlclJ1bnRpbWVfVmVyc2lvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQotCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YTwvYj4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhcmNoaXZlVHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiYXJjaGl2ZV8uX3R5cGUiLAotCQkJICJraW5kIiwgImVtcHR5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFyY2hpdmVUeXBlX1BhdGgoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJwYXRoIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFyZ3VtZW50UGFpckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQXJndW1lbnRQYWlyIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcmd1bWVudFBhaXJfTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJuYW1lIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFyZ3VtZW50UGFpcl9WYWx1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJ2YWx1ZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjbGFzc3BhdGhFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNsYXNzcGF0aCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q2xhc3NwYXRoX0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDowIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENsYXNzcGF0aF9BcmNoaXZlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImFyY2hpdmUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDbGFzc3BhdGhfRmlsZXNldCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJmaWxlc2V0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q2xhc3NwYXRoX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXhjbHVkZVR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImV4Y2x1ZGVfLl90eXBlIiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFeGNsdWRlVHlwZV9OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChleHRlcm5hbEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRXh0ZXJuYWwiLAotCQkJICJraW5kIiwgInNpbXBsZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFeHRlcm5hbF9WYWx1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICI6MCIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEV4dGVybmFsX09zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAib3MiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZmlsZXNldFR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImZpbGVzZXRfLl90eXBlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWxlc2V0VHlwZV9Hcm91cCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWxlc2V0VHlwZV9JbmNsdWRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImluY2x1ZGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWxlc2V0VHlwZV9FeGNsdWRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImV4Y2x1ZGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWxlc2V0VHlwZV9DYXNlc2Vuc2l0aXZlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiY2FzZXNlbnNpdGl2ZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRGaWxlc2V0VHlwZV9EaXIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJkaXIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoaW5jbHVkZVR5cGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImluY2x1ZGVfLl90eXBlIiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRJbmNsdWRlVHlwZV9OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChqbmRpQ29ubmVjdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiam5kaUNvbm5lY3Rpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpuZGlDb25uZWN0aW9uX1Byb3ZpZGVyVXJsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInByb3ZpZGVyVXJsIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpuZGlDb25uZWN0aW9uX0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpuZGlDb25uZWN0aW9uX0puZGlQcm9wZXJ0eSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJqbmRpUHJvcGVydHkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKbmRpQ29ubmVjdGlvbl9Jbml0aWFsQ29udGV4dEZhY3RvcnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiaW5pdGlhbENvbnRleHRGYWN0b3J5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkxhdW5jaENvbmZpZ3VyYXRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FbnZpcm9ubWVudFZhcmlhYmxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImVudmlyb25tZW50VmFyaWFibGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX1Byb2dyYW1Bcmd1bWVudHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAicHJvZ3JhbUFyZ3VtZW50cyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fV29ya2luZ0RpcmVjdG9yeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJ3b3JraW5nRGlyZWN0b3J5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fTWFpbkNsYXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIm1haW5DbGFzcyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6NiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX1ZtUGFyYW1ldGVycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJ2bVBhcmFtZXRlcnMiLAotCQkJICJncm91cCIsICIjZ3JvdXA6NiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX0NsYXNzcGF0aFJlZmVyZW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJjbGFzc3BhdGhSZWZlcmVuY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9EZWJ1Z1BvcnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiZGVidWdQb3J0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX0V4dGVybmFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImV4dGVybmFsIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjEwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1vZHVsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTW9kdWxlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNb2R1bGVfVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJ0eXBlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1vZHVsZV9QdWJsaXNoRGlyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInB1Ymxpc2hEaXIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TW9kdWxlX1B1Ymxpc2hlclJlZmVyZW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJwdWJsaXNoZXJSZWZlcmVuY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocG9ydEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUG9ydCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UG9ydF9ObygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJubyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQb3J0X05hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAibmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQb3J0X1Byb3RvY29sKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInByb3RvY29sIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2plY3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2plY3QiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2plY3RfQ2xhc3NwYXRoUmVmZXJlbmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImNsYXNzcGF0aFJlZmVyZW5jZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9wZXJ0eUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvcGVydHkiLAotCQkJICJraW5kIiwgImVtcHR5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb3BlcnR5X0NvbnRleHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJjb250ZXh0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb3BlcnR5X0RlZmF1bHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJkZWZhdWx0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb3BlcnR5X0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvcGVydHlfTGFiZWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJsYWJlbCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9wZXJ0eV9UeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidHlwZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwdWJsaXNoZXJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlB1Ymxpc2hlciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHVibGlzaGVyX0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDowIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFB1Ymxpc2hlcl9QdWJsaXNoZXJkYXRhKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInB1Ymxpc2hlcmRhdGEiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQdWJsaXNoZXJfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpZCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwdWJsaXNoZXJEYXRhRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQdWJsaXNoZXJEYXRhIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQdWJsaXNoZXJEYXRhX0RhdGFuYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImRhdGFuYW1lIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFB1Ymxpc2hlckRhdGFfRGF0YXZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImRhdGF2YWx1ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VydmVyUnVudGltZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiU2VydmVyUnVudGltZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmVyUnVudGltZV9Hcm91cCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX1Byb3BlcnR5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInByb3BlcnR5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmVyUnVudGltZV9Hcm91cDEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmVyUnVudGltZV9Qb3J0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInBvcnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6NCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX01vZHVsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJtb2R1bGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6NCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX1Byb2plY3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAicHJvamVjdCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX1N0YXJ0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInN0YXJ0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfU3RvcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJzdG9wIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfR3JvdXAzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDo5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfUHVibGlzaGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInB1Ymxpc2hlciIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfR3JvdXA0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJjbGFzc3BhdGgiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmVyUnVudGltZV9KbmRpQ29ubmVjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJqbmRpQ29ubmVjdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX05hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJuYW1lIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfVmVyc2lvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZlcnNpb24iCi0JCSAgIH0pOwotCX0KLQotfSAvL1NlcnZlclR5cGVQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGE4NmE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vdXRpbC9TZXJ2ZXJUeXBlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24udXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFNlcnZlclR5cGVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2ZXJUeXBlU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IFNlcnZlclR5cGVTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcmNoaXZlVHlwZShBcmNoaXZlVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXJjaGl2ZVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcmd1bWVudFBhaXIoQXJndW1lbnRQYWlyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcmd1bWVudFBhaXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDbGFzc3BhdGgoQ2xhc3NwYXRoIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDbGFzc3BhdGhBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNsdWRlVHlwZShFeGNsdWRlVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXhjbHVkZVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlcm5hbChFeHRlcm5hbCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZXJuYWxBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VGaWxlc2V0VHlwZShGaWxlc2V0VHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRmlsZXNldFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbmNsdWRlVHlwZShJbmNsdWRlVHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSW5jbHVkZVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKbmRpQ29ubmVjdGlvbihKbmRpQ29ubmVjdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSm5kaUNvbm5lY3Rpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMYXVuY2hDb25maWd1cmF0aW9uKExhdW5jaENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNb2R1bGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBvcnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9qZWN0KFByb2plY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2plY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9wZXJ0eShQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvcGVydHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQdWJsaXNoZXIoUHVibGlzaGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQdWJsaXNoZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQdWJsaXNoZXJEYXRhKFB1Ymxpc2hlckRhdGEgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVB1Ymxpc2hlckRhdGFBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2ZXJSdW50aW1lKFNlcnZlclJ1bnRpbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZlclJ1bnRpbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZSA8ZW0+QXJjaGl2ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJjaGl2ZVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyIDxlbT5Bcmd1bWVudCBQYWlyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFyZ3VtZW50UGFpckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGggPGVtPkNsYXNzcGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDbGFzc3BhdGhBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXhjbHVkZVR5cGUgPGVtPkV4Y2x1ZGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4Y2x1ZGVUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsIDxlbT5FeHRlcm5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVybmFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlIDxlbT5GaWxlc2V0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaWxlc2V0VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZSA8ZW0+SW5jbHVkZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSW5jbHVkZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5jbHVkZVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24gPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpuZGlDb25uZWN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24gPGVtPkxhdW5jaCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSA8ZW0+TW9kdWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0IDxlbT5Qb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb2plY3QgPGVtPlByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2plY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvcGVydHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyIDxlbT5QdWJsaXNoZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHVibGlzaGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEgPGVtPlB1Ymxpc2hlciBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQdWJsaXNoZXJEYXRhQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUgPGVtPlNlcnZlciBSdW50aW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2ZXJSdW50aW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1NlcnZlclR5cGVBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0OTliNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24udXRpbC5TZXJ2ZXJUeXBlUmVzb3VyY2VJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBTZXJ2ZXJUeXBlUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL1NlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1NjMyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24udXRpbC5TZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZVJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQotfSAvL1NlcnZlclR5cGVSZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vdXRpbC9TZXJ2ZXJUeXBlU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTkzM2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vdXRpbC9TZXJ2ZXJUeXBlU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFNlcnZlclR5cGVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQVJDSElWRV9UWVBFOiB7Ci0JCQkJQXJjaGl2ZVR5cGUgYXJjaGl2ZVR5cGUgPSAoQXJjaGl2ZVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFyY2hpdmVUeXBlKGFyY2hpdmVUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSR1VNRU5UX1BBSVI6IHsKLQkJCQlBcmd1bWVudFBhaXIgYXJndW1lbnRQYWlyID0gKEFyZ3VtZW50UGFpcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXJndW1lbnRQYWlyKGFyZ3VtZW50UGFpcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEg6IHsKLQkJCQlDbGFzc3BhdGggY2xhc3NwYXRoID0gKENsYXNzcGF0aCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2xhc3NwYXRoKGNsYXNzcGF0aCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWENMVURFX1RZUEU6IHsKLQkJCQlFeGNsdWRlVHlwZSBleGNsdWRlVHlwZSA9IChFeGNsdWRlVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXhjbHVkZVR5cGUoZXhjbHVkZVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUw6IHsKLQkJCQlFeHRlcm5hbCBleHRlcm5hbCA9IChFeHRlcm5hbCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZXJuYWwoZXh0ZXJuYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRklMRVNFVF9UWVBFOiB7Ci0JCQkJRmlsZXNldFR5cGUgZmlsZXNldFR5cGUgPSAoRmlsZXNldFR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUZpbGVzZXRUeXBlKGZpbGVzZXRUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLklOQ0xVREVfVFlQRTogewotCQkJCUluY2x1ZGVUeXBlIGluY2x1ZGVUeXBlID0gKEluY2x1ZGVUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbmNsdWRlVHlwZShpbmNsdWRlVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT046IHsKLQkJCQlKbmRpQ29ubmVjdGlvbiBqbmRpQ29ubmVjdGlvbiA9IChKbmRpQ29ubmVjdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSm5kaUNvbm5lY3Rpb24oam5kaUNvbm5lY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT046IHsKLQkJCQlMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZ3VyYXRpb24gPSAoTGF1bmNoQ29uZmlndXJhdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTGF1bmNoQ29uZmlndXJhdGlvbihsYXVuY2hDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRTogewotCQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNb2R1bGUobW9kdWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlQ6IHsKLQkJCQlQb3J0IHBvcnQgPSAoUG9ydCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUG9ydChwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST0pFQ1Q6IHsKLQkJCQlQcm9qZWN0IHByb2plY3QgPSAoUHJvamVjdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvamVjdChwcm9qZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZOiB7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb3BlcnR5KHByb3BlcnR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUjogewotCQkJCVB1Ymxpc2hlciBwdWJsaXNoZXIgPSAoUHVibGlzaGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQdWJsaXNoZXIocHVibGlzaGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9EQVRBOiB7Ci0JCQkJUHVibGlzaGVyRGF0YSBwdWJsaXNoZXJEYXRhID0gKFB1Ymxpc2hlckRhdGEpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVB1Ymxpc2hlckRhdGEocHVibGlzaGVyRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRTogewotCQkJCVNlcnZlclJ1bnRpbWUgc2VydmVyUnVudGltZSA9IChTZXJ2ZXJSdW50aW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2ZXJSdW50aW1lKHNlcnZlclJ1bnRpbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcmNoaXZlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJjaGl2ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcmNoaXZlVHlwZShBcmNoaXZlVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFyZ3VtZW50IFBhaXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJndW1lbnQgUGFpcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXJndW1lbnRQYWlyKEFyZ3VtZW50UGFpciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNsYXNzcGF0aDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DbGFzc3BhdGg8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNsYXNzcGF0aChDbGFzc3BhdGggb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGNsdWRlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhjbHVkZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNsdWRlVHlwZShFeGNsdWRlVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVybmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVybmFsPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlcm5hbChFeHRlcm5hbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbGVzZXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaWxlc2V0IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUZpbGVzZXRUeXBlKEZpbGVzZXRUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5jbHVkZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluY2x1ZGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSW5jbHVkZVR5cGUoSW5jbHVkZVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KbmRpIENvbm5lY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKbmRpQ29ubmVjdGlvbihKbmRpQ29ubmVjdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhdW5jaCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxhdW5jaCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMYXVuY2hDb25maWd1cmF0aW9uKExhdW5jaENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2plY3QoUHJvamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9wZXJ0eShQcm9wZXJ0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlB1Ymxpc2hlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QdWJsaXNoZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVB1Ymxpc2hlcihQdWJsaXNoZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QdWJsaXNoZXIgRGF0YTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QdWJsaXNoZXIgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHVibGlzaGVyRGF0YShQdWJsaXNoZXJEYXRhIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmVyIFJ1bnRpbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmVyIFJ1bnRpbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZlclJ1bnRpbWUoU2VydmVyUnVudGltZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vU2VydmVyVHlwZVN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVYTUxQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vdXRpbC9TZXJ2ZXJUeXBlWE1MUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGY4ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVYTUxQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkudXRpbC5YTUxQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVyIG1ldGhvZHMgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBYTUwgZG9jdW1lbnRzCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlWE1MUHJvY2Vzc29yIGV4dGVuZHMgWE1MUHJvY2Vzc29yIHsKLQkvKioKLQkgKiBQdWJsaWMgY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgdGhlIGhlbHBlci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZVhNTFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKSk7Ci0JCVNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgZm9yICIqIiBhbmQgInhtbCIgZmlsZSBleHRlbnNpb25zIHRoZSBTZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbCBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0UmVnaXN0cmF0aW9ucygpIHsKLQkJaWYgKHJlZ2lzdHJhdGlvbnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UmVnaXN0cmF0aW9ucygpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoWE1MX0VYVEVOU0lPTiwgbmV3IFNlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoU1RBUl9FWFRFTlNJT04sIG5ldyBTZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQkJfQotCQlyZXR1cm4gcmVnaXN0cmF0aW9uczsKLQl9Ci0KLX0gLy9TZXJ2ZXJUeXBlWE1MUHJvY2Vzc29yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwveG1sL1Jlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwveG1sL1Jlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNzFlMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3htbC9SZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuSUR5bmFtaWNWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLQotLyoqCi0gKiBVdGlsaXR5IHRvIHJlc29sdmUgc2VydmVyZGVmL3J1bnRpbWVkZWYgcHJvcGVydGllcyB3aXRoIHRoZSB1c2VyIHByb3ZpZGVkIGRhdGEuCi0gKiBSZXNvbHZlciBhbHNvIGxvb2tzIHRocm91Z2ggZWNsaXBzZSBwbGF0Zm9ybSBwcm92aWRlZCBkeW5hbWljIHZhcmlhYmxlcyB0byAKLSAqIHJlc29sdmUgYSBwcm9wZXJ0eS4gCi0gKgotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIFJlc29sdmVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TVEFSVDIgPSAiJXsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRU5EID0gIn0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU1RBUlQgPSAiJHsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBNYXAgZlByb3BlcnR5VmFsdWVzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIFNlcnZlclJ1bnRpbWUgc2VydmVyOwotCQotICAgIC8qKgotCSAqIEBwYXJhbSBydW50aW1lIAotCSAqLwotCXB1YmxpYyBSZXNvbHZlcihTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUpIHsKLQkJdGhpcy5zZXJ2ZXIgPSBydW50aW1lOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgcmVzb2x2ZWQgc3RyaW5nLgotICAgICAqIAotCSAqIEBwYXJhbSBwcm9wcGVkU3RyaW5nCi0JICogQHJldHVybiByZXNvbHZlZCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVQcm9wZXJ0aWVzKFN0cmluZyBwcm9wcGVkU3RyaW5nKSB7Ci0JCUhhc2hNYXAgY2FjaGUgPSBuZXcgSGFzaE1hcChnZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRyID0gZ2V0UHJvcGVydGllcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eSBlbGVtZW50ID0oUHJvcGVydHkpIGl0ci5uZXh0KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldERlZmF1bHQoKTsKLQkJCWlmKGZQcm9wZXJ0eVZhbHVlcyAhPSBudWxsICYmIGZQcm9wZXJ0eVZhbHVlcy5jb250YWluc0tleShlbGVtZW50LmdldElkKCkpKQotCQkJICAgIHZhbHVlPShTdHJpbmcpZlByb3BlcnR5VmFsdWVzLmdldChlbGVtZW50LmdldElkKCkpOwotCQkJaWYoUHJvcGVydHkuVFlQRV9ESVJFQ1RPUlkuZXF1YWxzKGVsZW1lbnQuZ2V0VHlwZSgpKSB8fCBQcm9wZXJ0eS5UWVBFX0ZJTEUuZXF1YWxzKGVsZW1lbnQuZ2V0VHlwZSgpKSkKLQkJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ1xcJywnLycpOwotCQkJIGNhY2hlLnB1dChlbGVtZW50LmdldElkKCksIHZhbHVlKTsKLQkJfQotCQljYWNoZS5wdXQoInBhdGhDaGFyIiwgRmlsZS5wYXRoU2VwYXJhdG9yKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyID0gcmVzb2x2ZVByb3BlcnRpZXNGcm9tQ2FjaGUocHJvcHBlZFN0cmluZywgY2FjaGUpOwotCQlzdHIgPSBmaXhQYXNzdGhyb3VnaFByb3BlcnRpZXMoc3RyKTsKLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMuc2VydmVyLmdldFByb3BlcnR5KCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZml4UGFzc3Rocm91Z2hQcm9wZXJ0aWVzKFN0cmluZyBzdHIpIHsKLQkJU3RyaW5nIHJlc29sdmVkU3RyaW5nID0gc3RyOwotCQlpZiAoaXNQYXNzUHJvcGVydHlMZWZ0KHJlc29sdmVkU3RyaW5nKSkgewotCQkJcmVzb2x2ZWRTdHJpbmcgPSBmaXhQYXJhbShyZXNvbHZlZFN0cmluZyk7Ci0JCQlyZXNvbHZlZFN0cmluZyA9IGZpeFBhc3N0aHJvdWdoUHJvcGVydGllcyhyZXNvbHZlZFN0cmluZyk7Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkU3RyaW5nOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVQcm9wZXJ0aWVzRnJvbUNhY2hlKAotCQlTdHJpbmcgcHJvcHBlZFN0cmluZywKLQkJSGFzaE1hcCBjYWNoZSkgewotCQlTdHJpbmcgcmVzb2x2ZWRTdHJpbmcgPSBwcm9wcGVkU3RyaW5nOwotCQlpbnQgc3RhcnQgPSBza2lwVG9Qcm9wZXJ0eShyZXNvbHZlZFN0cmluZywgY2FjaGUpOy8vIHNlZSBpZiB0aGVyZSBhcmUgcHJvcGVydGllcyB0byBiZSByZXNvbHZlZC4KLQkJaWYgKHN0YXJ0ID49IDApIHsKLQkJCXJlc29sdmVkU3RyaW5nID0gcmVzb2x2ZVByb3BlcnR5KHJlc29sdmVkU3RyaW5nLCBjYWNoZSk7Ci0JCQlyZXNvbHZlZFN0cmluZyA9IHJlc29sdmVQcm9wZXJ0aWVzRnJvbUNhY2hlKHJlc29sdmVkU3RyaW5nLCBjYWNoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkU3RyaW5nOwotCX0KLQotCXByaXZhdGUgaW50IHNraXBUb1Byb3BlcnR5KFN0cmluZyBzdHIsSGFzaE1hcCBjYWNoZSkgewotCQlpbnQgc3RhcnQgPSAtMTsgCi0JCWludCBlbmQgPSAgMDsKLQkJU3RyaW5nIGtleT0iIjsgLy8kTk9OLU5MUy0xJAotCQlkbyB7Ci0JCQlzdGFydCA9ICBzdHIuaW5kZXhPZihQUk9QX1NUQVJULGVuZCk7Ci0JCQlpZiggc3RhcnQgPCAwKQotCQkJCXJldHVybiBzdGFydDsKLQkJCWVuZCA9IHN0ci5pbmRleE9mKFBST1BfRU5ELCBzdGFydCk7Ci0JCQlrZXkgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0ICsgMiwgZW5kKTsKLQkJfQotCQl3aGlsZSggIWNhY2hlLmNvbnRhaW5zS2V5KCBrZXkgKSAmJiBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLmdldER5bmFtaWNWYXJpYWJsZSgga2V5ICkgPT0gbnVsbCApOwotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1Bhc3NQcm9wZXJ0eUxlZnQoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gc3RyLmluZGV4T2YoUFJPUF9TVEFSVDIpID49IDA7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVByb3BlcnR5KFN0cmluZyBwcm9wcGVkU3RyaW5nLCBIYXNoTWFwIGNhY2hlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKHByb3BwZWRTdHJpbmcpOwotCQlpbnQgc3RhcnQgPSBzdHIuaW5kZXhPZihQUk9QX1NUQVJUKTsKLQkJaW50IGVuZCA9IHN0ci5pbmRleE9mKFBST1BfRU5ELCBzdGFydCk7Ci0JCVN0cmluZyBrZXkgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0ICsgMiwgZW5kKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZyljYWNoZS5nZXQoa2V5KTsKLSAgICAgICAgaWYodmFsdWUgPT0gbnVsbCApey8vIGxvb2sgaW4gZWNsaXBzZSB2YXJpYWJsZXMKLSAgICAgICAgICAgIElEeW5hbWljVmFyaWFibGUgZHYgPSAgVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKS5nZXREeW5hbWljVmFyaWFibGUoIGtleSApOwotICAgICAgICAgICAgaWYgKGR2ICE9IG51bGwgKXsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGR2LmdldFZhbHVlKCBudWxsICk7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICl7Ci0gICAgICAgICAgICAgICAgICAgIENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZygKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG5vdCByZXNvbHZlIGVjbGlwc2UgdmFyaWFibGUiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJaWYodmFsdWUgPT0gbnVsbCApCi0JCQlyZXR1cm4gc3RyLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBzdHIucmVwbGFjZSggc3RhcnQsIGVuZCsxLCB2YWx1ZSApLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGZpeFBhcmFtKFN0cmluZyBwcm9wcGVkU3RyaW5nKSB7Ci0JCVN0cmluZyBzdHIgPSBwcm9wcGVkU3RyaW5nOwotCQlpbnQgc3RhcnQgPSBzdHIuaW5kZXhPZihQUk9QX1NUQVJUMik7Ci0JCXJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHN0YXJ0KQotCQkJKyBQUk9QX1NUQVJUCi0JCQkrIHN0ci5zdWJzdHJpbmcoc3RhcnQrMik7Ci0JfQotICAgIAotCS8qKgotICAgICAqIFNldCB0aGUgbmFtZSB2YWx1ZSBwYWlycyB0aGF0IHRoZSByZWNlaXZlciByZXNvbHZlciBpbnN0YW5jZQotICAgICAqIHVzZXMgdG8gcmVzb2x2ZSBzZXJ2ZXJkZWYvcnVudGltZWRlZiBwcm9wZXJ0aWVzLgotICAgICAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyBUaGUgZlByb3BlcnR5VmFsdWVzIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlcyhNYXAgcHJvcGVydHlWYWx1ZXMpIHsKLQkJZlByb3BlcnR5VmFsdWVzID0gcHJvcGVydHlWYWx1ZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3htbC9YTUxVdGlscy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3htbC9YTUxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGU4N2NhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC94bWwvWE1MVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnhtbDsKLQotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS51dGlsLkV4dGVuc2lvblBvaW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24udXRpbC5TZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXR5IGZvciBoYW5kbGluZyB0aGUgeG1sIGRhdGEgZnJvbSAuc2VydmVyZGVmIGFuZCAucnVudGltZWRlZiBmaWxlcy4KLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIFhNTFV0aWxzIHsKLQotCQotICAgIHByaXZhdGUgQXJyYXlMaXN0IHNlcnZlckRlZmluaXRpb25zOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IHJ1bnRpbWVEZWZpbml0aW9uczsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgWE1MVXRpbHMoKSB7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGFsbCB0aGUgc2VydmVyZGVmaW5pdGlvbiBhbmQgcnVudGltZWRlZmluaXRpb24gZXh0ZW5zaW9ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgc2VydmVyRGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBJRXh0ZW5zaW9uW10gc2VydmVyRGVmRXh0ZW5zaW9ucyA9IEV4dGVuc2lvblBvaW50VXRpbC5nZXRHZW5lcmljU2VydmVyRGVmaW5pdGlvbkV4dGVuc2lvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBzZXJ2ZXJEZWZFeHRlbnNpb25zICE9IG51bGwgJiYgaSA8IHNlcnZlckRlZkV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGphdmEubmV0LlVSSSBkZWZpbml0aW9uRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICBJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IHNlcnZlckRlZkV4dGVuc2lvbnNbaV07Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IEV4dGVuc2lvblBvaW50VXRpbC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbal07Ci0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbkZpbGUgPSBnZXREZWZpbml0aW9uRmlsZShlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUgPSByZWFkRmlsZShkZWZpbml0aW9uRmlsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBydW50aW1lLnNldElkKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBydW50aW1lLnNldENvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlKGVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEZWZpbml0aW9ucy5hZGQocnVudGltZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcnVudGltZURlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgSUV4dGVuc2lvbltdIHJ1bnRpbWVEZWZFeHRlbnNpb25zID0gRXh0ZW5zaW9uUG9pbnRVdGlsLmdldEdlbmVyaWNTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbkV4dGVuc2lvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBydW50aW1lRGVmRXh0ZW5zaW9ucyAhPSBudWxsICYmIGkgPCBydW50aW1lRGVmRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgamF2YS5uZXQuVVJJIGRlZmluaXRpb25GaWxlID0gbnVsbDsKLSAgICAgICAgICAgIElFeHRlbnNpb24gZXh0ZW5zaW9uID0gcnVudGltZURlZkV4dGVuc2lvbnNbaV07Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IEV4dGVuc2lvblBvaW50VXRpbC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbal07Ci0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbkZpbGUgPSBnZXREZWZpbml0aW9uRmlsZShlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUgPSByZWFkRmlsZShkZWZpbml0aW9uRmlsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBydW50aW1lLnNldElkKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBydW50aW1lLnNldENvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlKGVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICBydW50aW1lRGVmaW5pdGlvbnMuYWRkKHJ1bnRpbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgamF2YS5uZXQuVVJJIGdldERlZmluaXRpb25GaWxlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIAotICAgICAgICBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBTdHJpbmcgZGVmaW5pdGlvbkZpbGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVmaW5pdGlvbmZpbGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsIkxvYWRpbmcgc2VydmVyZGVmIGZpbGUgIitkZWZpbml0aW9uRmlsZSsiIGZyb20gYnVuZGxlICIrYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIAotICAgICAgICBVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KGRlZmluaXRpb25GaWxlKTsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKCBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELDEsCi0gICAgICAgICAgICAgICAgICAgICJEZWZpbml0aW9uIGZpbGUgIitkZWZpbml0aW9uRmlsZSsiIGNhbiBub3QgYmUgcmVzb2x2ZWQgaW4gYnVuZGxlICIrIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSAsbnVsbCkgKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCQl0cnkgewotCQkJamF2YS5uZXQuVVJJIHVyaSA9IG5ldyBqYXZhLm5ldC5VUkkodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksdXJsLmdldFBhdGgoKSwgdXJsLmdldFF1ZXJ5KCkpOwotCQkgICAgcmV0dXJuIHVyaTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCS8vaWdub3JlCi0JCX0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2ZXJSdW50aW1lIHJlYWRGaWxlKGphdmEubmV0LlVSSSBmaWxlKSB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIHJlc291cmNlIHNldC4KLSAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0KLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGRlZmF1bHQgcmVzb3VyY2UgZmFjdG9yeSAtLSBvbmx5IG5lZWRlZCBmb3IKLSAgICAgICAgLy8gc3RhbmQtYWxvbmUhCi0gICAgICAgIHJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkKLSAgICAgICAgICAgICAgICAucHV0KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VydmVyVHlwZVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0KLSAgICAgICAgIFNlcnZlclR5cGVQYWNrYWdlIGdzdFBhY2sgPSBTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuCi0gICAgICAgIFVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVVSSShmaWxlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIERlbWFuZCBsb2FkIHRoZSByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLgotICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKGZpbGVVUkksIHRydWUpOwotICAgICAgICB9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHN0aCB3cm9uZyB3aXRoIHRoaXMgLnNlcnZlciBmaWxlLgotICAgICAgICAgICAgQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBsb2FkaW5nIHRoZSBzZXJ2ZXIgdHlwZSBkZWZpbml0aW9uIiwgZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgU2VydmVyUnVudGltZSBkZWYgPSAoU2VydmVyUnVudGltZSkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAoZGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZWYuc2V0RmlsZW5hbWUoZmlsZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotCi0gICAgfQotCi0JLyoqCi0JICogQHJldHVybiA8Y29kZT5qYXZhLnV0aWwuTGlzdDwvY29kZT4gb2YgPGNvZGU+U2VydmVyUnVudGltZTwvY29kZT5zLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZlclR5cGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIHNlcnZlckRlZmluaXRpb25zOwotCX0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWVtb3J5IHByZXNlbnRhdGlvbiBmb3IgdGhlIC5zZXJ2ZXJkZWYgZmlsZQotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEByZXR1cm4gc2VydmVyUnVudGltZQotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2ZXJSdW50aW1lIGdldFNlcnZlclR5cGVEZWZpbml0aW9uKFN0cmluZyBpZCkgewotICAgIAlJdGVyYXRvciBkZWZzID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGlkICE9IG51bGwgJiYgZGVmcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFNlcnZlclJ1bnRpbWUgZWxlbSA9IChTZXJ2ZXJSdW50aW1lKSBkZWZzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICggZWxlbS5nZXRJZCgpLmVxdWFscyggaWQgKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiA8Y29kZT5qYXZhLnV0aWwuTGlzdDwvY29kZT4gb2YgPGNvZGU+U2VydmVyUnVudGltZTwvY29kZT5zLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldFJ1bnRpbWVUeXBlRGVmaW5pdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBydW50aW1lRGVmaW5pdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtZW1vcnkgcHJlc2VudGF0aW9uIGZvciB0aGUgLnJ1bnRpbWVkZWYgZmlsZQotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEByZXR1cm4gcnVudGltZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmVyUnVudGltZSBnZXRSdW50aW1lVHlwZURlZmluaXRpb24oU3RyaW5nIGlkKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGRlZnMgPSBnZXRSdW50aW1lVHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGRlZnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTZXJ2ZXJSdW50aW1lIGVsZW0gPSAoU2VydmVyUnVudGltZSkgZGVmcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIGVsZW0uZ2V0SWQoKS5lcXVhbHMoaWQpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0FyY2hpdmVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0FyY2hpdmVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOWFjYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9BcmNoaXZlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFyY2hpdmUgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlI2dldFBhdGggPGVtPlBhdGg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0QXJjaGl2ZVR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J2FyY2hpdmVfLl90eXBlJyBraW5kPSdlbXB0eSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJjaGl2ZVR5cGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXRoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhdGgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRBcmNoaXZlVHlwZV9QYXRoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncGF0aCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYXRoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlI2dldFBhdGggPGVtPlBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhdGgoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBcmNoaXZlVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Bcmd1bWVudFBhaXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vQXJndW1lbnRQYWlyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMmM5Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Bcmd1bWVudFBhaXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bcmd1bWVudCBQYWlyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRBcmd1bWVudFBhaXIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FyZ3VtZW50UGFpcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyZ3VtZW50UGFpciBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEFyZ3VtZW50UGFpcl9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSduYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRBcmd1bWVudFBhaXJfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3ZhbHVlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBcmd1bWVudFBhaXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vQ2xhc3NwYXRoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0NsYXNzcGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQ5MzFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vQ2xhc3NwYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNsYXNzcGF0aDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldEFyY2hpdmUgPGVtPkFyY2hpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldEZpbGVzZXQgPGVtPkZpbGVzZXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRDbGFzc3BhdGgoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NsYXNzcGF0aCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzcGF0aCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRDbGFzc3BhdGhfR3JvdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXJjaGl2ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXJjaGl2ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFyY2hpdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldENsYXNzcGF0aF9BcmNoaXZlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2FyY2hpdmUnIGdyb3VwPScjZ3JvdXA6MCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEFyY2hpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbGVzZXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZpbGVzZXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWxlc2V0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRDbGFzc3BhdGhfRmlsZXNldCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdmaWxlc2V0JyBncm91cD0nI2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRGaWxlc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0Q2xhc3NwYXRoX0lkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIENsYXNzcGF0aApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9FeGNsdWRlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9FeGNsdWRlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmYwMTQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vRXhjbHVkZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4Y2x1ZGUgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0RXhjbHVkZVR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J2V4Y2x1ZGVfLl90eXBlJyBraW5kPSdlbXB0eSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhjbHVkZVR5cGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRFeGNsdWRlVHlwZV9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbmFtZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFeGNsdWRlVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9FeHRlcm5hbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9FeHRlcm5hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2I5YTQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vRXh0ZXJuYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlcm5hbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbCNnZXRPcyA8ZW0+T3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0RXh0ZXJuYWwoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4dGVybmFsJyBraW5kPSdzaW1wbGUnIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVybmFsIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEV4dGVybmFsX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9JzowJyBraW5kPSdzaW1wbGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0RXh0ZXJuYWxfT3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdvcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbCNnZXRPcyA8ZW0+T3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3MoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBFeHRlcm5hbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9GaWxlc2V0VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9GaWxlc2V0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdhOTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vRmlsZXNldFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmlsZXNldCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2dldEluY2x1ZGUgPGVtPkluY2x1ZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUjZ2V0RXhjbHVkZSA8ZW0+RXhjbHVkZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZSNpc0Nhc2VzZW5zaXRpdmUgPGVtPkNhc2VzZW5zaXRpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUjZ2V0RGlyIDxlbT5EaXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0RmlsZXNldFR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J2ZpbGVzZXRfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmlsZXNldFR5cGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0RmlsZXNldFR5cGVfR3JvdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5jbHVkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSW5jbHVkZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5jbHVkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEZpbGVzZXRUeXBlX0luY2x1ZGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkluY2x1ZGVUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0naW5jbHVkZScgZ3JvdXA9JyNncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SW5jbHVkZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXhjbHVkZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEZpbGVzZXRUeXBlX0V4Y2x1ZGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4Y2x1ZGVUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nZXhjbHVkZScgZ3JvdXA9JyNncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXhjbHVkZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzZXNlbnNpdGl2ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzZXNlbnNpdGl2ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNlc2Vuc2l0aXZlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENhc2VzZW5zaXRpdmUoKQotCSAqIEBzZWUgI3Vuc2V0Q2FzZXNlbnNpdGl2ZSgpCi0JICogQHNlZSAjc2V0Q2FzZXNlbnNpdGl2ZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRGaWxlc2V0VHlwZV9DYXNlc2Vuc2l0aXZlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2Nhc2VzZW5zaXRpdmUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQ2FzZXNlbnNpdGl2ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5GaWxlc2V0VHlwZSNpc0Nhc2VzZW5zaXRpdmUgPGVtPkNhc2VzZW5zaXRpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2VzZW5zaXRpdmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q2FzZXNlbnNpdGl2ZSgpCi0JICogQHNlZSAjdW5zZXRDYXNlc2Vuc2l0aXZlKCkKLQkgKiBAc2VlICNpc0Nhc2VzZW5zaXRpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhc2VzZW5zaXRpdmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUjaXNDYXNlc2Vuc2l0aXZlIDxlbT5DYXNlc2Vuc2l0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENhc2VzZW5zaXRpdmUoKQotCSAqIEBzZWUgI2lzQ2FzZXNlbnNpdGl2ZSgpCi0JICogQHNlZSAjc2V0Q2FzZXNlbnNpdGl2ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q2FzZXNlbnNpdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkZpbGVzZXRUeXBlI2lzQ2FzZXNlbnNpdGl2ZSA8ZW0+Q2FzZXNlbnNpdGl2ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzZXNlbnNpdGl2ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q2FzZXNlbnNpdGl2ZSgpCi0JICogQHNlZSAjaXNDYXNlc2Vuc2l0aXZlKCkKLQkgKiBAc2VlICNzZXRDYXNlc2Vuc2l0aXZlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDYXNlc2Vuc2l0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERpcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEZpbGVzZXRUeXBlX0RpcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2RpciciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREaXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRmlsZXNldFR5cGUjZ2V0RGlyIDxlbT5EaXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGlyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREaXIoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBGaWxlc2V0VHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9JbmNsdWRlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9JbmNsdWRlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODIzZGYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vSW5jbHVkZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmNsdWRlIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEluY2x1ZGVUeXBlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdpbmNsdWRlXy5fdHlwZScga2luZD0nZW1wdHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluY2x1ZGVUeXBlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0SW5jbHVkZVR5cGVfTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J25hbWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5JbmNsdWRlVHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW5jbHVkZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vSm5kaUNvbm5lY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vSm5kaUNvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkYzZiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0puZGlDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkpuZGkgQ29ubmVjdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldFByb3ZpZGVyVXJsIDxlbT5Qcm92aWRlciBVcmw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldEpuZGlQcm9wZXJ0eSA8ZW0+Sm5kaSBQcm9wZXJ0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbiNnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkgPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEpuZGlDb25uZWN0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdqbmRpQ29ubmVjdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpuZGlDb25uZWN0aW9uIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvdmlkZXIgVXJsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm92aWRlciBVcmw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdmlkZXIgVXJsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm92aWRlclVybChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEpuZGlDb25uZWN0aW9uX1Byb3ZpZGVyVXJsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdwcm92aWRlclVybCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm92aWRlclVybCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbiNnZXRQcm92aWRlclVybCA8ZW0+UHJvdmlkZXIgVXJsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm92aWRlciBVcmw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb3ZpZGVyVXJsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm92aWRlclVybChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEpuZGlDb25uZWN0aW9uX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpuZGkgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KbmRpIFByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm5kaSBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0Sm5kaUNvbm5lY3Rpb25fSm5kaVByb3BlcnR5KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXIiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdqbmRpUHJvcGVydHknIGdyb3VwPScjZ3JvdXA6MSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEpuZGlQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRKbmRpQ29ubmVjdGlvbl9Jbml0aWFsQ29udGV4dEZhY3RvcnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2luaXRpYWxDb250ZXh0RmFjdG9yeSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0SW5pdGlhbENvbnRleHRGYWN0b3J5IDxlbT5Jbml0aWFsIENvbnRleHQgRmFjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSm5kaUNvbm5lY3Rpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vTGF1bmNoQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9MYXVuY2hDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZjYzY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9MYXVuY2hDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxhdW5jaCBDb25maWd1cmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRFbnZpcm9ubWVudFZhcmlhYmxlIDxlbT5FbnZpcm9ubWVudCBWYXJpYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0UHJvZ3JhbUFyZ3VtZW50cyA8ZW0+UHJvZ3JhbSBBcmd1bWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRXb3JraW5nRGlyZWN0b3J5IDxlbT5Xb3JraW5nIERpcmVjdG9yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldE1haW5DbGFzcyA8ZW0+TWFpbiBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0Vm1QYXJhbWV0ZXJzIDxlbT5WbSBQYXJhbWV0ZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0RGVidWdQb3J0IDxlbT5EZWJ1ZyBQb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRFeHRlcm5hbCA8ZW0+RXh0ZXJuYWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTGF1bmNoQ29uZmlndXJhdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExhdW5jaENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnZpcm9ubWVudCBWYXJpYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudmlyb25tZW50IFZhcmlhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52aXJvbm1lbnQgVmFyaWFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fRW52aXJvbm1lbnRWYXJpYWJsZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyIiBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nZW52aXJvbm1lbnRWYXJpYWJsZScgZ3JvdXA9JyNncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAxKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9ncmFtIEFyZ3VtZW50czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvZ3JhbSBBcmd1bWVudHM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9ncmFtIEFyZ3VtZW50czwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Qcm9ncmFtQXJndW1lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3Byb2dyYW1Bcmd1bWVudHMnIGdyb3VwPScjZ3JvdXA6MiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFByb2dyYW1Bcmd1bWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBjb25jYXRlbmF0ZWQgU3RyaW5nIG9mIGFsbCBQcm9ncmFtIEFyZ3VtZW50cwotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBnZXRQcm9ncmFtQXJndW1lbnRzQXNTdHJpbmcoKTsKLQkKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmtpbmcgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JraW5nIERpcmVjdG9yeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JraW5nIERpcmVjdG9yeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29ya2luZ0RpcmVjdG9yeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fV29ya2luZ0RpcmVjdG9yeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nd29ya2luZ0RpcmVjdG9yeSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXb3JraW5nRGlyZWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0V29ya2luZ0RpcmVjdG9yeSA8ZW0+V29ya2luZyBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JraW5nRGlyZWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JraW5nRGlyZWN0b3J5KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYWluIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYWluIENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1haW5DbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fTWFpbkNsYXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J21haW5DbGFzcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYWluQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRNYWluQ2xhc3MgPGVtPk1haW4gQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1haW5DbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFpbkNsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDo2JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZtIFBhcmFtZXRlcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZtIFBhcmFtZXRlcnM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WbSBQYXJhbWV0ZXJzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRMYXVuY2hDb25maWd1cmF0aW9uX1ZtUGFyYW1ldGVycygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSd2bVBhcmFtZXRlcnMnIGdyb3VwPScjZ3JvdXA6NiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFZtUGFyYW1ldGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbmNhdGVuYXRlZCBTdHJpbmcgb2YgYWxsIFZtIHBhcmFtZXRlcnMuCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldFZtUGFyYW1ldGVyc0FzU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzc3BhdGggUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsYXNzcGF0aFJlZmVyZW5jZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fQ2xhc3NwYXRoUmVmZXJlbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2NsYXNzcGF0aFJlZmVyZW5jZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRDbGFzc3BhdGhSZWZlcmVuY2UgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWJ1ZyBQb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWJ1ZyBQb3J0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlYnVnIFBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlYnVnUG9ydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fRGVidWdQb3J0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2RlYnVnUG9ydCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWJ1Z1BvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXREZWJ1Z1BvcnQgPGVtPkRlYnVnIFBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlYnVnIFBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlYnVnUG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVidWdQb3J0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWx9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXh0ZXJuYWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FeHRlcm5hbCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWwiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdleHRlcm5hbCcgZ3JvdXA9JyNncm91cDoxMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVybmFsKCk7Ci0KLX0gLy8gTGF1bmNoQ29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Nb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYjg1MzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Nb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFB1Ymxpc2hEaXIgPGVtPlB1Ymxpc2ggRGlyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSNnZXRQdWJsaXNoZXJSZWZlcmVuY2UgPGVtPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TW9kdWxlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNb2R1bGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2R1bGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRNb2R1bGVfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ndHlwZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdWJsaXNoIERpcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHVibGlzaCBEaXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGlzaCBEaXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1Ymxpc2hEaXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRNb2R1bGVfUHVibGlzaERpcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ncHVibGlzaERpciciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdWJsaXNoRGlyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSNnZXRQdWJsaXNoRGlyIDxlbT5QdWJsaXNoIERpcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGlzaCBEaXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1Ymxpc2hEaXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1Ymxpc2hEaXIoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGlzaGVyIFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVibGlzaGVyUmVmZXJlbmNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TW9kdWxlX1B1Ymxpc2hlclJlZmVyZW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ncHVibGlzaGVyUmVmZXJlbmNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1Ymxpc2hlclJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0UHVibGlzaGVyUmVmZXJlbmNlIDxlbT5QdWJsaXNoZXIgUmVmZXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaXNoZXIgUmVmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdWJsaXNoZXJSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1Ymxpc2hlclJlZmVyZW5jZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1vZHVsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Qb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyNmI5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1BvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0Tm8gPGVtPk5vPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0I2dldFByb3RvY29sIDxlbT5Qcm90b2NvbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQb3J0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQb3J0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9ydCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5ObzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5ObzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm8oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQb3J0X05vKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdubyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRObygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0I2dldE5vIDxlbT5ObzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRObyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UG9ydF9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSduYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm90b2NvbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvdG9jb2w8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdG9jb2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb3RvY29sKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UG9ydF9Qcm90b2NvbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ncHJvdG9jb2wnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvdG9jb2woKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydCNnZXRQcm90b2NvbCA8ZW0+UHJvdG9jb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb3RvY29sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcm90b2NvbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvdG9jb2woU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQb3J0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1Byb2plY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTJkYzBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2plY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0I2dldENsYXNzcGF0aFJlZmVyZW5jZSA8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQcm9qZWN0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9qZWN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvamVjdF9DbGFzc3BhdGhSZWZlcmVuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2NsYXNzcGF0aFJlZmVyZW5jZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvamVjdCNnZXRDbGFzc3BhdGhSZWZlcmVuY2UgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJvamVjdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Qcm9wZXJ0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDAwYWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRDb250ZXh0IDxlbT5Db250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFByb3BlcnR5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9wZXJ0eScga2luZD0nZW1wdHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5IGV4dGVuZHMgRU9iamVjdHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX1JVTlRJTUUgPSAicnVudGltZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9TRVJWRVIgPSAic2VydmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0ZJTEU9ImZpbGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRElSRUNUT1JZPSJkaXJlY3RvcnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQk9PTEVBTj0iYm9vbGVhbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9URVhUPSJzdHJpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0VMRUNUPSJzZWxlY3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0VMRUNUX0VESVQ9ImNvbWJvIjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRleHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udGV4dChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFByb3BlcnR5X0NvbnRleHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjb250ZXh0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbnRleHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0Q29udGV4dCA8ZW0+Q29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGV4dChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvcGVydHlfRGVmYXVsdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2RlZmF1bHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXREZWZhdWx0IDxlbT5EZWZhdWx0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvcGVydHlfSWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhYmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYWJlbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYWJlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFiZWwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQcm9wZXJ0eV9MYWJlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2xhYmVsJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExhYmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFiZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYWJlbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvcGVydHlfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3R5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJvcGVydHkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHVibGlzaGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1B1Ymxpc2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODAyNWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHVibGlzaGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIjZ2V0UHVibGlzaGVyZGF0YSA8ZW0+UHVibGlzaGVyZGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFB1Ymxpc2hlcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHVibGlzaGVyJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHVibGlzaGVyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFB1Ymxpc2hlcl9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdWJsaXNoZXJkYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlB1Ymxpc2hlcmRhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaXNoZXJkYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQdWJsaXNoZXJfUHVibGlzaGVyZGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdwdWJsaXNoZXJkYXRhJyBncm91cD0nI2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQdWJsaXNoZXJkYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHVibGlzaGVyX0lkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFB1Ymxpc2hlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9QdWJsaXNoZXJEYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1B1Ymxpc2hlckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmZjMyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1B1Ymxpc2hlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4KLSAqIENvbnRyaWJ1dG9yczogTmFjaSBEYWkKLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QdWJsaXNoZXIgRGF0YTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEjZ2V0RGF0YW5hbWUgPGVtPkRhdGFuYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEjZ2V0RGF0YXZhbHVlIDxlbT5EYXRhdmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHVibGlzaGVyRGF0YSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHVibGlzaGVyRGF0YScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFB1Ymxpc2hlckRhdGEgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXRhbmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YW5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YW5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERhdGFuYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHVibGlzaGVyRGF0YV9EYXRhbmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nZGF0YW5hbWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGF0YW5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSNnZXREYXRhbmFtZSA8ZW0+RGF0YW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGFuYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXRhbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGF0YW5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGF2YWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YXZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGF2YWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGF0YXZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHVibGlzaGVyRGF0YV9EYXRhdmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2RhdGF2YWx1ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREYXRhdmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSNnZXREYXRhdmFsdWUgPGVtPkRhdGF2YWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YXZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXRhdmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERhdGF2YWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFB1Ymxpc2hlckRhdGEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vU2VydmVyUnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9TZXJ2ZXJSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTdlZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9TZXJ2ZXJSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbgotICogQ29udHJpYnV0b3JzOiBOYWNpIERhaQotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWwuUmVzb2x2ZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZlciBSdW50aW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogCi0gKiAJCQkJR2VuZXJpYyBTZXJ2ZXIgVHlwZSBEZWZpbml0aW9uLiBJdCBtdXN0IGhhdmUgYSBsaXN0IG9mCi0gKiAJCQkJcHJvcGVydGllcy4KLSAqIAkJCQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFBvcnQgPGVtPlBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldE1vZHVsZSA8ZW0+TW9kdWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFN0b3AgPGVtPlN0b3A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFB1Ymxpc2hlciA8ZW0+UHVibGlzaGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXA0IDxlbT5Hcm91cDQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRDbGFzc3BhdGggPGVtPkNsYXNzcGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEpuZGlDb25uZWN0aW9uIDxlbT5KbmRpIENvbm5lY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTZXJ2ZXJSdW50aW1lJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmVyUnVudGltZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX1Byb3BlcnR5KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3Byb3BlcnR5JyBncm91cD0nI2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfR3JvdXAxKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX1BvcnQoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdwb3J0JyBncm91cD0nI2dyb3VwOjInIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0U2VydmVyUnVudGltZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDo0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZHVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1vZHVsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0U2VydmVyUnVudGltZV9Nb2R1bGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdtb2R1bGUnIGdyb3VwPScjZ3JvdXA6NCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1vZHVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvamVjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvamVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0KFByb2plY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfUHJvamVjdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ncHJvamVjdCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFByb2plY3QgPGVtPlByb2plY3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2plY3QoUHJvamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFN0YXJ0KExhdW5jaENvbmZpZ3VyYXRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfU3RhcnQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3N0YXJ0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChMYXVuY2hDb25maWd1cmF0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0b3A8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RvcDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RvcChMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX1N0b3AoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3N0b3AnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMYXVuY2hDb25maWd1cmF0aW9uIGdldFN0b3AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRTdG9wIDxlbT5TdG9wPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdG9wKExhdW5jaENvbmZpZ3VyYXRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfR3JvdXAzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6OSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdWJsaXNoZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QdWJsaXNoZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaXNoZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfUHVibGlzaGVyKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdwdWJsaXNoZXInIGdyb3VwPScjZ3JvdXA6OSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFB1Ymxpc2hlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfR3JvdXA0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MTEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3NwYXRoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGh9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3NwYXRoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3NwYXRoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2NsYXNzcGF0aCcgZ3JvdXA9JyNncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENsYXNzcGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm5kaSBDb25uZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KbmRpIENvbm5lY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRKbmRpQ29ubmVjdGlvbihKbmRpQ29ubmVjdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0U2VydmVyUnVudGltZV9KbmRpQ29ubmVjdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nam5kaUNvbm5lY3Rpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlKbmRpQ29ubmVjdGlvbiBnZXRKbmRpQ29ubmVjdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEpuZGlDb25uZWN0aW9uIDxlbT5KbmRpIENvbm5lY3Rpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Sm5kaUNvbm5lY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEpuZGlDb25uZWN0aW9uKEpuZGlDb25uZWN0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSduYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX1ZlcnNpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2ZXJzaW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgJzxlbT5Nb2R1bGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEByZXR1cm4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCU1vZHVsZSBnZXRNb2R1bGUoU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogQHBhcmFtIGNwUmVmIHRoZSByZWZlcmVuY2UgaWQgb2YgdGhlICc8ZW0+Q2xhc3NwYXRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlDbGFzc3BhdGggZ2V0Q2xhc3NwYXRoKFN0cmluZyBjcFJlZik7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgICAqLwotICAgIFN0cmluZyBnZXRJZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAgICogQHBhcmFtIGlkCi0gICAgICovCi0gICAgdm9pZCBzZXRJZChTdHJpbmcgaWQpOwotICAgIAotICAgIAotICAgIAotICAgIAotCS8qKgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JU3RyaW5nIGdldEZpbGVuYW1lKCk7Ci0KLSAgICAKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIE5PVAotICovCi0Jdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZm4pOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQl2b2lkIHNldFByb3BlcnR5VmFsdWVzKE1hcCBwcm9wZXJ0aWVzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JUmVzb2x2ZXIgZ2V0UmVzb2x2ZXIoKTsKLQkKLSAgICAvKioKLSAgICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgICAqLwotICAgIFN0cmluZyBnZXRDb25maWd1cmF0aW9uRWxlbWVudE5hbWVzcGFjZSgpOwotICAgIC8qKgotICAgICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSk7Ci0JLyoqCi0JICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgJzxlbT5QdWJsaXNoZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEByZXR1cm4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCVB1Ymxpc2hlciBnZXRQdWJsaXNoZXIoU3RyaW5nIGlkKTsKLX0gLy8gU2VydmVyUnVudGltZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9TZXJ2ZXJUeXBlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9TZXJ2ZXJUeXBlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWJlOTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vU2VydmVyVHlwZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuCi0gKiBDb250cmlidXRvcnM6IE5hY2kgRGFpCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmVyVHlwZUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXJ2ZXJUeXBlRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZUZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJjaGl2ZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcmNoaXZlIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFyY2hpdmVUeXBlIGNyZWF0ZUFyY2hpdmVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFyZ3VtZW50IFBhaXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFyZ3VtZW50IFBhaXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFyZ3VtZW50UGFpciBjcmVhdGVBcmd1bWVudFBhaXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2xhc3NwYXRoPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DbGFzc3BhdGg8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNsYXNzcGF0aCBjcmVhdGVDbGFzc3BhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXhjbHVkZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGNsdWRlIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4Y2x1ZGVUeXBlIGNyZWF0ZUV4Y2x1ZGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVybmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlcm5hbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZXJuYWwgY3JlYXRlRXh0ZXJuYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmlsZXNldCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GaWxlc2V0IFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZpbGVzZXRUeXBlIGNyZWF0ZUZpbGVzZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluY2x1ZGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5jbHVkZSBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbmNsdWRlVHlwZSBjcmVhdGVJbmNsdWRlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5KbmRpIENvbm5lY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSm5kaUNvbm5lY3Rpb24gY3JlYXRlSm5kaUNvbm5lY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TGF1bmNoIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxhdW5jaCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMYXVuY2hDb25maWd1cmF0aW9uIGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TW9kdWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZHVsZSBjcmVhdGVNb2R1bGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9ydCBjcmVhdGVQb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2plY3QgY3JlYXRlUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb3BlcnR5IGNyZWF0ZVByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlB1Ymxpc2hlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHVibGlzaGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQdWJsaXNoZXIgY3JlYXRlUHVibGlzaGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlB1Ymxpc2hlciBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QdWJsaXNoZXIgRGF0YTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHVibGlzaGVyRGF0YSBjcmVhdGVQdWJsaXNoZXJEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZlciBSdW50aW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2ZXIgUnVudGltZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VydmVyUnVudGltZSBjcmVhdGVTZXJ2ZXJSdW50aW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlcnZlclR5cGVQYWNrYWdlIGdldFNlcnZlclR5cGVQYWNrYWdlKCk7Ci0KLX0gLy9TZXJ2ZXJUeXBlRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjQyZGJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNjaGVtYQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JeG1sbnM6anN0PSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIj4KLQotCi0KLQk8Y29tcGxleFR5cGUgbmFtZT0iU2VydmVyUnVudGltZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+Ci0JCQkJR2VuZXJpYyBTZXJ2ZXIgVHlwZSBEZWZpbml0aW9uLiBJdCBtdXN0IGhhdmUgYSBsaXN0IG9mCi0JCQkJcHJvcGVydGllcy4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCi0JCTxzZXF1ZW5jZSBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSI+Ci0JCQk8c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9ImpzdDpQcm9wZXJ0eSIgLz4KLQkJCTwvc2VxdWVuY2U+Ci0KLQkJCTxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQk8ZWxlbWVudCBuYW1lPSJwb3J0IiB0eXBlPSJqc3Q6UG9ydCIgLz4KLQkJCTwvc2VxdWVuY2U+Ci0KLQkJCTxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIxIj4KLQkJCQk8ZWxlbWVudCBuYW1lPSJtb2R1bGUiIHR5cGU9ImpzdDpNb2R1bGUiIC8+Ci0JCQk8L3NlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0icHJvamVjdCIgdHlwZT0ianN0OlByb2plY3QiIC8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJzdGFydCIgdHlwZT0ianN0OkxhdW5jaENvbmZpZ3VyYXRpb24iIC8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJzdG9wIiB0eXBlPSJqc3Q6TGF1bmNoQ29uZmlndXJhdGlvbiIgLz4KLQotCQkJPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCTxlbGVtZW50IG5hbWU9InB1Ymxpc2hlciIgdHlwZT0ianN0OlB1Ymxpc2hlciIgLz4KLQkJCTwvc2VxdWVuY2U+Ci0KLQkJCTxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIxIj4KLQkJCQk8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9ImpzdDpDbGFzc3BhdGgiIC8+Ci0JCQk8L3NlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0iam5kaUNvbm5lY3Rpb24iIHR5cGU9ImpzdDpqbmRpQ29ubmVjdGlvbiIgLz4KLQkJPC9zZXF1ZW5jZT4KLQotCQk8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIC8+Ci0JPC9jb21wbGV4VHlwZT4KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJQcm9wZXJ0eSI+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiAvPgotCQk8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJjb250ZXh0IiB0eXBlPSJzdHJpbmciIC8+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0ic3RyaW5nIiAvPgotCTwvY29tcGxleFR5cGU+Ci0KLQk8Y29tcGxleFR5cGUgbmFtZT0iTW9kdWxlIj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPGVsZW1lbnQgbmFtZT0icHVibGlzaERpciIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPGVsZW1lbnQgbmFtZT0icHVibGlzaGVyUmVmZXJlbmNlIiB0eXBlPSJzdHJpbmciIC8+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJMYXVuY2hDb25maWd1cmF0aW9uIj4KLQkJPHNlcXVlbmNlPgotCQkJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCTxlbGVtZW50IG5hbWU9ImVudmlyb25tZW50VmFyaWFibGUiCi0JCQkJCXR5cGU9ImpzdDpBcmd1bWVudFBhaXIiPgotCQkJCTwvZWxlbWVudD4KLQkJCTwvc2VxdWVuY2U+Ci0JCQk8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJPGVsZW1lbnQgbmFtZT0icHJvZ3JhbUFyZ3VtZW50cyIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPC9zZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG5hbWU9IndvcmtpbmdEaXJlY3RvcnkiIHR5cGU9InN0cmluZyIgLz4KLQkJCTxjaG9pY2U+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJtYWluQ2xhc3MiIHR5cGU9InN0cmluZyIgLz4KLQkJCQkJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0idm1QYXJhbWV0ZXJzIiB0eXBlPSJzdHJpbmciIC8+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aFJlZmVyZW5jZSIgdHlwZT0ic3RyaW5nIiAvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJkZWJ1Z1BvcnQiIHR5cGU9InN0cmluZyIgLz4KLQkJCQkJPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjEiPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwiIHR5cGU9ImpzdDpFeHRlcm5hbCI+PC9lbGVtZW50PgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2Nob2ljZT4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCi0JPGNvbXBsZXhUeXBlIG5hbWU9IlBvcnQiPgotCQk8c2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBuYW1lPSJubyIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPGVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPGVsZW1lbnQgbmFtZT0icHJvdG9jb2wiIHR5cGU9InN0cmluZyIgLz4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCi0JPGNvbXBsZXhUeXBlIG5hbWU9IkNsYXNzcGF0aCI+Ci0JCTxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIxIj4KLQkJCTxjaG9pY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iYXJjaGl2ZSI+Ci0JCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCTxhdHRyaWJ1dGUgbmFtZT0icGF0aCIgdHlwZT0ic3RyaW5nIiAvPgotCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCTwvZWxlbWVudD4KLQkJCQk8ZWxlbWVudCBuYW1lPSJmaWxlc2V0Ij4KLQkJCQkJPGNvbXBsZXhUeXBlPgotCQkJCQkJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCi0JCQkJCQkJPGNob2ljZT4KLQkJCQkJCQkJPGVsZW1lbnQgbmFtZT0iaW5jbHVkZSI+Ci0JCQkJCQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCQkJCQkJPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIgotCQkJCQkJCQkJCQl0eXBlPSJzdHJpbmciPgotCQkJCQkJCQkJCTwvYXR0cmlidXRlPgotCQkJCQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQkJCQkJPC9lbGVtZW50PgotCQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJleGNsdWRlIj4KLQkJCQkJCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJCQkJCQk8YXR0cmlidXRlIG5hbWU9Im5hbWUiCi0JCQkJCQkJCQkJCXR5cGU9InN0cmluZyI+Ci0JCQkJCQkJCQkJPC9hdHRyaWJ1dGU+Ci0JCQkJCQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCQkJPC9jaG9pY2U+Ci0JCQkJCQk8L3NlcXVlbmNlPgotCQkJCQkJPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9InN0cmluZyI+PC9hdHRyaWJ1dGU+Ci0JCQkJCQk8YXR0cmlidXRlIG5hbWU9ImNhc2VzZW5zaXRpdmUiCi0JCQkJCQkJdHlwZT0iYm9vbGVhbiI+Ci0JCQkJCQk8L2F0dHJpYnV0ZT4KLQkJCQkJPC9jb21wbGV4VHlwZT4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQk8L2Nob2ljZT4KLQkJPC9zZXF1ZW5jZT4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiAvPgotCTwvY29tcGxleFR5cGU+Ci0KLQk8Y29tcGxleFR5cGUgbmFtZT0iUHVibGlzaGVyIj4KLQkJPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjEiPgotCQkJPGVsZW1lbnQgbmFtZT0icHVibGlzaGVyZGF0YSIgdHlwZT0ianN0OlB1Ymxpc2hlckRhdGEiPgotCQkJPC9lbGVtZW50PgotCQk8L3NlcXVlbmNlPgotCQk8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIC8+Ci0JPC9jb21wbGV4VHlwZT4KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJQcm9qZWN0Ij4KLQkJPHNlcXVlbmNlIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIj4KLQkJCTxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aFJlZmVyZW5jZSIgdHlwZT0ic3RyaW5nIiAvPgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0KLQk8Y29tcGxleFR5cGUgbmFtZT0iUHVibGlzaGVyRGF0YSI+Ci0JCTxzZXF1ZW5jZSBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSI+Ci0JCQk8ZWxlbWVudCBuYW1lPSJkYXRhbmFtZSIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPGVsZW1lbnQgbmFtZT0iZGF0YXZhbHVlIiB0eXBlPSJzdHJpbmciIC8+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iam5kaUNvbm5lY3Rpb24iPgotCQk8c2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBuYW1lPSJwcm92aWRlclVybCIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCTxlbGVtZW50IG5hbWU9ImpuZGlQcm9wZXJ0eSIgdHlwZT0ianN0OkFyZ3VtZW50UGFpciIgLz4KLQkJCTwvc2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBuYW1lPSJpbml0aWFsQ29udGV4dEZhY3RvcnkiIHR5cGU9InN0cmluZyIgLz4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCi0JPGNvbXBsZXhUeXBlIG5hbWU9IkFyZ3VtZW50UGFpciI+Ci0JCTxhbGwgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiPgotCQkJPGVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiAvPgotCQkJPGVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgLz4KLQkJPC9hbGw+Ci0JPC9jb21wbGV4VHlwZT4KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJFeHRlcm5hbCI+Ci0JCTxzaW1wbGVDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJzdHJpbmciPgotCQkJCTxhdHRyaWJ1dGUgbmFtZT0ib3MiIHR5cGU9InN0cmluZyI+PC9hdHRyaWJ1dGU+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9zaW1wbGVDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2Qvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM2YTU0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDU3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJkZWZpbml0aW9uIgotICAgIG5zVVJJPSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIiBuc1ByZWZpeD0iZGVmaW5pdGlvbiI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJjaGl2ZVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYXJjaGl2ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhdGgiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icGF0aCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcmd1bWVudFBhaXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXJndW1lbnRQYWlyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YWx1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDbGFzc3BhdGgiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2xhc3NwYXRoIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXJjaGl2ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9BcmNoaXZlVHlwZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJhcmNoaXZlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWxlc2V0IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0ZpbGVzZXRUeXBlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImZpbGVzZXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4Y2x1ZGVUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImV4Y2x1ZGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbXB0eSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Im5hbWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZXJuYWwiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWwiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IjowIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJvcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGaWxlc2V0VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJmaWxlc2V0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY2x1ZGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSW5jbHVkZVR5cGUiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaW5jbHVkZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhjbHVkZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeGNsdWRlVHlwZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJleGNsdWRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNlc2Vuc2l0aXZlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjYXNlc2Vuc2l0aXZlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpciIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJkaXIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW5jbHVkZVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaW5jbHVkZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKbmRpQ29ubmVjdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJqbmRpQ29ubmVjdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvdmlkZXJVcmwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InByb3ZpZGVyVXJsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqbmRpUHJvcGVydHkiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXJndW1lbnRQYWlyIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImpuZGlQcm9wZXJ0eSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5pdGlhbENvbnRleHRGYWN0b3J5IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpbml0aWFsQ29udGV4dEZhY3RvcnkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGF1bmNoQ29uZmlndXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXVuY2hDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW52aXJvbm1lbnRWYXJpYWJsZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Bcmd1bWVudFBhaXIiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZW52aXJvbm1lbnRWYXJpYWJsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAxIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9ncmFtQXJndW1lbnRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJvZ3JhbUFyZ3VtZW50cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya2luZ0RpcmVjdG9yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0id29ya2luZ0RpcmVjdG9yeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYWluQ2xhc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Im1haW5DbGFzcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDo2Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZtUGFyYW1ldGVycyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZtUGFyYW1ldGVycyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NwYXRoUmVmZXJlbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjbGFzc3BhdGhSZWZlcmVuY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVidWdQb3J0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJkZWJ1Z1BvcnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MTAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWwiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZXJuYWwiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZXh0ZXJuYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNb2R1bGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW9kdWxlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ0eXBlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1Ymxpc2hEaXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InB1Ymxpc2hEaXIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVibGlzaGVyUmVmZXJlbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwdWJsaXNoZXJSZWZlcmVuY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9ydCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQb3J0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJubyIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibm8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm90b2NvbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJvdG9jb2wiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbGFzc3BhdGhSZWZlcmVuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImNsYXNzcGF0aFJlZmVyZW5jZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9wZXJ0eSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29udGV4dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjb250ZXh0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZGVmYXVsdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYWJlbCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJsYWJlbCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InR5cGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHVibGlzaGVyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlB1Ymxpc2hlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InB1Ymxpc2hlcmRhdGEiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHVibGlzaGVyRGF0YSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICAgICAgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwdWJsaXNoZXJkYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQdWJsaXNoZXJEYXRhIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlB1Ymxpc2hlckRhdGEiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRhdGFuYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJkYXRhbmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXRhdmFsdWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImRhdGF2YWx1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXJ2ZXJSdW50aW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTtHZW5lcmljIFNlcnZlciBUeXBlIERlZmluaXRpb24uIEl0IG11c3QgaGF2ZSBhIGxpc3Qgb2YmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTtwcm9wZXJ0aWVzLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNlcnZlclJ1bnRpbWUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9wZXJ0eSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9wZXJ0eSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwcm9wZXJ0eSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAxIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3J0IiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvcnQiCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icG9ydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6NCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTW9kdWxlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Im1vZHVsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvamVjdCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2plY3QiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJvamVjdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdGFydCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0xhdW5jaENvbmZpZ3VyYXRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic3RhcnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3RvcCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0xhdW5jaENvbmZpZ3VyYXRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic3RvcCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDo5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InB1Ymxpc2hlciIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QdWJsaXNoZXIiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHVibGlzaGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6OSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjbGFzc3BhdGgiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2xhc3NwYXRoIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImNsYXNzcGF0aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImpuZGlDb25uZWN0aW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vSm5kaUNvbm5lY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iam5kaUNvbm5lY3Rpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmVyc2lvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9zZXJ2ZXJ0eXBlLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2Qvc2VydmVydHlwZS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5ZjJkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9zZXJ2ZXJ0eXBlLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL0FhYS9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiIG1vZGVsTmFtZT0iU2VydmVyVHlwZSIgbW9kZWxQbHVnaW5DbGFzcz0iIgotICAgIHRlc3RTdWl0ZUNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLnRlc3RzLlNlcnZlcnR5cGVBbGxUZXN0cyIKLSAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS54c2QuZWNvcmUuaW1wb3J0ZXIiPgotICA8Zm9yZWlnbk1vZGVsPi4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iU2VydmVyVHlwZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlIgotICAgICAgcmVzb3VyY2U9IlhNTCIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIgZWNvcmVQYWNrYWdlPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNlcnZlcnR5cGUuZWNvcmUjLy9BcmNoaXZlVHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0FyY2hpdmVUeXBlL3BhdGgiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic2VydmVydHlwZS5lY29yZSMvL0FyZ3VtZW50UGFpciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0FyZ3VtZW50UGFpci9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0FyZ3VtZW50UGFpci92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vQ2xhc3NwYXRoIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0NsYXNzcGF0aC9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vQ2xhc3NwYXRoL2FyY2hpdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc2VydmVydHlwZS5lY29yZSMvL0NsYXNzcGF0aC9maWxlc2V0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0NsYXNzcGF0aC9pZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vRXhjbHVkZVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9FeGNsdWRlVHlwZS9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNlcnZlcnR5cGUuZWNvcmUjLy9FeHRlcm5hbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0V4dGVybmFsL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0V4dGVybmFsL29zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNlcnZlcnR5cGUuZWNvcmUjLy9GaWxlc2V0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9GaWxlc2V0VHlwZS9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vRmlsZXNldFR5cGUvaW5jbHVkZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vRmlsZXNldFR5cGUvZXhjbHVkZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9GaWxlc2V0VHlwZS9jYXNlc2Vuc2l0aXZlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0ZpbGVzZXRUeXBlL2RpciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vSW5jbHVkZVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9JbmNsdWRlVHlwZS9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNlcnZlcnR5cGUuZWNvcmUjLy9KbmRpQ29ubmVjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0puZGlDb25uZWN0aW9uL3Byb3ZpZGVyVXJsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9KbmRpQ29ubmVjdGlvbi9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vSm5kaUNvbm5lY3Rpb24vam5kaVByb3BlcnR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0puZGlDb25uZWN0aW9uL2luaXRpYWxDb250ZXh0RmFjdG9yeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2dyb3VwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2Vudmlyb25tZW50VmFyaWFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vcHJvZ3JhbUFyZ3VtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL3dvcmtpbmdEaXJlY3RvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9tYWluQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vdm1QYXJhbWV0ZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vY2xhc3NwYXRoUmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vZGVidWdQb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9leHRlcm5hbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlL3B1Ymxpc2hEaXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlL3B1Ymxpc2hlclJlZmVyZW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUG9ydCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL1BvcnQvbm8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUG9ydC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL1BvcnQvcHJvdG9jb2wiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic2VydmVydHlwZS5lY29yZSMvL1Byb2plY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9qZWN0L2NsYXNzcGF0aFJlZmVyZW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS9jb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL1Byb3BlcnR5L2RlZmF1bHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvcGVydHkvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvcGVydHkvbGFiZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvcGVydHkvdHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hlci9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyL3B1Ymxpc2hlcmRhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyL2lkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNlcnZlcnR5cGUuZWNvcmUjLy9QdWJsaXNoZXJEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyRGF0YS9kYXRhbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9QdWJsaXNoZXJEYXRhL2RhdGF2YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL3Byb3BlcnR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwMSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9wb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9tb2R1bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvcHJvamVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9zdG9wIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9wdWJsaXNoZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvZ3JvdXA0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2NsYXNzcGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9qbmRpQ29ubmVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS92ZXJzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL3NlcnZlcnR5cGUueHNkMmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2Qvc2VydmVydHlwZS54c2QyZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OWUyMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2Qvc2VydmVydHlwZS54c2QyZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KLTx4c2QyZWNvcmU6WFNEMkVjb3JlTWFwcGluZ1Jvb3QgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzZDJlY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9YU0QyRWNvcmUiIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvIgotICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLyIgdG9wVG9Cb3R0b209InRydWUiPgotICA8bmVzdGVkIGlucHV0cz0iYnVuZGxlZW50cnk6Ly80MzUvY2FjaGUvd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QjLy9zdHJpbmc7WFNEU2ltcGxlVHlwZURlZmluaXRpb249NyIKLSAgICAgIG91dHB1dHM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0FyZ3VtZW50UGFpcjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249MTAiCi0gICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vQXJndW1lbnRQYWlyIj4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0FyZ3VtZW50UGFpcjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249MTAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0FyZ3VtZW50UGFpci9uYW1lIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Bcmd1bWVudFBhaXI7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0FyZ3VtZW50UGFpci92YWx1ZSIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL2FyY2hpdmU7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9BcmNoaXZlVHlwZSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL2FyY2hpdmU7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RBdHRyaWJ1dGVVc2UiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9BcmNoaXZlVHlwZS9wYXRoIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0NsYXNzcGF0aDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NS9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MS9maWxlc2V0O1hTREVsZW1lbnREZWNsYXJhdGlvbi9YU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL2luY2x1ZGU7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9JbmNsdWRlVHlwZSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvZmlsZXNldDtYU0RFbGVtZW50RGVjbGFyYXRpb24vWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9pbmNsdWRlO1hTREVsZW1lbnREZWNsYXJhdGlvbi9YU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vSW5jbHVkZVR5cGUvbmFtZSIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvZmlsZXNldDtYU0RFbGVtZW50RGVjbGFyYXRpb24vWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL2V4Y2x1ZGU7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9FeGNsdWRlVHlwZSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvZmlsZXNldDtYU0RFbGVtZW50RGVjbGFyYXRpb24vWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL2V4Y2x1ZGU7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RBdHRyaWJ1dGVVc2UiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9FeGNsdWRlVHlwZS9uYW1lIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iYnVuZGxlZW50cnk6Ly80MzUvY2FjaGUvd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QjLy9ib29sZWFuO1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uPTgiCi0gICAgICBvdXRwdXRzPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vQ2xhc3NwYXRoO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj01L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL2ZpbGVzZXQ7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9GaWxlc2V0VHlwZSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvZmlsZXNldDtYU0RFbGVtZW50RGVjbGFyYXRpb24vWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9GaWxlc2V0VHlwZS9ncm91cCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vQ2xhc3NwYXRoO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj01L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL2ZpbGVzZXQ7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9GaWxlc2V0VHlwZS9pbmNsdWRlIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvZmlsZXNldDtYU0RFbGVtZW50RGVjbGFyYXRpb24vWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vRmlsZXNldFR5cGUvZXhjbHVkZSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vQ2xhc3NwYXRoO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj01L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL2ZpbGVzZXQ7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RBdHRyaWJ1dGVVc2U9MSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0ZpbGVzZXRUeXBlL2Nhc2VzZW5zaXRpdmUiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0NsYXNzcGF0aDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NS9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MS9maWxlc2V0O1hTREVsZW1lbnREZWNsYXJhdGlvbi9YU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vRmlsZXNldFR5cGUvZGlyIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0NsYXNzcGF0aDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NSIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9DbGFzc3BhdGgiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vQ2xhc3NwYXRoO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj01L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9DbGFzc3BhdGgvZ3JvdXAiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0NsYXNzcGF0aDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NS9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9DbGFzc3BhdGgvYXJjaGl2ZSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vQ2xhc3NwYXRoO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj01L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vQ2xhc3NwYXRoL2ZpbGVzZXQiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0NsYXNzcGF0aDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NS9YU0RBdHRyaWJ1dGVVc2UiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9DbGFzc3BhdGgvaWQiLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vRXh0ZXJuYWw7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTExIgotICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0V4dGVybmFsIj4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0V4dGVybmFsO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xMS9YU0RBdHRyaWJ1dGVVc2UiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9FeHRlcm5hbC9vcyIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9qbmRpQ29ubmVjdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249OSIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9KbmRpQ29ubmVjdGlvbiI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9qbmRpQ29ubmVjdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249OS9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vSm5kaUNvbm5lY3Rpb24vcHJvdmlkZXJVcmwiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL2puZGlDb25uZWN0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj05L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0puZGlDb25uZWN0aW9uL2dyb3VwIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9qbmRpQ29ubmVjdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249OS9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0puZGlDb25uZWN0aW9uL2puZGlQcm9wZXJ0eSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vam5kaUNvbm5lY3Rpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTkvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0yIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vSm5kaUNvbm5lY3Rpb24vaW5pdGlhbENvbnRleHRGYWN0b3J5Ii8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMiCi0gICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbiI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9MYXVuY2hDb25maWd1cmF0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0zL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2dyb3VwIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9MYXVuY2hDb25maWd1cmF0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0zL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vZW52aXJvbm1lbnRWYXJpYWJsZSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vTGF1bmNoQ29uZmlndXJhdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249My9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2dyb3VwMSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vTGF1bmNoQ29uZmlndXJhdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249My9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vcHJvZ3JhbUFyZ3VtZW50cyIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vTGF1bmNoQ29uZmlndXJhdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249My9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTIiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL3dvcmtpbmdEaXJlY3RvcnkiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0zL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vbWFpbkNsYXNzIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9MYXVuY2hDb25maWd1cmF0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0zL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9My9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vZ3JvdXAyIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9MYXVuY2hDb25maWd1cmF0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0zL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9My9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi92bVBhcmFtZXRlcnMiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0zL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0yIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9jbGFzc3BhdGhSZWZlcmVuY2UiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0zL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9kZWJ1Z1BvcnQiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0zL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2dyb3VwMyIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vTGF1bmNoQ29uZmlndXJhdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249My9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTMvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9leHRlcm5hbCIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Nb2R1bGU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTIiCi0gICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlIj4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL01vZHVsZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb249Mi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlL3R5cGUiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL01vZHVsZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb249Mi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Nb2R1bGUvcHVibGlzaERpciIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vTW9kdWxlO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0yL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MiIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL01vZHVsZS9wdWJsaXNoZXJSZWZlcmVuY2UiLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUG9ydDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NCIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Qb3J0Ij4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1BvcnQ7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTQvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1BvcnQvbm8iLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1BvcnQ7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTQvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUG9ydC9uYW1lIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Qb3J0O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj00L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MiIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1BvcnQvcHJvdG9jb2wiLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHJvamVjdDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NyIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9qZWN0Ij4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1Byb2plY3Q7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTcvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1Byb2plY3QvY2xhc3NwYXRoUmVmZXJlbmNlIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1Byb3BlcnR5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xIgotICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1Byb3BlcnR5Ij4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1Byb3BlcnR5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xL1hTREF0dHJpYnV0ZVVzZT0zIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvcGVydHkvY29udGV4dCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHJvcGVydHk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEvWFNEQXR0cmlidXRlVXNlPTQiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS9kZWZhdWx0Ii8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Qcm9wZXJ0eTtYU0RDb21wbGV4VHlwZURlZmluaXRpb249MS9YU0RBdHRyaWJ1dGVVc2UiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS9pZCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHJvcGVydHk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEvWFNEQXR0cmlidXRlVXNlPTEiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS9sYWJlbCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHJvcGVydHk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEvWFNEQXR0cmlidXRlVXNlPTIiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS90eXBlIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1B1Ymxpc2hlckRhdGE7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTgiCi0gICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyRGF0YSI+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXJEYXRhO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj04L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9QdWJsaXNoZXJEYXRhL2RhdGFuYW1lIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXJEYXRhO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj04L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hlckRhdGEvZGF0YXZhbHVlIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1B1Ymxpc2hlcjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NiIKLSAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9QdWJsaXNoZXIiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHVibGlzaGVyO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj02L1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyL2dyb3VwIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXI7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTYvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hlci9wdWJsaXNoZXJkYXRhIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXI7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTYvWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyL2lkIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvZ3JvdXAiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvcHJvcGVydHkiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvZ3JvdXAxIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9TZXJ2ZXJSdW50aW1lO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvcG9ydCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0yIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9ncm91cDIiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9Mi9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9tb2R1bGUiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MyIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvcHJvamVjdCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT00IgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9zdGFydCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT01IgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9zdG9wIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9TZXJ2ZXJSdW50aW1lO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTYiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwMyIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT02L1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL3B1Ymxpc2hlciIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT03IgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9ncm91cDQiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9Ny9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJzZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9jbGFzc3BhdGgiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9OCIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvam5kaUNvbm5lY3Rpb24iLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL1NlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTREF0dHJpYnV0ZVVzZSIKLSAgICAgICAgb3V0cHV0cz0ic2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvbmFtZSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEQXR0cmlidXRlVXNlPTEiCi0gICAgICAgIG91dHB1dHM9InNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL3ZlcnNpb24iLz4KLSAgPC9uZXN0ZWQ+Ci08L3hzZDJlY29yZTpYU0QyRWNvcmVNYXBwaW5nUm9vdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU3MDk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlcnZlcnMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwYjViMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLmdlbmVyaWNqYm9zcy5qYXIuYXJncwotdGVtcC5mb2xkZXIKLWdlbmVyaWNqYm9zcy5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OTdhMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjVlZWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBKYW4gMjEgMTU6MDE6NDUgRUVUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NzYxYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4yMDUucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogZ2VuZXJpY2pib3NzLmphcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3YWU0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHNlcnZlcnMvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBidWlsZGZpbGVzLyxcCi0gICAgICAgICAgICAgICBnZW5lcmljamJvc3MuamFyICAgICAgICAgICAgICAKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKLXNvdXJjZS5nZW5lcmljamJvc3MuamFyID0gc2VydmVycy8KLWphcnMuY29tcGlsZS5vcmRlciA9IGdlbmVyaWNqYm9zcy5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL2J1aWxkZmlsZXMvamJvc3MzMjMueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvYnVpbGRmaWxlcy9qYm9zczMyMy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmM2I3MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvYnVpbGRmaWxlcy9qYm9zczMyMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJkZXBsb3lleHRlbnNpb24iICBkZWZhdWx0PSJkZXBsb3kuajJlZS53ZWIiICBiYXNlZGlyPSIuIj4KLQk8cHJvcGVydHkgbmFtZT0icGF1c2UuZGVwbG95IiB2YWx1ZT0iMTAiLz4KLQk8cHJvcGVydHkgbmFtZT0icGF1c2UudW5kZXBsb3kiIHZhbHVlPSI1Ii8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLndlYiI+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIj4gCi0JCQk8emlwZmlsZXNldCBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCSAgICAgICAgCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCQkJCTxleGNsdWRlIG5hbWU9IioqLyoud2FyIi8+Ci0JCQk8L3ppcGZpbGVzZXQ+Ci0JCTwvamFyPgotICAJCTxtb3ZlIGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIiB0b2Rpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9Ii8+Ci0JCTxzbGVlcCBzZWNvbmRzPSIke3BhdXNlLmRlcGxveX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLmVqYiI+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIj4gCi0JCQk8emlwZmlsZXNldCBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCSAgICAgICAgCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCSAgICAgICAJCTxleGNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotCQkJPC96aXBmaWxlc2V0PgotCQk8L2phcj4KLSAgCQk8bW92ZSBmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciIgdG9kaXI9IiR7c2VydmVyLnB1Ymxpc2guZGlyfSIvPgotCQk8c2xlZXAgc2Vjb25kcz0iJHtwYXVzZS5kZXBsb3l9Ii8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJkZXBsb3kuajJlZS5lYXIiPgotCQk8amFyIGRlc3RmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciI+IAotCQkJPHppcGZpbGVzZXQgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkgICAgICAgIAk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkgICAgICAgCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0gIAkJPG1vdmUgZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5lYXIiIHRvZGlyPSIke3NlcnZlci5wdWJsaXNoLmRpcn0iLz4KLQkJPHNsZWVwIHNlY29uZHM9IiR7cGF1c2UuZGVwbG95fSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0idW5kZXBsb3kuajJlZS53ZWIiPgotCQk8ZGVsZXRlIGZpbGU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS53YXIiIGZhaWxvbmVycm9yPSJmYWxzZSI+IDwvZGVsZXRlPgotCQk8c2xlZXAgc2Vjb25kcz0iJHtwYXVzZS51bmRlcGxveX0iLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InVuZGVwbG95LmoyZWUuZWpiIj4KLQkJPGRlbGV0ZSBmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIiBmYWlsb25lcnJvcj0iZmFsc2UiPiA8L2RlbGV0ZT4KLQkJPHNsZWVwIHNlY29uZHM9IiR7cGF1c2UudW5kZXBsb3l9Ii8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLmVhciI+Ci0JCTxkZWxldGUgZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciIgZmFpbG9uZXJyb3I9ImZhbHNlIj4gPC9kZWxldGU+Ci0JCTxzbGVlcCBzZWNvbmRzPSIke3BhdXNlLnVuZGVwbG95fSIvPgotCTwvdGFyZ2V0PgkKLQkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9pY29ucy9vYmoxNi9qYm9zcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9pY29ucy9vYmoxNi9qYm9zcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvaWNvbnMvb2JqMTYvamJvc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzljYTViOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT0gSkJvc3MgR2VuZXJpYyBzZXJ2ZXIgZGVmaW5pdGlvbnMgCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbkRlc2NyaXB0aW9uPVByb3ZpZGVzIEpCb3NzIHNlcnZlciBkZWZpbml0aW9ucyAKLQotCi0jID09PT09PT09PT09PSBqYm9zczMyMyA9PT09PT09PT09PT09PT09PT09PQotamJvc3NDYXRlZ29yeT1KQm9zcwotamJvc3MzMjNydW50aW1lVHlwZU5hbWU9SkJvc3MgdjMuMi4zCi1qYm9zczMyM3J1bnRpbWVUeXBlRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgMS4zIG1vZHVsZXMgb24gYSBsb2NhbCBzZXJ2ZXIuIFwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5LgotCi1qYm9zczMyM3NlcnZlclR5cGVOYW1lPUpCb3NzIHYzLjIuMwotamJvc3MzMjNzZXJ2ZXJUeXBlRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgMS4zIG1vZHVsZXMgb24gYSBsb2NhbCBzZXJ2ZXIuIFwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5LgotCi1qYm9zczRydW50aW1lVHlwZU5hbWU9SkJvc3MgdjQuMAotamJvc3M0cnVudGltZVR5cGVEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSAxLjQgbW9kdWxlcyBvbiBhIGxvY2FsIHNlcnZlci4gXAotUHJvdmlkZXMgYmFzaWMgc2VydmVyIGZ1bmN0aW9uYWxpdHkuCi0KLWpib3NzNHNlcnZlclR5cGVOYW1lPUpCb3NzIHY0LjAKLWpib3NzNHNlcnZlclR5cGVEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSAxLjQgbW9kdWxlcyBvbiBhIGxvY2FsIHNlcnZlci4gXAotUHJvdmlkZXMgYmFzaWMgc2VydmVyIGZ1bmN0aW9uYWxpdHkuCi0KLWpib3NzNDJydW50aW1lVHlwZU5hbWU9SkJvc3MgdjQuMgotamJvc3M0MnJ1bnRpbWVUeXBlRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgMS40IGFuZCA1LjAgbW9kdWxlcyBvbiBhIGxvY2FsIHNlcnZlci4gXAotUHJvdmlkZXMgYmFzaWMgc2VydmVyIGZ1bmN0aW9uYWxpdHkuCi0KLWpib3NzNDJzZXJ2ZXJUeXBlTmFtZT1KQm9zcyB2NC4yCi1qYm9zczQyc2VydmVyVHlwZURlc2NyaXB0aW9uPVB1Ymxpc2hlcyBhbmQgcnVucyBKMkVFIDEuNCBhbmQgNS4wIG1vZHVsZXMgb24gYSBsb2NhbCBzZXJ2ZXIuIFwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5LgotCi1qYm9zczVydW50aW1lVHlwZU5hbWU9SkJvc3MgdjUuMAotamJvc3M1cnVudGltZVR5cGVEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSA1IG1vZHVsZXMgb24gYSBsb2NhbCBzZXJ2ZXIuIFwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5LgotCi1qYm9zczVzZXJ2ZXJUeXBlTmFtZT1KQm9zcyB2NS4wCi1qYm9zczVzZXJ2ZXJUeXBlRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEpFRSA1IG1vZHVsZXMgb24gYSBsb2NhbCBzZXJ2ZXIuIFwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5LgotCi0jID09PT09PT09PT09PT09IHNlcnZlcmRlZiB0cmFuc2xhdGlvbnMgPT09PT09PT09PT09PT09PQotQXBwbGljYXRpb25TZXJ2ZXJEaXJlY3Rvcnk9QXBwbGljYXRpb24gJlNlcnZlciBEaXJlY3Rvcnk6Ci1zZXJ2ZXJBZGRyZXNzPUEmZGRyZXNzOgotc2VydmVyUG9ydD0mUG9ydDoKLWpuZGlQb3J0PSZKTkRJIFBvcnQ6Ci1qYm9zczMyM3NlcnZlckNvbmZpZz1TZXJ2ZXIgQ28mbmZpZ3VyYXRpb246Ci1zZXJ2ZXJjbGFzc1BhdGg9JkNsYXNzcGF0aCBWYXJpYWJsZToKLXNlcnZlck5hbWU9U2VyJnZlciBOYW1lOgotdXNlcm5hbWU9VXNlJnIgTmFtZToKLXBhc3N3b3JkPVBhc3Mmd29yZDoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzE0M2MxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXMiPgotCSAgICA8cnVudGltZVR5cGUKLQkgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzMzIzIgotCSAgICAgICBuYW1lPSIlamJvc3MzMjNydW50aW1lVHlwZU5hbWUiCi0JICAgICAgIGRlc2NyaXB0aW9uPSIlamJvc3MzMjNydW50aW1lVHlwZURlc2NyaXB0aW9uIgotCSAgICAgICB2ZW5kb3I9IiVqYm9zc0NhdGVnb3J5IgotCSAgICAgICB2ZXJzaW9uPSIzLjIuMyIKLQkgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lIj4KLQkgICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LndlYiIKLQkgICAgICAgICB2ZXJzaW9ucz0iMi4yLCAyLjMiLz4KLQkgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3QuZWpiIgotCSAgICAgICAgIHZlcnNpb25zPSIxLjEsIDIuMCIvPgotCSAgICAgIDxtb2R1bGVUeXBlCi0JICAgICAgICAgdHlwZXM9ImpzdC5lYXIiCi0JICAgICAgICAgdmVyc2lvbnM9IjEuMiwgMS4zIi8+Ci0JICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LmNvbm5lY3RvciIKLQkgICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0JICAgICAgIDxtb2R1bGVUeXBlCi0JICAgICAgICAgdHlwZXM9ImpzdC51dGlsaXR5IgotCSAgICAgICAgIHZlcnNpb25zPSIxLjAiLz4KLQkgICAgPC9ydW50aW1lVHlwZT4KLQkgICAgCi0JICAgIDxydW50aW1lVHlwZQotCSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M0IgotCSAgICAgICBuYW1lPSIlamJvc3M0cnVudGltZVR5cGVOYW1lIgotCSAgICAgICBkZXNjcmlwdGlvbj0iJWpib3NzNHJ1bnRpbWVUeXBlRGVzY3JpcHRpb24iCi0JICAgICAgIHZlbmRvcj0iJWpib3NzQ2F0ZWdvcnkiCi0JICAgICAgIHZlcnNpb249IjQuMCIKLQkgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lIj4KLQkgICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LndlYiIKLQkgICAgICAgICB2ZXJzaW9ucz0iMi4yLCAyLjMsIDIuNCIvPgotCSAgICAgIDxtb2R1bGVUeXBlCi0JICAgICAgICAgdHlwZXM9ImpzdC5lamIiCi0JICAgICAgICAgdmVyc2lvbnM9IjEuMSwgMi4wLCAyLjEiLz4KLQkgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3QuZWFyIgotCSAgICAgICAgIHZlcnNpb25zPSIxLjIsIDEuMywgMS40Ii8+Ci0JICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LmNvbm5lY3RvciIKLQkgICAgICAgICB2ZXJzaW9ucz0iMS4wLCAxLjUiLz4KLQkgICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0JICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotCSAgICA8L3J1bnRpbWVUeXBlPgotCi0JICAgIDxydW50aW1lVHlwZQotCSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M0MiIKLQkgICAgICAgbmFtZT0iJWpib3NzNDJydW50aW1lVHlwZU5hbWUiCi0JICAgICAgIGRlc2NyaXB0aW9uPSIlamJvc3M0MnJ1bnRpbWVUeXBlRGVzY3JpcHRpb24iCi0JICAgICAgIHZlbmRvcj0iJWpib3NzQ2F0ZWdvcnkiCi0JICAgICAgIHZlcnNpb249IjQuMiIKLQkgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lIj4KLQkgICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LndlYiIKLQkgICAgICAgICB2ZXJzaW9ucz0iMi4yLCAyLjMsIDIuNCwgMi41Ii8+Ci0JICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LmVqYiIKLQkgICAgICAgICB2ZXJzaW9ucz0iMS4xLCAyLjAsIDIuMSwgMy4wIi8+Ci0JICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LmVhciIKLQkgICAgICAgICB2ZXJzaW9ucz0iMS4yLCAxLjMsIDEuNCwgNS4wIi8+Ci0JICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LmNvbm5lY3RvciIKLQkgICAgICAgICB2ZXJzaW9ucz0iMS4wLCAxLjUiLz4KLQkgICAgICAgPG1vZHVsZVR5cGUKLQkgICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0JICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotCSAgICA8L3J1bnRpbWVUeXBlPgotCSAgICAKLQkgICAgPHJ1bnRpbWVUeXBlCi0JICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zczUiCi0JICAgICAgIG5hbWU9IiVqYm9zczVydW50aW1lVHlwZU5hbWUiCi0JICAgICAgIGRlc2NyaXB0aW9uPSIlamJvc3M1cnVudGltZVR5cGVEZXNjcmlwdGlvbiIKLQkgICAgICAgdmVuZG9yPSIlamJvc3NDYXRlZ29yeSIKLQkgICAgICAgdmVyc2lvbj0iNS4wIgotCSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWUiPgotCSAgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotCSAgICAgICAgIHZlcnNpb25zPSIyLjIsIDIuMywgMi40LCAyLjUiLz4KLQkgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3QuZWpiIgotCSAgICAgICAgIHZlcnNpb25zPSIxLjEsIDIuMCwgMi4xLCAzLjAiLz4KLQkgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3QuZWFyIgotCSAgICAgICAgIHZlcnNpb25zPSIxLjIsIDEuMywgMS40LCA1LjAiLz4KLQkgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3QuY29ubmVjdG9yIgotCSAgICAgICAgIHZlcnNpb25zPSIxLjAsIDEuNSIvPgotCSAgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJqc3QudXRpbGl0eSIKLQkgICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0JICAgIDwvcnVudGltZVR5cGU+Ci0KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJUeXBlcyI+Ci0JICAgICA8c2VydmVyVHlwZQotCSAgICAgICAgICAgcnVudGltZT0idHJ1ZSIKLQkgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyIgotCSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zczMyMyIKLQkgICAgICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLQkgICAgICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotCSAgICAgICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MzMjMiCi0JICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWpib3NzMzIzc2VydmVyVHlwZURlc2NyaXB0aW9uIgotCSAgICAgICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotCSAgICAgICAgICAgYmVoYXZpb3VyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJCZWhhdmlvdXIiCi0JICAgICAgICAgICBuYW1lPSIlamJvc3MzMjNzZXJ2ZXJUeXBlTmFtZSIKLQkgICAgICAgICAgIHN0YXJ0VGltZW91dD0iNTAwMDAiCi0JCSAgICAgICBzdG9wVGltZW91dD0iMTUwMDAiCi0JICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLQkgICAgICAgICAgIGxhdW5jaE1vZGVzPSJydW4sZGVidWcscHJvZmlsZSI+Ci0JICAgICAgICAgIAotCSAgICAgPC9zZXJ2ZXJUeXBlPgotCSAgICAgPHNlcnZlclR5cGUKLQkgICAgICAgICAgIHJ1bnRpbWU9InRydWUiCi0JICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlciIKLQkgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3M0IgotCSAgICAgICAgICAgaW5pdGlhbFN0YXRlPSJzdG9wcGVkIgotCSAgICAgICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiCi0JICAgICAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zczQiCi0JICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWpib3NzNHNlcnZlclR5cGVEZXNjcmlwdGlvbiIKLQkgICAgICAgICAgIGxhdW5jaENvbmZpZ0lkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLQkgICAgICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQmVoYXZpb3VyIgotCSAgICAgICAgICAgbmFtZT0iJWpib3NzNHNlcnZlclR5cGVOYW1lIgotCSAgICAgICAgICAgc3RhcnRUaW1lb3V0PSI1MDAwMCIKLQkJICAgICAgIHN0b3BUaW1lb3V0PSIxNTAwMCIKLQkgICAgICAgICAgIGhhc0NvbmZpZ3VyYXRpb249ImZhbHNlIgotCSAgICAgICAgICAgbGF1bmNoTW9kZXM9InJ1bixkZWJ1Zyxwcm9maWxlIj4gICAgICAgIAotCSAgICAgPC9zZXJ2ZXJUeXBlPgotCSAgICAgPHNlcnZlclR5cGUKLQkgICAgICAgICAgIHJ1bnRpbWU9InRydWUiCi0JICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlciIKLQkgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3M0MiIKLQkgICAgICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLQkgICAgICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotCSAgICAgICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M0MiIKLQkgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlamJvc3M0MnNlcnZlclR5cGVEZXNjcmlwdGlvbiIKLQkgICAgICAgICAgIGxhdW5jaENvbmZpZ0lkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLQkgICAgICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQmVoYXZpb3VyIgotCSAgICAgICAgICAgbmFtZT0iJWpib3NzNDJzZXJ2ZXJUeXBlTmFtZSIKLQkgICAgICAgICAgIHN0YXJ0VGltZW91dD0iNTAwMDAiCi0JCSAgICAgICBzdG9wVGltZW91dD0iMTUwMDAiCi0JICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLQkgICAgICAgICAgIGxhdW5jaE1vZGVzPSJydW4sZGVidWcscHJvZmlsZSI+ICAgICAgICAKLQkgICAgIDwvc2VydmVyVHlwZT4KLQkgICAgIDxzZXJ2ZXJUeXBlCi0JICAgICAgICAgICBydW50aW1lPSJ0cnVlIgotCSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXIiCi0JICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzNSIKLQkgICAgICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLQkgICAgICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotCSAgICAgICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M1IgotCSAgICAgICAgICAgZGVzY3JpcHRpb249IiVqYm9zczVzZXJ2ZXJUeXBlRGVzY3JpcHRpb24iCi0JICAgICAgICAgICBsYXVuY2hDb25maWdJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0JICAgICAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckJlaGF2aW91ciIKLQkgICAgICAgICAgIG5hbWU9IiVqYm9zczVzZXJ2ZXJUeXBlTmFtZSIKLQkgICAgICAgICAgIHN0YXJ0VGltZW91dD0iNTAwMDAiCi0JCSAgICAgICBzdG9wVGltZW91dD0iMTUwMDAiCi0JICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLQkgICAgICAgICAgIGxhdW5jaE1vZGVzPSJydW4sZGVidWcscHJvZmlsZSI+ICAgICAgICAKLQkgICAgIDwvc2VydmVyVHlwZT4KLQkgICAgIAotCTwvZXh0ZW5zaW9uPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkRnJhZ21lbnRzIj4KLQkgICAgIDxmcmFnbWVudAotCSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lIgotCSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MzMjMiCi0JICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4gICAgICAgICAgIAotCSAgICAgPGZyYWdtZW50Ci0JICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlciIKLQkgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zczMyMyIKLQkgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcldpemFyZEZyYWdtZW50Ii8+ICAgCi0JICAgICA8ZnJhZ21lbnQKLQkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZSIKLQkgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNCIKLQkgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPiAgICAgICAgICAgCi0JICAgICA8ZnJhZ21lbnQKLQkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVyIgotCSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzNCIKLQkgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcldpemFyZEZyYWdtZW50Ii8+ICAgCi0JICAgICA8ZnJhZ21lbnQKLQkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZSIKLQkgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNDIiCi0JICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4gICAgICAgICAgIAotCSAgICAgPGZyYWdtZW50Ci0JICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlciIKLQkgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zczQyIgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQiLz4gICAKLQkgICAgIDxmcmFnbWVudAotCSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lIgotCSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M1IgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50Ii8+ICAgICAgICAgICAKLQkgICAgIDxmcmFnbWVudAotCSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXIiCi0JICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3M1IgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQiLz4gICAKLQk8L2V4dGVuc2lvbj7CtAotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4KLQkJIDxpbWFnZQotCSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0JICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamJvc3MuZ2lmIgotCSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzMzIzIi8+Ci0JICAgICA8aW1hZ2UKLQkgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmltYWdlIgotCSAgICAgICAgIGljb249Imljb25zL29iajE2L2pib3NzLmdpZiIKLQkgICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3MzMjMiLz4KLQkgICAgIDxpbWFnZQotCSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0JICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamJvc3MuZ2lmIgotCSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNCIvPgotCSAgICAgPGltYWdlCi0JICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbWFnZSIKLQkgICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9qYm9zcy5naWYiCi0JICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzNCIvPgotCSAgICAgPGltYWdlCi0JICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbWFnZSIKLQkgICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9qYm9zcy5naWYiCi0JICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M0MiIvPgotCSAgICAgPGltYWdlCi0JICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbWFnZSIKLQkgICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9qYm9zcy5naWYiCi0JICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzNDIiLz4KLQkgICAgIDxpbWFnZQotCSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0JICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamJvc3MuZ2lmIgotCSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNSIvPgotCSAgICAgPGltYWdlCi0JICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbWFnZSIKLQkgICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9qYm9zcy5naWYiCi0JICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzNSIvPgotCTwvZXh0ZW5zaW9uPgotCQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiPgotICAgICA8cnVudGltZUNsYXNzcGF0aFByb3ZpZGVyCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZVRhcmdldCIKLSAgICAgICAgcnVudGltZVR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzKiIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lVGFyZ2V0SGFuZGxlciIvPgotCTwvZXh0ZW5zaW9uPgotCQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuc2VydmVyZGVmaW5pdGlvbiI+Ci0JCTxzZXJ2ZXJkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zczMyMyIgZGVmaW5pdGlvbmZpbGU9Ii9zZXJ2ZXJzL2pib3NzMzIzLnNlcnZlcmRlZiI+Ci0JCTwvc2VydmVyZGVmaW5pdGlvbj4KLQkJPHNlcnZlcmRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNCIgZGVmaW5pdGlvbmZpbGU9Ii9zZXJ2ZXJzL2pib3NzLnNlcnZlcmRlZiI+Ci0JCTwvc2VydmVyZGVmaW5pdGlvbj4gICAKLQkJPHNlcnZlcmRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNDIiIGRlZmluaXRpb25maWxlPSIvc2VydmVycy9qYm9zczQyLnNlcnZlcmRlZiI+Ci0JCTwvc2VydmVyZGVmaW5pdGlvbj4gICAKLQkJPHNlcnZlcmRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzNSIgZGVmaW5pdGlvbmZpbGU9Ii9zZXJ2ZXJzL2pib3NzNS5zZXJ2ZXJkZWYiPgotCQk8L3NlcnZlcmRlZmluaXRpb24+ICAgCi0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIgotICAgICAgIHZlcnNpb249IjMuMi4zIi8+Ci0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zcyIKLSAgICAgICB2ZXJzaW9uPSI0LjAiLz4KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIgotICAgICAgIHZlcnNpb249IjQuMiIvPgotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICAgdmVyc2lvbj0iNS4wIi8+Ci0KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIi8+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIkRmFjdG9yeSIvPgotICAgICAgPHR5cGUKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgICA8L2FkYXB0ZXI+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMyIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb249IjIuMiwyLjMiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5lamIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEsMi4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMyIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICAgICB2ZXJzaW9uPSI0LjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIsMi4zLDIuNCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmVqYiIKLSAgICAgICAgIHZlcnNpb249IjEuMSwyLjAsMi4xIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAsMS41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuYXBwY2xpZW50IgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0gICAgCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIgotICAgICAgICAgdmVyc2lvbj0iNC4yIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQsMi41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWpiIgotICAgICAgICAgdmVyc2lvbj0iMS4xLDIuMCwyLjEsMy4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQsNS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgdmVyc2lvbj0iMS4wLDEuNSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40LDUuMCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N1cHBvcnRlZD4KLSAgICAKLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICAgICB2ZXJzaW9uPSI1LjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIsMi4zLDIuNCwyLjUiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5lamIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEsMi4wLDIuMSwzLjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5lYXIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjIsMS4zLDEuNCw1LjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAsMS41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuYXBwY2xpZW50IgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQsNS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotICAgCi0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyI+Ci0gICAgPGRlZmF1bHQtZmFjZXRzPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zcyIvPgotICAgICAgPGZhY2V0IGlkPSJ3c3QuanNkdC53ZWIiIHZlcnNpb249IjEuMCIvPgotICAgIDwvZGVmYXVsdC1mYWNldHM+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmltYWdlcyI+Ci0gICAgPGltYWdlIHJ1bnRpbWUtY29tcG9uZW50LXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIgotICAgICAgcGF0aD0iaWNvbnMvb2JqMTYvamJvc3MuZ2lmIi8+ICAKLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPiAgCi0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpib3NzIi8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5SdW50aW1lTGFiZWxQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVGYWNldE1hcHBpbmdzIj4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MzMjMiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICB2ZXJzaW9uPSIzLjIuMyIvPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zczQiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICB2ZXJzaW9uPSI0LjAiLz4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3M0MiIKLSAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zcyIKLSAgICAgIHZlcnNpb249IjQuMiIvPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zczUiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiCi0gICAgICB2ZXJzaW9uPSI1LjAiLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3Mvc2VydmVycy9qYm9zcy5zZXJ2ZXJkZWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9zZXJ2ZXJzL2pib3NzLnNlcnZlcmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyOTg0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9zZXJ2ZXJzL2pib3NzLnNlcnZlcmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHRuczpTZXJ2ZXJSdW50aW1lCi0JeG1sbnM6dG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIFNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCAiCi0JbmFtZT0iSkJPU1MgNC4wIiB2ZXJzaW9uPSJ2NC4wIj4KLTxwcm9wZXJ0eSBpZD0ic2VydmVyUm9vdERpcmVjdG9yeSIKLQlsYWJlbD0iJUFwcGxpY2F0aW9uU2VydmVyRGlyZWN0b3J5IgotCXR5cGU9ImRpcmVjdG9yeSIKLQljb250ZXh0PSJydW50aW1lIgotCWRlZmF1bHQ9Ii95b3VyX3NlcnZlcl9yb290L2FwcHNlcnZlcnMvamJvc3MiIC8+Ci08cHJvcGVydHkgaWQ9InNlcnZlckFkZHJlc3MiCi0JbGFiZWw9IiVzZXJ2ZXJBZGRyZXNzIgotCXR5cGU9InN0cmluZyIKLQljb250ZXh0PSJzZXJ2ZXIiCi0JZGVmYXVsdD0iMTI3LjAuMC4xIiAvPgotPHByb3BlcnR5IGlkPSJwb3J0IgotCWxhYmVsPSIlc2VydmVyUG9ydCIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9IjgwODAiIC8+Ci08cHJvcGVydHkgaWQ9ImpuZGlQb3J0IgotCWxhYmVsPSIlam5kaVBvcnQiCi0JdHlwZT0ic3RyaW5nIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSIxMDk5IiAvPgkKLTxwcm9wZXJ0eSBpZD0ic2VydmVyQ29uZmlnIgotCWxhYmVsPSIlamJvc3MzMjNzZXJ2ZXJDb25maWciCi0JdHlwZT0iY29tYm8iCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9ImRlZmF1bHQsYWxsLG1pbmltYWwsb3RoZXIgLSB0eXBlIHlvdXIgb3duIGhlcmUiIC8+Ci0KLQk8cG9ydD4KLQkJPG5vPiR7cG9ydH08L25vPgotCQk8bmFtZT5IdHRwPC9uYW1lPgotCQk8cHJvdG9jb2w+aHR0cDwvcHJvdG9jb2w+Ci0JPC9wb3J0PgotCi0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LndlYjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvJHtzZXJ2ZXJDb25maWd9L2RlcGxveTwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LmVqYjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvJHtzZXJ2ZXJDb25maWd9L2RlcGxveTwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LmVhcjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvJHtzZXJ2ZXJDb25maWd9L2RlcGxveTwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0KLQotCTxwcm9qZWN0PgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpib3NzLnByb2plY3Q8L2NsYXNzcGF0aFJlZmVyZW5jZT4KLQk8L3Byb2plY3Q+Ci0JCi0JPHN0YXJ0PgotCQk8bWFpbkNsYXNzPm9yZy5qYm9zcy5NYWluPC9tYWluQ2xhc3M+Ci0JCTx3b3JraW5nRGlyZWN0b3J5PiR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluPC93b3JraW5nRGlyZWN0b3J5PgotCQk8cHJvZ3JhbUFyZ3VtZW50cz4tYyAke3NlcnZlckNvbmZpZ308L3Byb2dyYW1Bcmd1bWVudHM+Ci0JCTx2bVBhcmFtZXRlcnM+LURwcm9ncmFtLm5hbWU9cnVuLmJhdCAtRGphdmEuZW5kb3JzZWQuZGlycz0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW4vLi4vbGliL2VuZG9yc2VkIiAtWG1zMTI4bSAtWG14NTEybTwvdm1QYXJhbWV0ZXJzPgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpib3NzPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdGFydD4KLQotCTxzdG9wPgotCQk8bWFpbkNsYXNzPm9yZy5qYm9zcy5TaHV0ZG93bjwvbWFpbkNsYXNzPgotCQk8d29ya2luZ0RpcmVjdG9yeT4ke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbjwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+LVM8L3Byb2dyYW1Bcmd1bWVudHM+Ci0JCTx2bVBhcmFtZXRlcnM+LURqYm9zcy5ib290LmxvYWRlci5uYW1lPXNodXRkb3duLmJhdDwvdm1QYXJhbWV0ZXJzPgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpib3NzLnNodXRkb3duPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdG9wPgotCTxwdWJsaXNoZXIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXIiPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT5idWlsZC5maWxlPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+L2J1aWxkZmlsZXMvamJvc3MzMjMueG1sPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LndlYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC53ZWI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWpiPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCQotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3QuZWFyPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qc3QuZWFyPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS5lYXI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgkJCQkKLQk8L3B1Ymxpc2hlcj4KLQotCTxjbGFzc3BhdGggaWQ9Impib3NzIiA+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluL3J1bi5qYXIiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aCBpZD0iamJvc3Muc2h1dGRvd24iID4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW4vc2h1dGRvd24uamFyIiAvPgotCTwvY2xhc3NwYXRoPgotCi0JPGNsYXNzcGF0aCBpZD0iamJvc3MucHJvamVjdCIgPgotCQkKLQkJCQotCSAgICA8ZmlsZXNldCBkaXI9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0iPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJjbGllbnQvKi5qYXIiIC8+Ci0JICAgICAgIDxpbmNsdWRlIG5hbWU9InNlcnZlci9kZWZhdWx0L2xpYi8qLmphciIgLz4KLQkgICAgICAgCi0JICAgICAgIDwhLS0gVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgRUpCMyBpcyBub3QgdGhlcmUgNC4wLnggNC4yIC0tPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3kvamJvc3MtYW9wLWpkazUwLmRlcGxveWVyLyouamFyIiAvPgotCQkgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3kvZWpiMy5kZXBsb3llci8qLmphciIgLz4KLQkgICAgICAgCi0JICAgICAgIDwhLS0gZm9yIHZhbGlkYXRpb24gdG8gd29yayB0aGlzIGxpYnJhcnkgaXMgZGVmaW5lZCBhcyBhbiBhcmNoaXZlIC0tPgotCSAgICAgICA8ZXhjbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9saWIvbWFpbC5qYXIiIC8+Ci0JICAgIDwvZmlsZXNldD4KLQkgICAgCi0JICAgIDwhLS0gbGVhdmUgb25lIGdlbmVyaWMgamFyIGFzIGFuIGFyY2hpdmUgc28gdGhhdCB2YWxpZGF0aW9uIHdvcmtzIC0tPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9tYWlsLmphciIgLz4KLSAgIAotCTwvY2xhc3NwYXRoPgotCTxqbmRpQ29ubmVjdGlvbj4KLQkJPHByb3ZpZGVyVXJsPmpucDovLyR7c2VydmVyQWRkcmVzc306JHtqbmRpUG9ydH08L3Byb3ZpZGVyVXJsPgotCQk8aW5pdGlhbENvbnRleHRGYWN0b3J5Pm9yZy5qbnAuaW50ZXJmYWNlcy5OYW1pbmdDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3NlcnZlcnMvamJvc3MzMjMuc2VydmVyZGVmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3Mvc2VydmVycy9qYm9zczMyMy5zZXJ2ZXJkZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTViMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuamJvc3Mvc2VydmVycy9qYm9zczMyMy5zZXJ2ZXJkZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0bnM6U2VydmVyUnVudGltZQotCXhtbG5zOnRucz0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgIgotCW5hbWU9IkpCT1NTIDMuMi4zIiB2ZXJzaW9uPSJ2My4yLjMiPgotPHByb3BlcnR5IGlkPSJzZXJ2ZXJSb290RGlyZWN0b3J5IgotCWxhYmVsPSIlQXBwbGljYXRpb25TZXJ2ZXJEaXJlY3RvcnkiCi0JdHlwZT0iZGlyZWN0b3J5IgotCWNvbnRleHQ9InJ1bnRpbWUiCi0JZGVmYXVsdD0iL3lvdXJfc2VydmVyX3Jvb3QvYXBwc2VydmVycy9qYm9zcy0zLjIuMyIgLz4KLTxwcm9wZXJ0eSBpZD0ic2VydmVyQWRkcmVzcyIKLQlsYWJlbD0iJXNlcnZlckFkZHJlc3MiCi0JdHlwZT0ic3RyaW5nIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSIxMjcuMC4wLjEiIC8+Ci08cHJvcGVydHkgaWQ9InBvcnQiCi0JbGFiZWw9IiVzZXJ2ZXJQb3J0IgotCXR5cGU9InN0cmluZyIKLQljb250ZXh0PSJzZXJ2ZXIiCi0JZGVmYXVsdD0iODA4MCIgLz4KLTxwcm9wZXJ0eSBpZD0iam5kaVBvcnQiCi0JbGFiZWw9IiVqbmRpUG9ydCIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9IjEwOTkiIC8+CQotCi08cHJvcGVydHkgaWQ9InNlcnZlckNvbmZpZyIKLQlsYWJlbD0iJWpib3NzMzIzc2VydmVyQ29uZmlnIgotCXR5cGU9InNlbGVjdCIKLQljb250ZXh0PSJzZXJ2ZXIiCi0JZGVmYXVsdD0iZGVmYXVsdCxhbGwsbWluaW1hbCIgLz4KLQotCi0JPHBvcnQ+Ci0JCTxubz4ke3BvcnR9PC9ubz4KLQkJPG5hbWU+SHR0cDwvbmFtZT4KLQkJPHByb3RvY29sPmh0dHA8L3Byb3RvY29sPgotCTwvcG9ydD4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC53ZWI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lamI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lYXI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCi0JPHByb2plY3Q+Ci0JCTxjbGFzc3BhdGhSZWZlcmVuY2U+amJvc3MucHJvamVjdDwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvcHJvamVjdD4KLQkKLQk8c3RhcnQ+Ci0JCTxtYWluQ2xhc3M+b3JnLmpib3NzLk1haW48L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW48L3dvcmtpbmdEaXJlY3Rvcnk+Ci0JCTxwcm9ncmFtQXJndW1lbnRzPi1jICR7c2VydmVyQ29uZmlnfTwvcHJvZ3JhbUFyZ3VtZW50cz4KLQkJPHZtUGFyYW1ldGVycz48L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zczwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RhcnQ+Ci0KLQk8c3RvcD4KLQkJPG1haW5DbGFzcz5vcmcuamJvc3MuU2h1dGRvd248L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW48L3dvcmtpbmdEaXJlY3Rvcnk+Ci0JCTxwcm9ncmFtQXJndW1lbnRzPi1TPC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPjwvdm1QYXJhbWV0ZXJzPgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpib3NzPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdG9wPgotCTxwdWJsaXNoZXIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXIiPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT5idWlsZC5maWxlPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+L2J1aWxkZmlsZXMvamJvc3MzMjMueG1sPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LndlYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC53ZWI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWpiPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVhcjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCQkJCi0JPC9wdWJsaXNoZXI+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJqYm9zcyIgPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbi9ydW4uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbi9zaHV0ZG93bi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vY2xpZW50L2pib3NzLWoyZWUuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9qYXZheC5zZXJ2bGV0LmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9saWIvamJvc3MtYm9vdC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vbGliL2pib3NzLXN5c3RlbS5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vbGliL2pib3NzLWpteC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vbGliL2pib3NzLWNvbW1vbi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vbGliL2NvbmN1cnJlbnQuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9qYm9zcy5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyL2RlZmF1bHQvbGliL2pucHNlcnZlci5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyL2RlZmF1bHQvbGliL2pwbC1wYXR0ZXJuLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvZGVmYXVsdC9saWIvanBsLXV0aWwuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9qYm9zcy10cmFuc2FjdGlvbi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyL2RlZmF1bHQvbGliL2JjZWwuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L2xpYi9qZG9tLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9saWIveGVyY2VzSW1wbC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vbGliL3htbC1hcGlzLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9saWIvZ251LXJlZ2V4cC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vbGliL2dldG9wdC5qYXIiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJqYm9zcy5wcm9qZWN0IiA+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vY2xpZW50L2pib3NzLWoyZWUuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9qYXZheC5zZXJ2bGV0LmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvZGVmYXVsdC9saWIvYWN0aXZhdGlvbi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyL2RlZmF1bHQvbGliL21haWwuamFyIiAvPgotCTwvY2xhc3NwYXRoPgotCTxqbmRpQ29ubmVjdGlvbj4KLQkJPHByb3ZpZGVyVXJsPmpucDovLyR7c2VydmVyQWRkcmVzc306JHtqbmRpUG9ydH08L3Byb3ZpZGVyVXJsPgotCQk8aW5pdGlhbENvbnRleHRGYWN0b3J5Pm9yZy5qbnAuaW50ZXJmYWNlcy5OYW1pbmdDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3NlcnZlcnMvamJvc3M0Mi5zZXJ2ZXJkZWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9zZXJ2ZXJzL2pib3NzNDIuc2VydmVyZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDk0Mjc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3NlcnZlcnMvamJvc3M0Mi5zZXJ2ZXJkZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0bnM6U2VydmVyUnVudGltZQotCXhtbG5zOnRucz0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgIgotCW5hbWU9IkpCT1NTIDQuMiIgdmVyc2lvbj0idjQuMiI+Ci08cHJvcGVydHkgaWQ9InNlcnZlclJvb3REaXJlY3RvcnkiCi0JbGFiZWw9IiVBcHBsaWNhdGlvblNlcnZlckRpcmVjdG9yeSIKLQl0eXBlPSJkaXJlY3RvcnkiCi0JY29udGV4dD0icnVudGltZSIKLQlkZWZhdWx0PSIveW91cl9zZXJ2ZXJfcm9vdC9hcHBzZXJ2ZXJzL2pib3NzIiAvPgotPHByb3BlcnR5IGlkPSJzZXJ2ZXJBZGRyZXNzIgotCWxhYmVsPSIlc2VydmVyQWRkcmVzcyIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9IjEyNy4wLjAuMSIgLz4KLTxwcm9wZXJ0eSBpZD0icG9ydCIKLQlsYWJlbD0iJXNlcnZlclBvcnQiCi0JdHlwZT0ic3RyaW5nIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSI4MDgwIiAvPgotPHByb3BlcnR5IGlkPSJqbmRpUG9ydCIKLQlsYWJlbD0iJWpuZGlQb3J0IgotCXR5cGU9InN0cmluZyIKLQljb250ZXh0PSJzZXJ2ZXIiCi0JZGVmYXVsdD0iMTA5OSIgLz4JCi08cHJvcGVydHkgaWQ9InNlcnZlckNvbmZpZyIKLQlsYWJlbD0iJWpib3NzMzIzc2VydmVyQ29uZmlnIgotCXR5cGU9ImNvbWJvIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSJkZWZhdWx0LGFsbCxtaW5pbWFsLG90aGVyIC0gdHlwZSB5b3VyIG93biBoZXJlIiAvPgotCi0JPHBvcnQ+Ci0JCTxubz4ke3BvcnR9PC9ubz4KLQkJPG5hbWU+SHR0cDwvbmFtZT4KLQkJPHByb3RvY29sPmh0dHA8L3Byb3RvY29sPgotCTwvcG9ydD4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC53ZWI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lamI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lYXI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCi0KLQk8cHJvamVjdD4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zcy5wcm9qZWN0PC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9wcm9qZWN0PgotCQotCTxzdGFydD4KLQkJPG1haW5DbGFzcz5vcmcuamJvc3MuTWFpbjwvbWFpbkNsYXNzPgotCQk8d29ya2luZ0RpcmVjdG9yeT4ke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbjwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+LWMgJHtzZXJ2ZXJDb25maWd9PC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPi1EcHJvZ3JhbS5uYW1lPXJ1bi5iYXQgLURqYXZhLmVuZG9yc2VkLmRpcnM9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluLy4uL2xpYi9lbmRvcnNlZCIgLVhtczEyOG0gLVhteDUxMm08L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zczwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RhcnQ+Ci0KLQk8c3RvcD4KLQkJPG1haW5DbGFzcz5vcmcuamJvc3MuU2h1dGRvd248L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW48L3dvcmtpbmdEaXJlY3Rvcnk+Ci0JCTxwcm9ncmFtQXJndW1lbnRzPi1TPC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPi1EamJvc3MuYm9vdC5sb2FkZXIubmFtZT1zaHV0ZG93bi5iYXQ8L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zcy5zaHV0ZG93bjwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RvcD4KLQk8cHVibGlzaGVyIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyIj4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+YnVpbGQuZmlsZTwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPi9idWlsZGZpbGVzL2pib3NzMzIzLnhtbDwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC53ZWI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS53ZWI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3QuZWpiPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUuZWpiPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qc3Qud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS53ZWI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLmVqYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+CQkKLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVhcjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCQkJCi0JPC9wdWJsaXNoZXI+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJqYm9zcyIgPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbi9ydW4uamFyIiAvPgotCTwvY2xhc3NwYXRoPgotCTxjbGFzc3BhdGggaWQ9Impib3NzLnNodXRkb3duIiA+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluL3NodXRkb3duLmphciIgLz4KLQk8L2NsYXNzcGF0aD4KLQotCTxjbGFzc3BhdGggaWQ9Impib3NzLnByb2plY3QiID4KLQkJCi0JCQkKLQkgICAgPGZpbGVzZXQgZGlyPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9Ij4KLQkgICAgICAgPGluY2x1ZGUgbmFtZT0iY2xpZW50LyouamFyIiAvPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9saWIvKi5qYXIiIC8+Ci0KLQkgICAgICAgPCEtLSBKU0YgTGlicmFyaWVzIC0tPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3kvamJvc3Mtd2ViLmRlcGxveWVyL2pzZi1saWJzLyouamFyIiAvPgotCSAgICAgICAKLQkgICAgICAgPCEtLSBUaGlzIHdpbGwgYmUgaWdub3JlZCBpZiBFSkIzIGlzIG5vdCB0aGVyZSA0LjAueCA0LjIgLS0+Ci0JICAgICAgIDxpbmNsdWRlIG5hbWU9InNlcnZlci9kZWZhdWx0L2RlcGxveS9qYm9zcy1hb3AtamRrNTAuZGVwbG95ZXIvKi5qYXIiIC8+Ci0JCSAgIDxpbmNsdWRlIG5hbWU9InNlcnZlci9kZWZhdWx0L2RlcGxveS9lamIzLmRlcGxveWVyLyouamFyIiAvPgotCi0JICAgICAgIDwhLS0gVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgRUpCMyBpcyBub3QgdGhlcmUgNS4wIC0tPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWIvKi5qYXIiIC8+Ci0JICAgICAgIDxpbmNsdWRlIG5hbWU9InNlcnZlci9kZWZhdWx0L2RlcGxveWVycy9qYm9zc3dlYi5kZXBsb3llci8qLmphciIgLz4KLQkgICAgICAgPGluY2x1ZGUgbmFtZT0ic2VydmVyL2RlZmF1bHQvZGVwbG95ZXJzL2pib3Nzd2ViLmRlcGxveWVyL2pzZi1saWJzLyouamFyIiAvPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3llcnMvamJvc3MtYW9wLWpib3NzNS5kZXBsb3llci8qLmphciIgLz4KLQkJICAgPGluY2x1ZGUgbmFtZT0ic2VydmVyL2RlZmF1bHQvZGVwbG95ZXJzL2VqYjMuZGVwbG95ZXIvamJvc3MtYW5ub3RhdGlvbnMtZWpiMy5qYXIiIC8+Ci0JICAgICAgIAkgICAgICAgCi0JICAgICAgIDwhLS0gZm9yIHZhbGlkYXRpb24gdG8gd29yayB0aGlzIGxpYnJhcnkgaXMgZGVmaW5lZCBhcyBhbiBhcmNoaXZlIC0tPgotCSAgICAgICA8ZXhjbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9saWIvbWFpbC5qYXIiIC8+Ci0JICAgIDwvZmlsZXNldD4KLQkgICAgCi0JICAgIDwhLS0gbGVhdmUgb25lIGdlbmVyaWMgamFyIGFzIGFuIGFyY2hpdmUgc28gdGhhdCB2YWxpZGF0aW9uIHdvcmtzIC0tPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9tYWlsLmphciIgLz4KLSAgIAotCTwvY2xhc3NwYXRoPgotCTxqbmRpQ29ubmVjdGlvbj4KLQkJPHByb3ZpZGVyVXJsPmpucDovLyR7c2VydmVyQWRkcmVzc306JHtqbmRpUG9ydH08L3Byb3ZpZGVyVXJsPgotCQk8aW5pdGlhbENvbnRleHRGYWN0b3J5Pm9yZy5qbnAuaW50ZXJmYWNlcy5OYW1pbmdDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3NlcnZlcnMvamJvc3M1LnNlcnZlcmRlZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpib3NzL3NlcnZlcnMvamJvc3M1LnNlcnZlcmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3MDJiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qYm9zcy9zZXJ2ZXJzL2pib3NzNS5zZXJ2ZXJkZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0bnM6U2VydmVyUnVudGltZQotCXhtbG5zOnRucz0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgIgotCW5hbWU9IkpCT1NTIDUuMCIgdmVyc2lvbj0idjUuMCI+Ci08cHJvcGVydHkgaWQ9InNlcnZlclJvb3REaXJlY3RvcnkiCi0JbGFiZWw9IiVBcHBsaWNhdGlvblNlcnZlckRpcmVjdG9yeSIKLQl0eXBlPSJkaXJlY3RvcnkiCi0JY29udGV4dD0icnVudGltZSIKLQlkZWZhdWx0PSIveW91cl9zZXJ2ZXJfcm9vdC9hcHBzZXJ2ZXJzL2pib3NzIiAvPgotPHByb3BlcnR5IGlkPSJzZXJ2ZXJBZGRyZXNzIgotCWxhYmVsPSIlc2VydmVyQWRkcmVzcyIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9IjEyNy4wLjAuMSIgLz4KLTxwcm9wZXJ0eSBpZD0icG9ydCIKLQlsYWJlbD0iJXNlcnZlclBvcnQiCi0JdHlwZT0ic3RyaW5nIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSI4MDgwIiAvPgotPHByb3BlcnR5IGlkPSJqbmRpUG9ydCIKLQlsYWJlbD0iJWpuZGlQb3J0IgotCXR5cGU9InN0cmluZyIKLQljb250ZXh0PSJzZXJ2ZXIiCi0JZGVmYXVsdD0iMTA5OSIgLz4JCi08cHJvcGVydHkgaWQ9InNlcnZlckNvbmZpZyIKLQlsYWJlbD0iJWpib3NzMzIzc2VydmVyQ29uZmlnIgotCXR5cGU9ImNvbWJvIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSJkZWZhdWx0LGFsbCxtaW5pbWFsLG90aGVyIC0gdHlwZSB5b3VyIG93biBoZXJlIiAvPgotCi0JPHBvcnQ+Ci0JCTxubz4ke3BvcnR9PC9ubz4KLQkJPG5hbWU+SHR0cDwvbmFtZT4KLQkJPHByb3RvY29sPmh0dHA8L3Byb3RvY29sPgotCTwvcG9ydD4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC53ZWI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lamI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lYXI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCi0KLQk8cHJvamVjdD4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zcy5wcm9qZWN0PC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9wcm9qZWN0PgotCQotCTxzdGFydD4KLQkJPG1haW5DbGFzcz5vcmcuamJvc3MuTWFpbjwvbWFpbkNsYXNzPgotCQk8d29ya2luZ0RpcmVjdG9yeT4ke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbjwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+LWMgJHtzZXJ2ZXJDb25maWd9PC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPi1EcHJvZ3JhbS5uYW1lPXJ1bi5iYXQgLVhtczEyOG0gLVhteDUxMm0gIC1YWDpNYXhQZXJtU2l6ZT0yNTZtPC92bVBhcmFtZXRlcnM+Ci0JCTxjbGFzc3BhdGhSZWZlcmVuY2U+amJvc3M8L2NsYXNzcGF0aFJlZmVyZW5jZT4KLQk8L3N0YXJ0PgotCi0JPHN0b3A+Ci0JCTxtYWluQ2xhc3M+b3JnLmpib3NzLlNodXRkb3duPC9tYWluQ2xhc3M+Ci0JCTx3b3JraW5nRGlyZWN0b3J5PiR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluPC93b3JraW5nRGlyZWN0b3J5PgotCQk8cHJvZ3JhbUFyZ3VtZW50cz4tUzwvcHJvZ3JhbUFyZ3VtZW50cz4KLQkJPHZtUGFyYW1ldGVycz4tRGpib3NzLmJvb3QubG9hZGVyLm5hbWU9c2h1dGRvd24uYmF0PC92bVBhcmFtZXRlcnM+Ci0JCTxjbGFzc3BhdGhSZWZlcmVuY2U+amJvc3Muc2h1dGRvd248L2NsYXNzcGF0aFJlZmVyZW5jZT4KLQk8L3N0b3A+Ci0JPHB1Ymxpc2hlciBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlciI+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPmJ1aWxkLmZpbGU8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT4vYnVpbGRmaWxlcy9qYm9zczMyMy54bWw8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3Qud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUud2ViPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVqYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LndlYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUud2ViPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qc3QuZWpiPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgkJCi0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC5lYXI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lYXI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC5lYXI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLmVhcjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+CQkJCQotCTwvcHVibGlzaGVyPgotCi0JPGNsYXNzcGF0aCBpZD0iamJvc3MiID4KLQkJPGFyY2hpdmUgcGF0aD0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW4vcnVuLmphciIgLz4KLQk8L2NsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoIGlkPSJqYm9zcy5zaHV0ZG93biIgPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbi9zaHV0ZG93bi5qYXIiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJqYm9zcy5wcm9qZWN0IiA+Ci0JCQotCQkJCi0JICAgIDxmaWxlc2V0IGRpcj0iJHtzZXJ2ZXJSb290RGlyZWN0b3J5fSI+Ci0JICAgICAgIDxpbmNsdWRlIG5hbWU9ImNsaWVudC8qLmphciIgLz4KLQkgICAgICAgPGluY2x1ZGUgbmFtZT0ic2VydmVyL2RlZmF1bHQvbGliLyouamFyIiAvPgotCSAgICAgICAJICAgICAgIAotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3llcnMvamJvc3N3ZWIuZGVwbG95ZXIvanNmLWxpYnMvKi5qYXIiIC8+CSAgICAgICAKLQotCSAgICAgICA8IS0tIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIEVKQjMgaXMgbm90IHRoZXJlIDUuMCAtLT4KLQkgICAgICAgPGluY2x1ZGUgbmFtZT0ibGliLyouamFyIiAvPgotCSAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3llcnMvamJvc3N3ZWIuZGVwbG95ZXIvKi5qYXIiIC8+Ci0JICAgICAgIDxpbmNsdWRlIG5hbWU9InNlcnZlci9kZWZhdWx0L2RlcGxveWVycy9qYm9zcy1hb3AtamJvc3M1LmRlcGxveWVyLyouamFyIiAvPgotCQkgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9kZXBsb3llcnMvZWpiMy5kZXBsb3llci9qYm9zcy1hbm5vdGF0aW9ucy1lamIzLmphciIgLz4KLQkgICAgICAgCi0JICAgICAgIDwhLS0gZm9yIHZhbGlkYXRpb24gdG8gd29yayB0aGlzIGxpYnJhcnkgaXMgZGVmaW5lZCBhcyBhbiBhcmNoaXZlIC0tPgotCSAgICAgICA8ZXhjbHVkZSBuYW1lPSJzZXJ2ZXIvZGVmYXVsdC9saWIvbWFpbC5qYXIiIC8+Ci0JICAgIDwvZmlsZXNldD4KLQkgICAgCi0JICAgIDwhLS0gbGVhdmUgb25lIGdlbmVyaWMgamFyIGFzIGFuIGFyY2hpdmUgc28gdGhhdCB2YWxpZGF0aW9uIHdvcmtzIC0tPgotCQk8YXJjaGl2ZSBwYXRoPSIke3NlcnZlclJvb3REaXJlY3Rvcnl9L3NlcnZlci9kZWZhdWx0L2xpYi9tYWlsLmphciIgLz4KLSAgIAotCTwvY2xhc3NwYXRoPgotCTxqbmRpQ29ubmVjdGlvbj4KLQkJPHByb3ZpZGVyVXJsPmpucDovLyR7c2VydmVyQWRkcmVzc306JHtqbmRpUG9ydH08L3Byb3ZpZGVyVXJsPgotCQk8aW5pdGlhbENvbnRleHRGYWN0b3J5Pm9yZy5qbnAuaW50ZXJmYWNlcy5OYW1pbmdDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU3MDk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlcnZlcnMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkY2FlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLmdlbmVyaWNqb25hcy5qYXIuYXJncwotZ2VuZXJpY2pvbmFzLmphcgotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZDMwMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTY2ZmRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBKYW4gMjEgMTQ6NDM6NDggRUVUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzlkMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMjA1LnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1DbGFzc1BhdGg6IGdlbmVyaWNqb25hcy5qYXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YWE5ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgc2VydmVycy8sXAotICAgICAgICAgICAgICAgYnVpbGRmaWxlcy8sXAotICAgICAgICAgICAgICAgZ2VuZXJpY2pvbmFzLmphcgotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gZ2VuZXJpY2pvbmFzLmphcgotc291cmNlLmdlbmVyaWNqb25hcy5qYXIgPSBzZXJ2ZXJzLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvYnVpbGRmaWxlcy9qb25hcy54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9idWlsZGZpbGVzL2pvbmFzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1ODJhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9idWlsZGZpbGVzL2pvbmFzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJkZXBsb3lleHRlbnNpb24iICBkZWZhdWx0PSJkZXBsb3kuajJlZS53ZWIiICBiYXNlZGlyPSIuIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJqb25hcy5yb290IiB2YWx1ZT0iJHtqb25hc1Jvb3R9Ii8+Ci0JPHByb3BlcnR5IG5hbWU9ImpvbmFzLmJhc2UiIHZhbHVlPSIke2pvbmFzQmFzZX0iLz4KLQk8cHJvcGVydHkgbmFtZT0icGF1c2UiIHZhbHVlPSIxMCIvPgotCQotCTxwYXRoIGlkPSJiYXNlLmNsYXNzcGF0aCI+Ci0JICAgIDwhLS0gQ0xBU1NQQVRIIGlzIGFkZGVkIGZvciBydW50ZXN0IHRhcmdldCAtLT4KLQkgICAgPGZpbGVzZXQgZGlyPSIke2pvbmFzLnJvb3R9L2xpYiI+Ci0JICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLQkgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9vd19qb25hc19ib290c3RyYXAuamFyIi8+Ci0JICAgIDwvZmlsZXNldD4KLQk8L3BhdGg+CQkJCQotCTxwYXRoIGlkPSJ0b29scGF0aCI+Ci0JCTxwYXRoZWxlbWVudCBwYXRoPSIke2pvbmFzLmJhc2V9L2NvbmY7JHtqb25hcy5yb290fS9saWIvY29tbW9uL293X2pvbmFzX2Jvb3RzdHJhcC5qYXIiIC8+Ci0JPC9wYXRoPgotCi0JPHRhcmdldCBuYW1lPSJkZXBsb3kuajJlZS53ZWIiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImpvbmFzLXdlYi11bmRlcGxveSIgLz4KLQkJPGphciBkZXN0ZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS53YXIiPiAKLQkJCTx6aXBmaWxlc2V0IGRpcj0iJHttb2R1bGUuZGlyfSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi53YXIiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0JCTxtb3ZlIGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIiB0b2Rpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iam9uYXMtd2ViLWRlcGxveSIgLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLmVqYiI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iam9uYXMtZWpiLXVuZGVwbG95IiAvPgotCQk8amFyIGRlc3RmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciI+IAotCQkJPHppcGZpbGVzZXQgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkgICAgICAgIAk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkgICAgICAgCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0gIAkJPG1vdmUgZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiIHRvZGlyPSIke3NlcnZlci5wdWJsaXNoLmRpcn0iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJqb25hcy1lamItZGVwbG95IiAvPgotCTwvdGFyZ2V0PgotCQotCQotCQotCTx0YXJnZXQgbmFtZT0idW5kZXBsb3kuajJlZS53ZWIiPgotCQk8ZGVsZXRlIGZpbGU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS53YXIiPiA8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InVuZGVwbG95LmoyZWUuZWpiIj4KLQkJPGRlbGV0ZSBmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIj4gPC9kZWxldGU+Ci0JPC90YXJnZXQ+CQotCi0JPHRhcmdldCBuYW1lPSJqb25hcy1lamItZGVwbG95IiBkZXBlbmRzPSJqb25hcy1qYXIiPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5vYmplY3R3ZWIuam9uYXMuc2VydmVyLkJvb3RzdHJhcCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBmb3JrPSJ0cnVlIiBjbGFzc3BhdGhyZWY9InRvb2xwYXRoIj4KLQkJCTxhcmcgdmFsdWU9Im9yZy5vYmplY3R3ZWIuam9uYXMuYWRtLkpvbmFzQWRtaW4iIC8+Ci0JCQk8YXJnIHZhbHVlPSItYSIgLz4KLQkJCTxhcmcgdmFsdWU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGluc3RhbGwucm9vdD0ke2pvbmFzLnJvb3R9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqb25hcy5iYXNlPSR7am9uYXMuYmFzZX0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEuc2VjdXJpdHkucG9saWN5PSR7am9uYXMuYmFzZX0vY29uZi9qYXZhLnBvbGljeSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1Eam9uYXMuY2xhc3NwYXRoPSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1Eam9uYXMuZGVmYXVsdC5jbGFzc2xvYWRlcj10cnVlIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZheC5ybWkuQ09SQkEuUG9ydGFibGVSZW1vdGVPYmplY3RDbGFzcz1vcmcub2JqZWN0d2ViLmNhcm9sLnJtaS5tdWx0aS5NdWx0aVBST0RlbGVnYXRlIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLm5hbWluZy5mYWN0b3J5LmluaXRpYWw9b3JnLm9iamVjdHdlYi5jYXJvbC5qbmRpLnNwaS5NdWx0aU9yYkluaXRpYWxDb250ZXh0RmFjdG9yeSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZz0ke2pvbmFzLmJhc2V9L2NvbmYvamFhcy5jb25maWciIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEucm1pLnNlcnZlci5STUlDbGFzc0xvYWRlclNwaT1vcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5SZW1vdGVDbGFzc0xvYWRlclNwaSIgLz4KLQkJPC9qYXZhPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iam9uYXMtZWpiLXVuZGVwbG95Ij4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5Cb290c3RyYXAiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSIgY2xhc3NwYXRocmVmPSJ0b29scGF0aCI+Ci0JCQk8YXJnIHZhbHVlPSJvcmcub2JqZWN0d2ViLmpvbmFzLmFkbS5Kb25hc0FkbWluIiAvPgotCQkJPGFyZyB2YWx1ZT0iLXIiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURpbnN0YWxsLnJvb3Q9JHtqb25hcy5yb290fSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1Eam9uYXMuYmFzZT0ke2pvbmFzLmJhc2V9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnNlY3VyaXR5LnBvbGljeT0ke2pvbmFzLmJhc2V9L2NvbmYvamF2YS5wb2xpY3kiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmNsYXNzcGF0aD0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmRlZmF1bHQuY2xhc3Nsb2FkZXI9dHJ1ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9b3JnLm9iamVjdHdlYi5jYXJvbC5ybWkubXVsdGkuTXVsdGlQUk9EZWxlZ2F0ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPW9yZy5vYmplY3R3ZWIuY2Fyb2wuam5kaS5zcGkuTXVsdGlPcmJJbml0aWFsQ29udGV4dEZhY3RvcnkiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9JHtqb25hcy5iYXNlfS9jb25mL2phYXMuY29uZmlnIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnJtaS5zZXJ2ZXIuUk1JQ2xhc3NMb2FkZXJTcGk9b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuUmVtb3RlQ2xhc3NMb2FkZXJTcGkiIC8+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iam9uYXMtd2ViLWRlcGxveSI+Ci0KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5Cb290c3RyYXAiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSIgY2xhc3NwYXRocmVmPSJ0b29scGF0aCI+Ci0JCQk8YXJnIHZhbHVlPSJvcmcub2JqZWN0d2ViLmpvbmFzLmFkbS5Kb25hc0FkbWluIiAvPgotCQkJPGFyZyB2YWx1ZT0iLWEiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURpbnN0YWxsLnJvb3Q9JHtqb25hcy5yb290fSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1Eam9uYXMuYmFzZT0ke2pvbmFzLmJhc2V9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnNlY3VyaXR5LnBvbGljeT0ke2pvbmFzLmJhc2V9L2NvbmYvamF2YS5wb2xpY3kiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmNsYXNzcGF0aD0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmRlZmF1bHQuY2xhc3Nsb2FkZXI9dHJ1ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9b3JnLm9iamVjdHdlYi5jYXJvbC5ybWkubXVsdGkuTXVsdGlQUk9EZWxlZ2F0ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPW9yZy5vYmplY3R3ZWIuY2Fyb2wuam5kaS5zcGkuTXVsdGlPcmJJbml0aWFsQ29udGV4dEZhY3RvcnkiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9JHtqb25hcy5iYXNlfS9jb25mL2phYXMuY29uZmlnIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnJtaS5zZXJ2ZXIuUk1JQ2xhc3NMb2FkZXJTcGk9b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuUmVtb3RlQ2xhc3NMb2FkZXJTcGkiIC8+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImpvbmFzLXdlYi11bmRlcGxveSI+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuQm9vdHN0cmFwIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0iZmFsc2UiIGNsYXNzcGF0aHJlZj0idG9vbHBhdGgiPgotCQkJPGFyZyB2YWx1ZT0ib3JnLm9iamVjdHdlYi5qb25hcy5hZG0uSm9uYXNBZG1pbiIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1yIiAvPgotCQkJPGFyZyB2YWx1ZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LndhciIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EaW5zdGFsbC5yb290PSR7am9uYXMucm9vdH0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmJhc2U9JHtqb25hcy5iYXNlfSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5zZWN1cml0eS5wb2xpY3k9JHtqb25hcy5iYXNlfS9jb25mL2phdmEucG9saWN5IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqb25hcy5jbGFzc3BhdGg9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqb25hcy5kZWZhdWx0LmNsYXNzbG9hZGVyPXRydWUiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmF4LnJtaS5DT1JCQS5Qb3J0YWJsZVJlbW90ZU9iamVjdENsYXNzPW9yZy5vYmplY3R3ZWIuY2Fyb2wucm1pLm11bHRpLk11bHRpUFJPRGVsZWdhdGUiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEubmFtaW5nLmZhY3RvcnkuaW5pdGlhbD1vcmcub2JqZWN0d2ViLmNhcm9sLmpuZGkuc3BpLk11bHRpT3JiSW5pdGlhbENvbnRleHRGYWN0b3J5IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnPSR7am9uYXMuYmFzZX0vY29uZi9qYWFzLmNvbmZpZyIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5ybWkuc2VydmVyLlJNSUNsYXNzTG9hZGVyU3BpPW9yZy5vYmplY3R3ZWIuam9uYXMuc2VydmVyLlJlbW90ZUNsYXNzTG9hZGVyU3BpIiAvPgotCQk8L2phdmE+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJqb25hcy1lYXItZGVwbG95Ij4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5Cb290c3RyYXAiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSIgY2xhc3NwYXRocmVmPSJ0b29scGF0aCI+Ci0JCQk8YXJnIHZhbHVlPSJvcmcub2JqZWN0d2ViLmpvbmFzLmFkbS5Kb25hc0FkbWluIiAvPgotCQkJPGFyZyB2YWx1ZT0iLWEiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURpbnN0YWxsLnJvb3Q9JHtqb25hcy5yb290fSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1Eam9uYXMuYmFzZT0ke2pvbmFzLmJhc2V9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnNlY3VyaXR5LnBvbGljeT0ke2pvbmFzLmJhc2V9L2NvbmYvamF2YS5wb2xpY3kiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmNsYXNzcGF0aD0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmRlZmF1bHQuY2xhc3Nsb2FkZXI9dHJ1ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9b3JnLm9iamVjdHdlYi5jYXJvbC5ybWkubXVsdGkuTXVsdGlQUk9EZWxlZ2F0ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPW9yZy5vYmplY3R3ZWIuY2Fyb2wuam5kaS5zcGkuTXVsdGlPcmJJbml0aWFsQ29udGV4dEZhY3RvcnkiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9JHtqb25hcy5iYXNlfS9jb25mL2phYXMuY29uZmlnIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnJtaS5zZXJ2ZXIuUk1JQ2xhc3NMb2FkZXJTcGk9b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuUmVtb3RlQ2xhc3NMb2FkZXJTcGkiIC8+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iam9uYXMtZWFyLXVuZGVwbG95Ij4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5Cb290c3RyYXAiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSIgY2xhc3NwYXRocmVmPSJ0b29scGF0aCI+Ci0JCQk8YXJnIHZhbHVlPSJvcmcub2JqZWN0d2ViLmpvbmFzLmFkbS5Kb25hc0FkbWluIiAvPgotCQkJPGFyZyB2YWx1ZT0iLXIiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURpbnN0YWxsLnJvb3Q9JHtqb25hcy5yb290fSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1Eam9uYXMuYmFzZT0ke2pvbmFzLmJhc2V9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnNlY3VyaXR5LnBvbGljeT0ke2pvbmFzLmJhc2V9L2NvbmYvamF2YS5wb2xpY3kiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmNsYXNzcGF0aD0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGpvbmFzLmRlZmF1bHQuY2xhc3Nsb2FkZXI9dHJ1ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9b3JnLm9iamVjdHdlYi5jYXJvbC5ybWkubXVsdGkuTXVsdGlQUk9EZWxlZ2F0ZSIgLz4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPW9yZy5vYmplY3R3ZWIuY2Fyb2wuam5kaS5zcGkuTXVsdGlPcmJJbml0aWFsQ29udGV4dEZhY3RvcnkiIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9JHtqb25hcy5iYXNlfS9jb25mL2phYXMuY29uZmlnIiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURqYXZhLnJtaS5zZXJ2ZXIuUk1JQ2xhc3NMb2FkZXJTcGk9b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuUmVtb3RlQ2xhc3NMb2FkZXJTcGkiIC8+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQkKLQkKLQkKLQk8dGFyZ2V0IG5hbWU9InVuZGVwbG95LmoyZWUuZWFyIj4KLQkJPGRlbGV0ZSBmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIj4gPC9kZWxldGU+Ci0JPC90YXJnZXQ+CQotCQotCTx0YXJnZXQgbmFtZT0iZGVwbG95LmoyZWUuZWFyIiBkZXBlbmRzPSItY2hlY2tKMkVFRGVwbG95IiB1bmxlc3M9Im5vdE5lZWRlZCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iam9uYXMtZWFyLXVuZGVwbG95IiAvPgotCQk8amFyIGRlc3RmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciI+IAotCQkJPHppcGZpbGVzZXQgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkgICAgICAgIAk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkgICAgICAgCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0gIAkJPG1vdmUgZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5lYXIiIHRvZGlyPSIke3NlcnZlci5wdWJsaXNoLmRpcn0iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJqb25hcy1lYXItZGVwbG95IiAvPgotCQk8c2xlZXAgc2Vjb25kcz0iJHtwYXVzZX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9Ii1jaGVja0oyRUVEZXBsb3kiPgotCQk8dXB0b2RhdGUgcHJvcGVydHk9Im5vdE5lZWRlZCIgdGFyZ2V0ZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciI+Ci0JCQk8c3JjZmlsZXMgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkJICAgCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvc3JjZmlsZXM+Ci0JCTwvdXB0b2RhdGU+Ci0JPC90YXJnZXQ+Ci0JCi0JCi0JICA8dGFyZ2V0IG5hbWU9ImpvbmFzLWphciIgID4KLQkJPGRlbGV0ZSBkaXI9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfV9qb25hcyIgZmFpbG9uZXJyb3I9ImZhbHNlIiAvPgotCSAgICAgCi0JCTx1bmphciBzcmM9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiIGRlc3Q9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfV9qb25hcyIvPiAKLQkJPGRlbGV0ZSBmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIiBmYWlsb25lcnJvcj0iZmFsc2UiICAvPgotCi0JCSA8dGFza2RlZiBuYW1lPSJqb25hc0VqYkpqYXIiCi0JCSAgICBjbGFzc25hbWU9Im9yZy5vYmplY3R3ZWIuam9uYXMuYW50LkVqYkphciIKLQkJICAgIGNsYXNzcGF0aHJlZj0iYmFzZS5jbGFzc3BhdGgiIC8+Ci0KLQkgIAk8am9uYXNFamJKamFyIGJhc2VqYXJuYW1lPSIke21vZHVsZS5uYW1lfSIKLQkJICAgIHNyY2Rpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9X2pvbmFzIgotCQkgICAgZGVzY3JpcHRvcmRpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9X2pvbmFzL01FVEEtSU5GIiAKLQkJICAgIGRlcGVuZGVuY3k9ImZ1bGwiID4KLQkgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9lamItamFyLnhtbCIvPgotCSAgICAgIDxkdGQgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotCQkgICBsb2NhdGlvbj0iJHtqb25hcy5yb290fS94bWwvZWpiLWphcl8yXzAuZHRkIiAvPgotCSAgICAgIDxzdXBwb3J0IGRpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9X2pvbmFzIj4KLQkJICAJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JCSAgCTxleGNsdWRlIG5hbWU9IioqL01BTklGRVNULk1GIi8+Ci0JCSAgCTxleGNsdWRlIG5hbWU9IioqL2VqYi1qYXIueG1sIi8+Ci0JCSAgCTxleGNsdWRlIG5hbWU9IioqL2pvbmFzLWVqYi1qYXIueG1sIi8+Ci0JICAgICAgPC9zdXBwb3J0PgotCSAgICAgIDxqb25hcyBkZXN0ZGlyPSIke3NlcnZlci5wdWJsaXNoLmRpcn0iCi0JICAgICAgICAgY2xhc3NwYXRoPSIke2Jhc2UuY2xhc3NwYXRofToke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX1fam9uYXMiIAotCQkgICAgIGpvbmFzUm9vdD0iJHtqb25hcy5yb290fSIgCi0JCSAgICAgbWFwcGVybmFtZXM9IiIKLQkgICAgICAgICBwcm90b2NvbHM9ImpybXAsamVyZW1pZSxpaW9wIgotCQkgICAgIGtlZXBnZW5lcmF0ZWQ9ImZhbHNlIiAvPgotCSAgICA8L2pvbmFzRWpiSmphcj4KLQkJPGRlbGV0ZSBkaXI9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfV9qb25hcyIgZmFpbG9uZXJyb3I9ImZhbHNlIiAvPiAKLQkgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9pY29ucy9vYmoxNi9qb25hcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9pY29ucy9vYmoxNi9qb25hcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvaWNvbnMvb2JqMTYvam9uYXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXMvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1NDY3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDg0YjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZVR5cGVzIj4KLSAgIAotICAgIDxydW50aW1lVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hczQiCi0gICAgICAgbmFtZT0iJWpvbmFzNHJ1bnRpbWVUeXBlTmFtZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iJWpvbmFzNHJ1bnRpbWVUeXBlRGVzY3JpcHRpb24iCi0gICAgICAgdmVuZG9yPSIlam9uYXNDYXRlZ29yeSIKLSAgICAgICB2ZXJzaW9uPSI0IgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZSIKLSAgICAgICA+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbnM9IjIuMiwgMi4zLCAyLjQiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmVqYiIKLSAgICAgICAgIHZlcnNpb25zPSIxLjEsIDIuMCwgMi4xIi8+Ci0gICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC5lYXIiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4yLCAxLjMsIDEuNCIvPgotICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgdmVyc2lvbnM9IjEuMCwgMS41Ii8+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb25zPSIxLjAiLz4KLSAgICA8L3J1bnRpbWVUeXBlPgotICAgIAotCTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyVHlwZXMiPgotICAgICA8c2VydmVyVHlwZQotICAgICAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckJlaGF2aW91ciIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXIiCi0gICAgICAgICAgIGRlc2NyaXB0aW9uPSIlam9uYXM0c2VydmVyVHlwZURlc2NyaXB0aW9uIgotICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hczQiCi0gICAgICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICAgICBsYXVuY2hNb2Rlcz0icnVuLGRlYnVnLHByb2ZpbGUiCi0gICAgICAgICAgIG5hbWU9IiVqb25hczRzZXJ2ZXJUeXBlTmFtZSIKLSAgICAgICAgICAgcnVudGltZT0idHJ1ZSIKLSAgICAgICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuam9uYXM0IgotICAgICAgICAgICBzdGFydEJlZm9yZVB1Ymxpc2g9InRydWUiCi0gICAgICAgICAgIHN0YXJ0VGltZW91dD0iNTAwMDAiCi0gICAgICAgICAgIHN0b3BUaW1lb3V0PSIxNTAwMCIKLSAgICAgICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiPgotICAgICA8L3NlcnZlclR5cGU+ICAgIAotICAgIAotCTwvZXh0ZW5zaW9uPgotPCEtLSBVSSBDb21wb25lbnRzLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmRGcmFnbWVudHMiPgotCSA8ZnJhZ21lbnQKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lIgotICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hczQiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPiAgICAgICAgICAgCi0gICAgIDxmcmFnbWVudAotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlciIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzNCIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQiLz4gICAKLSAgPC9leHRlbnNpb24+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9qb25hcy5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hczQiLz4KLSAgICAgPGltYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmltYWdlIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvam9uYXMuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzNCIvPgotCTwvZXh0ZW5zaW9uPgotCi08IS0tIERlZmluZSBDbGFzc3BhdGggcHJvdmlkZXIgZm9yIGFsbCBnZW5lcmljcyAtLT4gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzIj4KLSAgICAgPHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWVUYXJnZXQiCi0gICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS4qIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVUYXJnZXRIYW5kbGVyIi8+Ci0JPC9leHRlbnNpb24+Ci0KLTwhLS0gU2VydmVyIHR5cGUgZGVmaW5pdGlvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5zZXJ2ZXJkZWZpbml0aW9uIj4KLQkJPHNlcnZlcmRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpvbmFzNCIgZGVmaW5pdGlvbmZpbGU9Ii9zZXJ2ZXJzL2pvbmFzLnNlcnZlcmRlZiI+Ci0JCTwvc2VydmVyZGVmaW5pdGlvbj4KLSAgPC9leHRlbnNpb24+Ci0KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+ICAgIAotICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpvbmFzIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpvbmFzIgotICAgICAgIHZlcnNpb249IjQuMCIvPgotCi0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hcyIvPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyJEZhY3RvcnkiLz4KLSAgICAgIDx0eXBlCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNsYXNzcGF0aFByb3ZpZGVyIi8+Ci0gICAgPC9hZGFwdGVyPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpvbmFzIgotICAgICAgICAgdmVyc2lvbj0iNC4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5lamIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEsMi4wLDIuMSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmVhciIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgdmVyc2lvbj0iMS4wLDEuNSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotCi0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyI+Ci0gICAgPGRlZmF1bHQtZmFjZXRzPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hcyIvPgotICAgICAgPGZhY2V0IGlkPSJ3c3QuanNkdC53ZWIiIHZlcnNpb249IjEuMCIvPgotICAgIDwvZGVmYXVsdC1mYWNldHM+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgIDxpbWFnZSBydW50aW1lLWNvbXBvbmVudC10eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hcyIKLSAgICAgIHBhdGg9Imljb25zL29iajE2L2pvbmFzLmdpZiIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpvbmFzIi8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5SdW50aW1lTGFiZWxQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUZhY2V0TWFwcGluZ3MiPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hcyIKLSAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hcyIKLSAgICAgIHZlcnNpb249IjQuMCIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5qb25hcy9zZXJ2ZXJzL2pvbmFzLnNlcnZlcmRlZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL3NlcnZlcnMvam9uYXMuc2VydmVyZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmZkOGY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmpvbmFzL3NlcnZlcnMvam9uYXMuc2VydmVyZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08dG5zOlNlcnZlclJ1bnRpbWUKLQl4bWxuczp0bnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy9qc3Qvc2VydmVyL2dlbmVyaWMvU2VydmVyVHlwZURlZmluaXRpb24iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9lY2xpcHNlLm9yZy9qc3Qvc2VydmVyL2dlbmVyaWMvU2VydmVyVHlwZURlZmluaXRpb24gU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkICIKLQluYW1lPSJKT25BUyA0LngiIHZlcnNpb249InY0LngiPgotCTxwcm9wZXJ0eSBpZD0iam9uYXNSb290IgotCQlsYWJlbD0iJWpvbmFzUm9vdCIKLQkJdHlwZT0iZGlyZWN0b3J5IgotCQljb250ZXh0PSJydW50aW1lIgotCQlkZWZhdWx0PSIveW91cl9zZXJ2ZXJfcm9vdC9KT25BUy00LngiIC8+Ci0JPHByb3BlcnR5IGlkPSJqb25hc0Jhc2UiCi0JCWxhYmVsPSIlam9uYXNCYXNlIgotCQl0eXBlPSJkaXJlY3RvcnkiCi0JCWNvbnRleHQ9InJ1bnRpbWUiCi0JCWRlZmF1bHQ9Ii95b3VyX3NlcnZlcl9yb290L0pPbkFTLTQueCIgLz4KLQk8cHJvcGVydHkgaWQ9InNlcnZlckFkZHJlc3MiCi0JCWxhYmVsPSIlc2VydmVyQWRkcmVzcyIKLQkJdHlwZT0ic3RyaW5nIgotCQljb250ZXh0PSJzZXJ2ZXIiCi0JCWRlZmF1bHQ9IjEyNy4wLjAuMSIgLz4KLQk8cHJvcGVydHkgaWQ9InBvcnQiCi0JCWxhYmVsPSIlc2VydmVyUG9ydCIKLQkJdHlwZT0ic3RyaW5nIgotCQljb250ZXh0PSJzZXJ2ZXIiCi0JCWRlZmF1bHQ9IjkwMDAiIC8+Ci0JPHByb3BlcnR5IGlkPSJwcm90b2NvbHMiCi0JCWxhYmVsPSIlam9uYXNFamJQcm90b2NvbHMiCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSJqcm1wIiAvPgotCTxwcm9wZXJ0eSBpZD0ibWFwcGVybmFtZXMiCi0JCWxhYmVsPSIlam9uYXNtYXBwZXJuYW1lcyIKLQkJdHlwZT0ic3RyaW5nIgotCQljb250ZXh0PSJzZXJ2ZXIiCi0JCWRlZmF1bHQ9IiIgLz4KLQotCTxwb3J0PgotCQk8bm8+JHtwb3J0fTwvbm8+Ci0JCTxuYW1lPkh0dHA8L25hbWU+Ci0JCTxwcm90b2NvbD5odHRwPC9wcm90b2NvbD4KLQk8L3BvcnQ+Ci0KLQk8bW9kdWxlPgotCQk8dHlwZT5qc3Qud2ViPC90eXBlPgotCQk8cHVibGlzaERpcj4ke2pvbmFzQmFzZX0vd2ViYXBwcy9hdXRvbG9hZDwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0KLQk8bW9kdWxlPgotCQk8dHlwZT5qc3QuZWpiPC90eXBlPgotCQk8cHVibGlzaERpcj4ke2pvbmFzQmFzZX0vZWpiamFycy9hdXRvbG9hZDwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LmVhcjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHtqb25hc0Jhc2V9L2FwcHMvYXV0b2xvYWQ8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCi0JPHByb2plY3Q+Ci0JCTxjbGFzc3BhdGhSZWZlcmVuY2U+am9uYXMucHJvamVjdDwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvcHJvamVjdD4KLQkKLQk8c3RhcnQ+Ci0JCTxtYWluQ2xhc3M+b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuQm9vdHN0cmFwPC9tYWluQ2xhc3M+Ci0JCTx3b3JraW5nRGlyZWN0b3J5PiR7am9uYXNSb290fTwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuU2VydmVyPC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPi1EaW5zdGFsbC5yb290PSIke2pvbmFzUm9vdH0iIC1Eam9uYXMuYmFzZT0iJHtqb25hc0Jhc2V9IiAtRGphdmEuc2VjdXJpdHkucG9saWN5PSIke2pvbmFzUm9vdH0vY29uZi9qYXZhLnBvbGljeSIgLURqb25hcy5jbGFzc3BhdGg9IC1Eam9uYXMuZGVmYXVsdC5jbGFzc2xvYWRlcj10cnVlIC1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9b3JnLm9iamVjdHdlYi5jYXJvbC5ybWkubXVsdGkuTXVsdGlQUk9EZWxlZ2F0ZSAtRGphdmEubmFtaW5nLmZhY3RvcnkuaW5pdGlhbD1vcmcub2JqZWN0d2ViLmNhcm9sLmpuZGkuc3BpLk11bHRpT3JiSW5pdGlhbENvbnRleHRGYWN0b3J5IC1EamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZz0iJHtqb25hc1Jvb3R9L2NvbmYvamFhcy5jb25maWciICAtRGphdmEuZW5kb3JzZWQuZGlycz0iJHtqb25hc1Jvb3R9L2xpYi9lbmRvcnNlZCIgLURqYXZhLnJtaS5zZXJ2ZXIuUk1JQ2xhc3NMb2FkZXJTcGk9b3JnLm9iamVjdHdlYi5qb25hcy5zZXJ2ZXIuUmVtb3RlQ2xhc3NMb2FkZXJTcGk8L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qb25hczwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RhcnQ+Ci0KLQk8c3RvcD4KLQkJPG1haW5DbGFzcz5vcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5Cb290c3RyYXA8L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JHtqb25hc1Jvb3R9PC93b3JraW5nRGlyZWN0b3J5PgotCQk8cHJvZ3JhbUFyZ3VtZW50cz5vcmcub2JqZWN0d2ViLmpvbmFzLmFkbS5Kb25hc0FkbWluIC1zPC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPi1EaW5zdGFsbC5yb290PSR7am9uYXNSb290fSAtRGpvbmFzLmJhc2U9JHtqb25hc0Jhc2V9IC1EamF2YS5zZWN1cml0eS5wb2xpY3k9JHtqb25hc1Jvb3R9L2NvbmYvamF2YS5wb2xpY3kgLURqb25hcy5jbGFzc3BhdGg9IC1Eam9uYXMuZGVmYXVsdC5jbGFzc2xvYWRlcj10cnVlIC1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9b3JnLm9iamVjdHdlYi5jYXJvbC5ybWkubXVsdGkuTXVsdGlQUk9EZWxlZ2F0ZSAtRGphdmEubmFtaW5nLmZhY3RvcnkuaW5pdGlhbD1vcmcub2JqZWN0d2ViLmNhcm9sLmpuZGkuc3BpLk11bHRpT3JiSW5pdGlhbENvbnRleHRGYWN0b3J5IC1EamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZz0ke2pvbmFzUm9vdH0vY29uZi9qYWFzLmNvbmZpZyAgLURqYXZhLmVuZG9yc2VkLmRpcnM9JHtqb25hc1Jvb3R9L2xpYi9lbmRvcnNlZCAtRGphdmEucm1pLnNlcnZlci5STUlDbGFzc0xvYWRlclNwaT1vcmcub2JqZWN0d2ViLmpvbmFzLnNlcnZlci5SZW1vdGVDbGFzc0xvYWRlclNwaTwvdm1QYXJhbWV0ZXJzPgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpvbmFzPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdG9wPgotCTxwdWJsaXNoZXIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXIiPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT5idWlsZC5maWxlPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+L2J1aWxkZmlsZXMvam9uYXMueG1sPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LndlYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC53ZWI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWpiPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVhcjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCQkKLQk8L3B1Ymxpc2hlcj4KLQotCTxjbGFzc3BhdGggaWQ9ImpvbmFzIj4KLQkJPGFyY2hpdmUgcGF0aD0iJHtqb25hc1Jvb3R9L2xpYi9jb21tb24vb3dfam9uYXNfYm9vdHN0cmFwLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtqb25hc1Jvb3R9L2NvbmYiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJqb25hcy5wcm9qZWN0Ij4KLQkJPGFyY2hpdmUgcGF0aD0iJHtqb25hc1Jvb3R9L2xpYi9jb21tb24vb3dfam9uYXNfYm9vdHN0cmFwLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtqb25hc1Jvb3R9L2xpYi9jb21tb25zL2oyZWUvZWpiLTJfMS1hcGkuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke2pvbmFzUm9vdH0vbGliL2NvbW1vbnMvajJlZS9zZXJ2bGV0LTJfNC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7am9uYXNSb290fS9saWIvY29tbW9ucy9qMmVlL2ptcy5qYXIiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0JPGpuZGlDb25uZWN0aW9uPgotCQk8cHJvdmlkZXJVcmw+aWlvcDovLyR7c2VydmVyQWRkcmVzc306MjAwMTwvcHJvdmlkZXJVcmw+Ci0JCTxpbml0aWFsQ29udGV4dEZhY3Rvcnk+b3JnLm9iamVjdHdlYi5jYXJvbC5qbmRpLnNwaS5NdWx0aU9yYkluaXRpYWxDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm1vZHVsZXMvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm1vZHVsZXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2NTRjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5tb2R1bGVzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1jb21tb25tb2R1bGVzLmphcgotb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm1vZHVsZXNfMS4wLjAuamFyCi10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMubW9kdWxlcy8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm1vZHVsZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTRiYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMubW9kdWxlcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTkwNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzZXJ2ZXJzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWU0MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLmdlbmVyaWNvYzRqLmphci5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiZjI5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGo8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViOWJkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBKYW4gMjEgMTQ6NDI6NTggRUVUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2IyZDg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGo7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjIwNS5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6ICBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogZ2VuZXJpY29jNGouamFyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwMWIyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGJ1aWxkZmlsZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHNlcnZlcnMvLFwKLSAgICAgICAgICAgICAgIGdlbmVyaWNvYzRqLmphcgotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwotc291cmNlLmdlbmVyaWNvYzRqLmphciA9IHNlcnZlcnMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBnZW5lcmljb2M0ai5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYnVpbGRmaWxlcy9vcmFjbGUuMTAuMS4zLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYnVpbGRmaWxlcy9vcmFjbGUuMTAuMS4zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNlNDYwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL2J1aWxkZmlsZXMvb3JhY2xlLjEwLjEuMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPHByb2plY3QgbmFtZT0icHVibGlzaCIgIGJhc2VkaXI9Ii4iIHhtbG5zOm9yYWNsZT0iYW50bGliOm9yYWNsZSI+Ci0JPGltcG9ydCBmaWxlPSJvcmFjbGUvYW50LW9yYWNsZS54bWwiLz4KLQkJCi0JPCEtLSBPbmx5IGxvY2FsaG9zdCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24gLS0+Ci0JPHByb3BlcnR5IG5hbWU9Im9jNGouaG9zdCIgdmFsdWU9ImxvY2FsaG9zdCIvPiAKLQotCTxwcm9wZXJ0eSBuYW1lPSJkZXBsb3llci51cmkiIHZhbHVlPSJkZXBsb3llcjpvYzRqOiR7b2M0ai5ob3N0fToke29jNGouYWRtaW4ucG9ydH0iIC8+Ci0JCi0JPHRhcmdldCBuYW1lPSJjaGVjay5za2lwLndlYi5kZXBsb3kiPgotCQk8dXB0b2RhdGUgcHJvcGVydHk9InNraXAuZGVwbG95IiB0YXJnZXRmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIj4KLQkJCTxzcmNmaWxlcyBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCQkJCTxleGNsdWRlIG5hbWU9IioqLyoud2FyIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0JCQk8L3NyY2ZpbGVzPgotCQk8L3VwdG9kYXRlPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY2hlY2suc2tpcC5lamIuZGVwbG95Ij4KLQkJPHVwdG9kYXRlIHByb3BlcnR5PSJza2lwLmRlcGxveSIgdGFyZ2V0ZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciI+Ci0JCQk8c3JjZmlsZXMgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvc3JjZmlsZXM+Ci0JCTwvdXB0b2RhdGU+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjaGVjay5za2lwLmVhci5kZXBsb3kiPgotCQk8dXB0b2RhdGUgcHJvcGVydHk9InNraXAuZGVwbG95IiB0YXJnZXRmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIj4KLQkJCTxzcmNmaWxlcyBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCQkJCTxleGNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotCQkJPC9zcmNmaWxlcz4KLQkJPC91cHRvZGF0ZT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InBhY2thZ2UubW9kdWxlLndlYiI+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS53YXIiPiAKLQkJCTx6aXBmaWxlc2V0IGRpcj0iJHttb2R1bGUuZGlyfSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi53YXIiLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0JPC90YXJnZXQ+Ci0JCQotCTx0YXJnZXQgbmFtZT0icGFja2FnZS5tb2R1bGUuZWpiIj4KLQkJPGphciBkZXN0ZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciI+IAotCQkJPHppcGZpbGVzZXQgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0JPC90YXJnZXQ+Ci0JCQotCTx0YXJnZXQgbmFtZT0icGFja2FnZS5tb2R1bGUuZWFyIj4KLQkJPGphciBkZXN0ZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciI+IAotCQkJPHppcGZpbGVzZXQgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0JPC90YXJnZXQ+CQotCQotCTx0YXJnZXQgbmFtZT0iZGVwbG95LmoyZWUud2ViIiBkZXBlbmRzPSJjaGVjay5za2lwLndlYi5kZXBsb3kiIHVubGVzcz0ic2tpcC5kZXBsb3kiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InBhY2thZ2UubW9kdWxlLndlYiIvPgotCQk8b3JhY2xlOmRlcGxveQotCQkJZGVwbG95ZXJVcmk9IiR7ZGVwbG95ZXIudXJpfSIgCi0JCQl1c2VySWQ9IiR7b2M0ai5hZG1pbi51c2VyfSIKLQkJCXBhc3N3b3JkPSIke29jNGouYWRtaW4ucGFzc3dvcmR9IgotCQkJZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LndhciIKLQkJCWRlcGxveW1lbnROYW1lPSIke21vZHVsZS5uYW1lfSIKLQkJCWNvbnRleHRSb290PSIke21vZHVsZS5uYW1lfSIKLQkJCWJpbmRBbGxXZWJBcHBzPSIke29jNGouYmluZC53ZWJzaXRlfSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZGVwbG95LmoyZWUuZWpiIiBkZXBlbmRzPSJjaGVjay5za2lwLmVqYi5kZXBsb3kiIHVubGVzcz0ic2tpcC5kZXBsb3kiID4KLQkJPGFudGNhbGwgdGFyZ2V0PSJwYWNrYWdlLm1vZHVsZS5lamIiLz4KLQkJPG9yYWNsZTpkZXBsb3kKLQkJCWRlcGxveWVyVXJpPSIke2RlcGxveWVyLnVyaX0iIAotCQkJdXNlcklkPSIke29jNGouYWRtaW4udXNlcn0iCi0JCQlwYXNzd29yZD0iJHtvYzRqLmFkbWluLnBhc3N3b3JkfSIKLQkJCWZpbGU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiCi0JCQlkZXBsb3ltZW50TmFtZT0iJHttb2R1bGUubmFtZX0iCi0JCQliaW5kQWxsV2ViQXBwcz0iJHtvYzRqLmJpbmQud2Vic2l0ZX0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLmVhciIgZGVwZW5kcz0iY2hlY2suc2tpcC5lYXIuZGVwbG95IiB1bmxlc3M9InNraXAuZGVwbG95Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJwYWNrYWdlLm1vZHVsZS5lYXIiLz4KLQkJCi0JCTxvcmFjbGU6ZGVwbG95Ci0JCQlkZXBsb3llclVyaT0iJHtkZXBsb3llci51cml9IiAKLQkJCXVzZXJJZD0iJHtvYzRqLmFkbWluLnVzZXJ9IgotCQkJcGFzc3dvcmQ9IiR7b2M0ai5hZG1pbi5wYXNzd29yZH0iCQkJCi0JCQlmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIgotCQkJZGVwbG95bWVudE5hbWU9IiR7bW9kdWxlLm5hbWV9IgotCQkJYmluZEFsbFdlYkFwcHM9IiR7b2M0ai5iaW5kLndlYnNpdGV9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLm1vZHVsZSI+Ci0JCTxvcmFjbGU6dW5kZXBsb3kKLQkJCWRlcGxveWVyVXJpPSIke2RlcGxveWVyLnVyaX0iCi0JCQl1c2VySWQ9IiR7b2M0ai5hZG1pbi51c2VyfSIKLQkJCXBhc3N3b3JkPSIke29jNGouYWRtaW4ucGFzc3dvcmR9IgotCQkJZGVwbG95bWVudE5hbWU9IiR7bW9kdWxlLm5hbWV9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL2J1aWxkZmlsZXMvb3JhY2xlL2FudC1vcmFjbGUuMTAxM2RwNC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL2J1aWxkZmlsZXMvb3JhY2xlL2FudC1vcmFjbGUuMTAxM2RwNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZTg1OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai9idWlsZGZpbGVzL29yYWNsZS9hbnQtb3JhY2xlLjEwMTNkcDQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPHByb2plY3QgbmFtZT0iYW50dGFza3MiPgotCi0gICAgPCEtLVRoaXMgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBmb3IgdXNlIGJ5IHRoZSBPcmFjbGUgRWNsaXBzZSBXVFAgcGx1Z2luLiAJLS0+Ci0gICAgCi0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4gICAgIAotCQotICAgIDxwcm9wZXJ0eSBuYW1lPSJKMkVFX0hPTUUiIHZhbHVlPSIke09DNEpfSE9NRX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iT1JBQ0xFX0hPTUUiIHZhbHVlPSIke09DNEpfSE9NRX0vLi4vLi4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iSkFWQV9IT01FIiB2YWx1ZT0iJHtqYXZhLmhvbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Ik9KREtfSE9NRSIgdmFsdWU9IiR7T1JBQ0xFX0hPTUV9L2pkayIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJUT1BMSU5LX0hPTUUiIHZhbHVlPSIke2Vudi5UT1BMSU5LX0hPTUV9Ii8+Ci0KLSAgICA8IS0tIElmIHlvdXIgT1MgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgICAgIENvbW1lbnQgb3V0IHRoZSAzIGxpbmVzIGFib3ZlLCBhbmQgdW4tY29tbWVudCB0aGUgMgotICAgICAgICAgYmVsb3cuIC0tPgotICAgIDwhLS0KLSAgICA8cHJvcGVydHkgbmFtZT0iSkFWQV9IT01FIiB2YWx1ZT0iZDpcUHJvZ3JhbSBGaWxlc1xqZGsxMzEiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iT0M0Sl9IT01FIiB2YWx1ZT0iZDpcQXBwc1xPQzRKdjIiLz4KLSAgICAtLT4KLQotICAgIDwhLS0gUnVudGltZSBjbGFzc3BhdGggZm9yIEoyRUUgYmFzZWQgYXBwbGljYXRpb25zIC0tPgotICAgIDxwYXRoIGlkPSJjb21tb24uajJlZS5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vamRiYy9saWIvY2xhc3NlczEyLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9vYzRqLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9saWIvam5kaS5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2VqYi5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL3NlcnZsZXQuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vamRrL2pyZS9saWIvZXh0L2p0YS5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2pkYmMuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi9idWlsZCIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9saWIvam1zLmphciIvPgotICAgIDwvcGF0aD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9uLmoyZWUuY2xhc3MucGF0aCIgcmVmaWQ9ImNvbW1vbi5qMmVlLmNsYXNzLnBhdGgiLz4KLQotICAgIDwhLS0gUnVudGltZSBjbGFzc3BhdGggZm9yIHdlYnNlcnZpY2VzIGFwcGxpY2F0aW9ucy4gLS0+Ci0gICAgPHBhdGggaWQ9ImNvbW1vbi53ZWJzZXJ2aWNlcy5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2pheC1xbmFtZS1uYW1lc3BhY2UuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L2xpYi9hY3RpdmF0aW9uLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9saWIvbWFpbC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2h0dHBfY2xpZW50LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L2xpYi94bWxwYXJzZXJ2Mi5qYXIiLz4KLSAgICAgICAgCi0gICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L2psaWIvb3NkdF93c3MuamFyIi8+Ci0gICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L2psaWIvb3NkdF94bWxzZWMuamFyIi8+Ci0gICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L2psaWIvb3NkdF9jZXJ0LmphciIvPgotICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS9qbGliL29zZHRfY29yZS5qYXIiLz4KLSAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vamxpYi9vc2R0X3NhbWwuamFyIi8+Ci0gICAgICAgICAKLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS93ZWJzZXJ2aWNlcy9saWIvd3NzZXJ2ZXIuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vd2Vic2VydmljZXMvbGliL3dzY2xpZW50LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi93c3NlY3VyaXR5LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9kb200ai5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS93ZWJzZXJ2aWNlcy9saWIvY29tbW9ucy1sb2dnaW5nLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9qYXhycGMtYXBpLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9qYXhycGMuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vd2Vic2VydmljZXMvbGliL3NhYWotYXBpLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9vcmFzYWFqLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi94c2RsaWIuamFyIi8+Ci0gICAgPC9wYXRoPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb24ud2Vic2VydmljZXMuY2xhc3MucGF0aCIgcmVmaWQ9ImNvbW1vbi53ZWJzZXJ2aWNlcy5jbGFzcy5wYXRoIi8+Ci0KLSAgICA8IS0tIE9DNEogdGFza3MgY2xhc3NwYXRoLiAgLS0+Ci0gICAgPHBhdGggaWQ9ImNvbW1vbi50YXNrcy5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS9hbnQvbGliL2FudC1vcmFjbGUuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L2xpYi9qYXZheDg4LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9hZG1pbl9jbGllbnQuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L29jNGpjbGllbnQuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vd2Vic2VydmljZXMvbGliL3dzYS5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2JjZWwuamFyIi8+Ci0gICAgPC9wYXRoPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb24udGFza3MuY2xhc3MucGF0aCIgcmVmaWQ9ImNvbW1vbi50YXNrcy5jbGFzcy5wYXRoIi8+Ci0KLSAgICA8IS0tIFRhcmdldCBmb3IgZGlzcGxheWluZyBidWlsZCBpbmZvcm1hdGlvbi4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21tb24iPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZE5hbWU6ICR7YW50LnByb2plY3QubmFtZX0iLz4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRIb21lOiAke2Jhc2VkaXJ9Ii8+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IkJ1aWxkRmlsZTogJHthbnQuZmlsZX0iLz4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRKVk06ICR7YW50LmphdmEudmVyc2lvbn0iLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGFzayBkZWZpbml0aW9ucyBmb3Igb2M0aiBkZXBsb3ltZW50IHRhc2tzIC0tPgotICAgIDx0YXNrZGVmIHJlc291cmNlPSJvcmFjbGUvYW50bGliLnhtbCIgdXJpPSJhbnRsaWI6b3JhY2xlIiBsb2FkZXJSZWY9Im9yYWNsZS50YXNrcy5sb2FkZXIiPgotICAgIAk8Y2xhc3NwYXRoPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y29tbW9uLnRhc2tzLmNsYXNzLnBhdGh9Ii8+IAotICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L3Rhc2tkZWY+Ci0KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai9idWlsZGZpbGVzL29yYWNsZS9hbnQtb3JhY2xlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovYnVpbGRmaWxlcy9vcmFjbGUvYW50LW9yYWNsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzgwODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai9idWlsZGZpbGVzL29yYWNsZS9hbnQtb3JhY2xlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTxwcm9qZWN0IG5hbWU9ImFudHRhc2tzIj4KLQotICAgIDwhLS1UaGlzIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgZm9yIHVzZSBieSB0aGUgT3JhY2xlIEVjbGlwc2UgV1RQIHBsdWdpbi4gCS0tPiAgICAKLSAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPiAgICAgCi0KLSAgICA8cHJvcGVydHkgbmFtZT0iSjJFRV9IT01FIiB2YWx1ZT0iJHtPQzRKX0hPTUV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Ik9SQUNMRV9IT01FIiB2YWx1ZT0iJHtPQzRKX0hPTUV9Ly4uLy4uIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9IkpBVkFfSE9NRSIgdmFsdWU9IiR7amF2YS5ob21lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJPSkRLX0hPTUUiIHZhbHVlPSIke09SQUNMRV9IT01FfS9qZGsiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iVE9QTElOS19IT01FIiB2YWx1ZT0iJHtlbnYuVE9QTElOS19IT01FfSIvPgotCQotICAgIDwhLS0gUnVudGltZSBjbGFzc3BhdGggZm9yIEoyRUUgYmFzZWQgYXBwbGljYXRpb25zIC0tPgotICAgIDxwYXRoIGlkPSJjb21tb24uajJlZS5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vamRiYy9saWIvb2pkYmMxNGRtcy5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vb2M0ai5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2VqYi5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL3NlcnZsZXQuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L2xpYi9qdGEuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L2xpYi9qbXMuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L2xpYi9qYXZheDg4LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9saWIvamF2YXg3Ny5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2pteHJpLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9saWIvam14X3JlbW90ZV9hcGkuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi9idWlsZCIvPgotICAgIDwvcGF0aD4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9uLmoyZWUuY2xhc3MucGF0aCIgcmVmaWQ9ImNvbW1vbi5qMmVlLmNsYXNzLnBhdGgiLz4KLQotICAgIDwhLS0gUnVudGltZSBjbGFzc3BhdGggZm9yIHdlYnNlcnZpY2VzIGFwcGxpY2F0aW9ucy4gLS0+Ci0gICAgPHBhdGggaWQ9ImNvbW1vbi53ZWJzZXJ2aWNlcy5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2pheC1xbmFtZS1uYW1lc3BhY2UuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtKMkVFX0hPTUV9L2xpYi9hY3RpdmF0aW9uLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7SjJFRV9IT01FfS9saWIvbWFpbC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke0oyRUVfSE9NRX0vbGliL2h0dHBfY2xpZW50LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L2xpYi94bWxwYXJzZXJ2Mi5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS9qbGliL29qcHdzcy5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS9qbGliL29qcHhtbC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS9qbGliL29qcHNlLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L2psaWIvb2pwc2FtbC5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS93ZWJzZXJ2aWNlcy9saWIvd3NzZXJ2ZXIuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vd2Vic2VydmljZXMvbGliL3dzY2xpZW50LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi93c3NlY3VyaXR5LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9kb200ai5qYXIiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS93ZWJzZXJ2aWNlcy9saWIvY29tbW9ucy1sb2dnaW5nLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9qYXhycGMtYXBpLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9qYXhycGMuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtPUkFDTEVfSE9NRX0vd2Vic2VydmljZXMvbGliL3NhYWotYXBpLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi9vcmFzYWFqLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7T1JBQ0xFX0hPTUV9L3dlYnNlcnZpY2VzL2xpYi94c2RsaWIuamFyIi8+Ci0gICAgPC9wYXRoPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb24ud2Vic2VydmljZXMuY2xhc3MucGF0aCIgcmVmaWQ9ImNvbW1vbi53ZWJzZXJ2aWNlcy5jbGFzcy5wYXRoIi8+Ci0KLSAgICA8IS0tIE9DNEogdGFza3MgY2xhc3NwYXRoLiAgLS0+Ci0gICAgPHBhdGggaWQ9ImNvbW1vbi50YXNrcy5jbGFzcy5wYXRoIj4KLSAgICAJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke09SQUNMRV9IT01FfS9hbnQvbGliL2FudC1vcmFjbGUuamFyIi8+Ci0gICAgPC9wYXRoPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb24udGFza3MuY2xhc3MucGF0aCIgcmVmaWQ9ImNvbW1vbi50YXNrcy5jbGFzcy5wYXRoIi8+Ci0KLSAgICA8IS0tIFRhcmdldCBmb3IgZGlzcGxheWluZyBidWlsZCBpbmZvcm1hdGlvbi4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21tb24iPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZE5hbWU6ICR7YW50LnByb2plY3QubmFtZX0iLz4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRIb21lOiAke2Jhc2VkaXJ9Ii8+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IkJ1aWxkRmlsZTogJHthbnQuZmlsZX0iLz4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRKVk06ICR7YW50LmphdmEudmVyc2lvbn0iLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGFzayBkZWZpbml0aW9ucyBmb3Igb2M0aiBkZXBsb3ltZW50IHRhc2tzIC0tPgotICAgIDx0YXNrZGVmIHJlc291cmNlPSJvcmFjbGUvYW50bGliLnhtbCIgdXJpPSJhbnRsaWI6b3JhY2xlIiBsb2FkZXJSZWY9Im9yYWNsZS50YXNrcy5sb2FkZXIiPgotICAgIAk8Y2xhc3NwYXRoPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y29tbW9uLnRhc2tzLmNsYXNzLnBhdGh9Ii8+IAotICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICA8L3Rhc2tkZWY+Ci0KLSAgICA8IS0tIFRhc2sgZGVmaW5pdGlvbnMgZm9yIG9jNGogd2Vic2VydmljZXMgdGFza3MgLS0+Ci0gICAgPHRhc2tkZWYgcmVzb3VyY2U9Im9yYWNsZS9hbnRsaWIueG1sIiB1cmk9ImFudGxpYjpvcmFjbGUiIGxvYWRlclJlZj0ib3JhY2xlLnRhc2tzLmxvYWRlciI+Ci0gICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtjb21tb24udGFza3MuY2xhc3MucGF0aH0iLz4KLSAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgPC90YXNrZGVmPgkKLQkKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovaWNvbnMvb2JqMTYvb3JhY2xlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovaWNvbnMvb2JqMTYvb3JhY2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxYWUzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL2ljb25zL29iajE2L29yYWNsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3YmM2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0jIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgICAgICAgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPSBPQzRKIEdlbmVyaWMgc2VydmVyIGRlZmluaXRpb25zCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbkRlc2NyaXB0aW9uPVByb3ZpZGVzIE9DNEogR2VuZXJpYyBzZXJ2ZXIgZGVmaW5pdGlvbnMKLQotCi0jID09PT09PT09PT09PSBPQzRKIDEwLjEuMyBEUCA0PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9IE9yYWNsZSBPQzRKIHYxMC4xLjMgRFA0IEdlbmVyaWMgU2VydmVyIERlZmluaXRpb24gQ29yZSBQbHVnLWluCi1wbHVnaW5EZXNjcmlwdGlvbj1Qcm92aWRlcyBzZXJ2ZXIgZGVmaW5pdGlvbiBmb3IgT3JhY2xlIE9DNEogU3RhbmRhbG9uZSAxMC4xLjMgRFA0LlwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5Ci1vcmFjbGVDYXRlZ29yeT1PcmFjbGUKLQotb3JhY2xlLjEwXzFfM1ByZXZpZXcucnVudGltZS5uYW1lPU9yYWNsZSBPQzRKIFN0YW5kYWxvbmUgMTAuMS4zIERQNAotb3JhY2xlLjEwXzFfM1ByZXZpZXcucnVudGltZS5kZXNjcmlwdGlvbj1PcmFjbGUgT0M0SiAxMC4xLjMgRFA0IHJ1bnRpbWUKLW9yYWNsZS4xMF8xXzNQcmV2aWV3LnNlcnZlci5uYW1lPU9yYWNsZSBPQzRKIFN0YW5kYWxvbmUgU2VydmVyIDEwLjEuMyBEUDQKLW9yYWNsZS4xMF8xXzNQcmV2aWV3LnNlcnZlci5kZXNjcmlwdGlvbj1PcmFjbGUgT0M0SiBTdGFuZGFsb25lIFNlcnZlciBmb3IgdjEwLjEuMyBcCi1EZXZlbG9wZXIgUHJldmlldyA0IG9uIHRoZSBsb2NhbGhvc3QgdXNpbmcgdGhlIGRlZmF1bHQgaW5zdGFuY2UKLQotIyA9PT09PT09PT09PT0gT0M0SiAxMC4xLjMgPT09PT09PT09PT09PT09PT09PT0KLW9jNGoucGx1Z2luTmFtZT0gT3JhY2xlIE9DNEogdjEwLjEuMyBHZW5lcmljIFNlcnZlciBEZWZpbml0aW9uIENvcmUgUGx1Zy1pbgotb2M0ai5wbHVnaW5EZXNjcmlwdGlvbj1Qcm92aWRlcyBzZXJ2ZXIgZGVmaW5pdGlvbiBmb3IgT3JhY2xlIE9DNEogU3RhbmRhbG9uZSAxMC4xLjMuXAotUHJvdmlkZXMgYmFzaWMgc2VydmVyIGZ1bmN0aW9uYWxpdHkKLQotb3JhY2xlLjEwXzFfMy5ydW50aW1lLm5hbWU9T3JhY2xlIE9DNEogU3RhbmRhbG9uZSAxMC4xLjMKLW9yYWNsZS4xMF8xXzMucnVudGltZS5kZXNjcmlwdGlvbj1PcmFjbGUgT0M0SiAxMC4xLjMgcnVudGltZQotb3JhY2xlLjEwXzFfMy5zZXJ2ZXIubmFtZT1PcmFjbGUgT0M0SiBTdGFuZGFsb25lIFNlcnZlciAxMC4xLjMKLW9yYWNsZS4xMF8xXzMuc2VydmVyLmRlc2NyaXB0aW9uPU9yYWNsZSBPQzRKIFN0YW5kYWxvbmUgU2VydmVyIGZvciB2MTAuMS4zIFwKLW9uIHRoZSBsb2NhbGhvc3QgdXNpbmcgdGhlIGRlZmF1bHQgaW5zdGFuY2UKLQotIyA9PT09PT09PT09PT0gT0M0SiAxMC4xLjMuMSA9PT09PT09PT09PT09PT09PT09PQotb2M0ajEwMTMxLnBsdWdpbk5hbWU9IE9yYWNsZSBPQzRKIHYxMC4xLjMubiBHZW5lcmljIFNlcnZlciBEZWZpbml0aW9uIENvcmUgUGx1Zy1pbgotb2M0ajEwMTMxLnBsdWdpbkRlc2NyaXB0aW9uPVByb3ZpZGVzIHNlcnZlciBkZWZpbml0aW9uIGZvciBPcmFjbGUgT0M0SiBTdGFuZGFsb25lIDEwLjEuMy4xIGFuZCBhYm92ZS5cCi1Qcm92aWRlcyBiYXNpYyBzZXJ2ZXIgZnVuY3Rpb25hbGl0eQotCi1vcmFjbGUuMTBfMV8zXzEucnVudGltZS5uYW1lPU9yYWNsZSBPQzRKIFN0YW5kYWxvbmUgMTAuMS4zLm4KLW9yYWNsZS4xMF8xXzNfMS5ydW50aW1lLmRlc2NyaXB0aW9uPU9yYWNsZSBPQzRKIDEwLjEuMy4xIGFuZCBhYm92ZSBydW50aW1lCi1vcmFjbGUuMTBfMV8zXzEuc2VydmVyLm5hbWU9T3JhY2xlIE9DNEogU3RhbmRhbG9uZSBTZXJ2ZXIgMTAuMS4zLm4KLW9yYWNsZS4xMF8xXzNfMS5zZXJ2ZXIuZGVzY3JpcHRpb249T3JhY2xlIE9DNEogU3RhbmRhbG9uZSBTZXJ2ZXIgZm9yIHYxMC4xLjMuMSBhbmQgYWJvdmUgXAotb24gdGhlIGxvY2FsaG9zdCB1c2luZyB0aGUgZGVmYXVsdCBpbnN0YW5jZQotCi0jIFVJIExhYmVscwotbGFiZWwuajJlZS5ob21lPU9yYWNsZSBKMkVFIEhvbWU6Ci1sYWJlbC5hZG1pbi51c2VyPVVzZXI6IAotbGFiZWwuYWRtaW4ucHc9UGFzc3dvcmQ6Ci1sYWJlbC5ob3N0PUFkZHJlc3M6Ci1sYWJlbC5ob3N0LnBvcnQ9QWRtaW4gUG9ydDoKLWxhYmVsLmh0dHAucG9ydD1IVFRQIFBvcnQ6Ci1sYWJlbC53ZWIuc2l0ZT1XZWIgU2l0ZToKLQotIyA9PT09PT09PT09PT09PSBzZXJ2ZXJkZWYgdHJhbnNsYXRpb25zID09PT09PT09PT09PT09PT0KLUFwcGxpY2F0aW9uU2VydmVyRGlyZWN0b3J5PUFwcGxpY2F0aW9uICZTZXJ2ZXIgRGlyZWN0b3J5Ogotc2VydmVyQWRkcmVzcz1BJmRkcmVzczoKLXNlcnZlclBvcnQ9JlBvcnQ6Ci1qbmRpUG9ydD0mSk5ESSBQb3J0Ogotc2VydmVyY2xhc3NQYXRoPSZDbGFzc3BhdGggVmFyaWFibGU6Ci1zZXJ2ZXJOYW1lPVNlciZ2ZXIgTmFtZToKLXVzZXJuYW1lPVVzZSZyIE5hbWU6Ci1wYXNzd29yZD1QYXNzJndvcmQ6Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiYTQyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZVR5cGVzIj4KLSAgICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZTEwMTMiCi0gICAgICAgbmFtZT0iJW9yYWNsZS4xMF8xXzMucnVudGltZS5uYW1lIgotICAgICAgIGRlc2NyaXB0aW9uPSIlb3JhY2xlLjEwXzFfMy5ydW50aW1lLmRlc2NyaXB0aW9uIgotICAgICAgIHZlbmRvcj0iJW9yYWNsZUNhdGVnb3J5IgotICAgICAgIHZlcnNpb249IjEwLjEuMyIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWUiPgotICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbnM9IjIuMiwgMi4zLCAyLjQiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmVqYiIKLSAgICAgICAgIHZlcnNpb25zPSIxLjEsIDIuMCwgMi4xLCAzLjAiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmVhciIKLSAgICAgICAgIHZlcnNpb25zPSIxLjIsIDEuMywgMS40Ii8+Ci0gICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wLCAxLjUiLz4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPiAKLSAgICAgPC9ydW50aW1lVHlwZT4KLSAgICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZTEwMTMxIgotICAgICAgIG5hbWU9IiVvcmFjbGUuMTBfMV8zXzEucnVudGltZS5uYW1lIgotICAgICAgIGRlc2NyaXB0aW9uPSIlb3JhY2xlLjEwXzFfM18xLnJ1bnRpbWUuZGVzY3JpcHRpb24iCi0gICAgICAgdmVuZG9yPSIlb3JhY2xlQ2F0ZWdvcnkiCi0gICAgICAgdmVyc2lvbj0iMTAuMS4zLjEiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lIj4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb25zPSIyLjIsIDIuMywgMi40LCAyLjUiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmVqYiIKLSAgICAgICAgIHZlcnNpb25zPSIxLjEsIDIuMCwgMi4xLCAzLjAiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmVhciIKLSAgICAgICAgIHZlcnNpb25zPSIxLjIsIDEuMywgMS40LCA1LjAiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgIHZlcnNpb25zPSIxLjAsIDEuNSIvPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+IAotICAgICA8L3J1bnRpbWVUeXBlPiAgICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzIj4KLSAgICAgPHNlcnZlclR5cGUKLSAgICAgICAgICAgYmVoYXZpb3VyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJCZWhhdmlvdXIiCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyIgotICAgICAgICAgICBkZXNjcmlwdGlvbj0iJW9yYWNsZS4xMF8xXzMuc2VydmVyLmRlc2NyaXB0aW9uIgotICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vcmFjbGUxMDEzIgotICAgICAgICAgICBpbml0aWFsU3RhdGU9InN0b3BwZWQiCi0gICAgICAgICAgIGxhdW5jaENvbmZpZ0lkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICAgICAgbGF1bmNoTW9kZXM9InJ1bixkZWJ1ZyIKLSAgICAgICAgICAgbmFtZT0iJW9yYWNsZS4xMF8xXzMuc2VydmVyLm5hbWUiCi0gICAgICAgICAgIHJ1bnRpbWU9InRydWUiCi0gICAgICAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZTEwMTMiCi0gICAgICAgICAgIHN0YXJ0QmVmb3JlUHVibGlzaD0idHJ1ZSIKLSAgICAgICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiPiAgICAgICAgICAgCi0gICAgICA8L3NlcnZlclR5cGU+IAotICAgICA8c2VydmVyVHlwZQotICAgICAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckJlaGF2aW91ciIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXIiCi0gICAgICAgICAgIGRlc2NyaXB0aW9uPSIlb3JhY2xlLjEwXzFfM18xLnNlcnZlci5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgaGFzQ29uZmlndXJhdGlvbj0iZmFsc2UiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub3JhY2xlMTAxMzEiCi0gICAgICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICAgICBsYXVuY2hNb2Rlcz0icnVuLGRlYnVnIgotICAgICAgICAgICBuYW1lPSIlb3JhY2xlLjEwXzFfM18xLnNlcnZlci5uYW1lIgotICAgICAgICAgICBydW50aW1lPSJ0cnVlIgotICAgICAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUxMDEzMSIKLSAgICAgICAgICAgc3RhcnRCZWZvcmVQdWJsaXNoPSJ0cnVlIgotICAgICAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSI+ICAgICAgICAgICAKLSAgICAgIDwvc2VydmVyVHlwZT4gICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmRGcmFnbWVudHMiPgotICAgICA8ZnJhZ21lbnQKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lIgotICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUxMDEzIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4KLSAgICAgPGZyYWdtZW50Ci0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVyIgotICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub3JhY2xlMTAxMyIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQiLz4KLSAgICAgPGZyYWdtZW50Ci0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZSIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMzEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPgotICAgICA8ZnJhZ21lbnQKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXIiCi0gICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vcmFjbGUxMDEzMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQiLz4gICAgICAgICAgICAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4gICAKLSAgICAgPGltYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmltYWdlIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvb3JhY2xlLmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vcmFjbGUxMDEzIiAvPgotICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9vcmFjbGUuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMyIvPgotICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9vcmFjbGUuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9yYWNsZTEwMTMxIiAvPgotICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9vcmFjbGUuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMzEiLz4gICAgICAgICAgICAKLSAgIDwvZXh0ZW5zaW9uPiAgIAotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyI+ICAgCi0gICAgIDxydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lVGFyZ2V0IgotICAgICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMyIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lVGFyZ2V0SGFuZGxlciIvPiAgICAgICAgICAgCi0gICAgIDxydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lVGFyZ2V0IgotICAgICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMzEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZVRhcmdldEhhbmRsZXIiLz4gICAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLnNlcnZlcmRlZmluaXRpb24iPgotCQk8c2VydmVyZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMyIgZGVmaW5pdGlvbmZpbGU9Ii9zZXJ2ZXJzL29yYWNsZS4xMC4xLjMuc2VydmVyZGVmIj4KLQkJPC9zZXJ2ZXJkZWZpbml0aW9uPgotCQk8c2VydmVyZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlMTAxMzEiIGRlZmluaXRpb25maWxlPSIvc2VydmVycy9vcmFjbGUuMTAuMS4zLjEuc2VydmVyZGVmIj4KLQkJPC9zZXJ2ZXJkZWZpbml0aW9uPgkJCQkKLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZSI+Ci0gICAgPC9ydW50aW1lLWNvbXBvbmVudC10eXBlPgotICAgICAgIAotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlIgotICAgICAgIHZlcnNpb249IjEwLjEuMyIvPgotCi0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUiCi0gICAgICAgdmVyc2lvbj0iMTAuMS4zLjEiLz4KLQotICAgIDxhZGFwdGVyPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlIgotICAgICAgICAgICAgLz4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZQotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDbGFzc3BhdGhQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLQotICAgIDxzdXBwb3J0ZWQ+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUiCi0gICAgICAgICB2ZXJzaW9uPSIxMC4xLjMiLz4KLSAgICAgIDxmYWNldCBpZD0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb249IjIuMiwyLjMsMi40Ii8+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC5lamIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEsMi4wLDIuMSIvPgotICAgICAgPGZhY2V0IGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQiLz4KLSAgICAgIDxmYWNldCBpZD0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40Ii8+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICB2ZXJzaW9uPSIxLjUiLz4KLSAgICA8L3N1cHBvcnRlZD4KLSAgICA8c3VwcG9ydGVkPiAgICAKLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZSIKLSAgICAgICAgIHZlcnNpb249IjEwLjEuMy4xIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIsMi4zLDIuNCwyLjUiLz4KLSAgICAgIDxmYWNldCBpZD0ianN0LmVqYiIKLSAgICAgICAgIHZlcnNpb249IjEuMSwyLjAsMi4xLDMuMCIvPgotICAgICAgPGZhY2V0IGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQsNS4wIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC5hcHBjbGllbnQiCi0gICAgICAgICB2ZXJzaW9uPSIxLjIsMS4zLDEuNCIvPgotICAgICAgPGZhY2V0IGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgICAgPGZhY2V0IGlkPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgdmVyc2lvbj0iMS41Ii8+Ci0gICAgPC9zdXBwb3J0ZWQ+ICAgIAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyI+Ci0gICAgPGRlZmF1bHQtZmFjZXRzPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUiLz4KLSAgICAgIDxmYWNldCBpZD0id3N0LmpzZHQud2ViIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L2RlZmF1bHQtZmFjZXRzPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW1hZ2VzIj4KLSAgICA8aW1hZ2UgcnVudGltZS1jb21wb25lbnQtdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlIgotICAgICAgIHBhdGg9Imljb25zL29iajE2L29yYWNsZS5naWYiLz4gICAKLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZSIKLSAgICAgICAgICAgIC8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5SdW50aW1lTGFiZWxQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4gICAKLSAgIDwvZXh0ZW5zaW9uPiAgIAotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUZhY2V0TWFwcGluZ3MiPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUxMDEzIgotICAgICAgcnVudGltZS1jb21wb25lbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZSIKLSAgICAgIHZlcnNpb249IjEwLjEuMyIvPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUxMDEzMSIKLSAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUiCi0gICAgICB2ZXJzaW9uPSIxMC4xLjMuMSIvPiAgICAgIAotICAgIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovc2VydmVycy9vcmFjbGUuMTAuMS4zLjEuc2VydmVyZGVmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai9zZXJ2ZXJzL29yYWNsZS4xMC4xLjMuMS5zZXJ2ZXJkZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOWY5N2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMub2M0ai9zZXJ2ZXJzL29yYWNsZS4xMC4xLjMuMS5zZXJ2ZXJkZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0bnM6U2VydmVyUnVudGltZQotCXhtbG5zOnRucz0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgIgotCW5hbWU9Ik9yYWNsZSBPQzRKIFN0YW5kYWxvbmUgU2VydmVyIHYxMC4xLjMuMSIgdmVyc2lvbj0idjEwLjEuMy4xIj4KLQkKLQk8cHJvcGVydHkgaWQ9Ik9DNEpfSE9NRSIKLQkJbGFiZWwgPSAiJWxhYmVsLmoyZWUuaG9tZSIKLQkJdHlwZT0iZGlyZWN0b3J5IgotCQljb250ZXh0PSJydW50aW1lIgotCQlkZWZhdWx0PSJDOi9vcmFjbGUvT0M0Si0xMC4xLjMuMS9qMmVlL2hvbWUiLz4KLQkJCi0JPHByb3BlcnR5IGlkPSJvYzRqLmFkbWluLnVzZXIiCi0JCWxhYmVsPSIlbGFiZWwuYWRtaW4udXNlciIKLQkJdHlwZT0ic3RyaW5nIgotCQljb250ZXh0PSJzZXJ2ZXIiCi0JCWRlZmF1bHQ9Im9jNGphZG1pbiIgLz4KLQkJCi0JPHByb3BlcnR5IGlkPSJvYzRqLmFkbWluLnBhc3N3b3JkIgotCQlsYWJlbD0iJWxhYmVsLmFkbWluLnB3IgotCQl0eXBlPSJzdHJpbmciCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0id2VsY29tZSIgLz4KLQkJCi0JPHByb3BlcnR5IGlkPSJvYzRqLmFkbWluLnBvcnQiCi0JCWxhYmVsPSIlbGFiZWwuaG9zdC5wb3J0IgotCQl0eXBlPSJzdHJpbmciCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0iMjM3OTEiIC8+Ci0JCQotCTxwcm9wZXJ0eSBpZD0ib2M0ai5odHRwLnBvcnQiCi0JCWxhYmVsPSIlbGFiZWwuaHR0cC5wb3J0IgotCQl0eXBlPSJzdHJpbmciCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0iODg4OCIgLz4JCi0JCQkKLQk8cHJvcGVydHkgaWQ9Im9jNGouYmluZC53ZWJzaXRlIgotCQlsYWJlbD0iJWxhYmVsLndlYi5zaXRlIgotCQl0eXBlPSJzdHJpbmciCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0iZGVmYXVsdC13ZWItc2l0ZSIgLz4KLQkJCi0JPHBvcnQ+Ci0JCTxubz4ke29jNGouaHR0cC5wb3J0fTwvbm8+Ci0JCTxuYW1lPkh0dHA8L25hbWU+Ci0JCTxwcm90b2NvbD5odHRwPC9wcm90b2NvbD4KLQk8L3BvcnQ+Ci0JCi0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LndlYjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHtPQzRKX0hPTUV9L2FwcGxpY2F0aW9uczwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0KLQk8bW9kdWxlPgotCQk8dHlwZT5qc3QuZWpiPC90eXBlPgotCQk8cHVibGlzaERpcj4ke09DNEpfSE9NRX0vYXBwbGljYXRpb25zPC9wdWJsaXNoRGlyPgotCQk8cHVibGlzaGVyUmVmZXJlbmNlPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lYXI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7T0M0Sl9IT01FfS9hcHBsaWNhdGlvbnM8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgkKLQkKLQk8cHJvamVjdD4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5vcmFjbGVfb2M0ajwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvcHJvamVjdD4KLQkKLQk8c3RhcnQgPgotCQk8bWFpbkNsYXNzPm9yYWNsZS5vYzRqLmxvYWRlci5ib290LkJvb3RTdHJhcDwvbWFpbkNsYXNzPgotCQk8d29ya2luZ0RpcmVjdG9yeT4ke09DNEpfSE9NRX08L3dvcmtpbmdEaXJlY3Rvcnk+Ci0JCTxwcm9ncmFtQXJndW1lbnRzPjwvcHJvZ3JhbUFyZ3VtZW50cz4KLQkJPHZtUGFyYW1ldGVycz48L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5vcmFjbGVfYm9vdDwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RhcnQ+Ci0KLQk8c3RvcD4KLQkgICAgPG1haW5DbGFzcz5jb20uZXZlcm1pbmQuY2xpZW50Lm9yaW9uLk9jNGpBZG1pbkNvbnNvbGU8L21haW5DbGFzcz4gCi0JICAgIDx3b3JraW5nRGlyZWN0b3J5PiR7T0M0Sl9IT01FfTwvd29ya2luZ0RpcmVjdG9yeT4gIAotCSAgICA8cHJvZ3JhbUFyZ3VtZW50cz5vcm1pOi8vbG9jYWxob3N0OiR7b2M0ai5hZG1pbi5wb3J0fSAke29jNGouYWRtaW4udXNlcn0gJHtvYzRqLmFkbWluLnBhc3N3b3JkfSAtc2h1dGRvd24gPC9wcm9ncmFtQXJndW1lbnRzPgotCSAgICA8dm1QYXJhbWV0ZXJzPjwvdm1QYXJhbWV0ZXJzPgotCSAgICA8Y2xhc3NwYXRoUmVmZXJlbmNlPm9yYWNsZV9hZG1pbjwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RvcD4KLQkKLQk8cHVibGlzaGVyIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyIj4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+YnVpbGQuZmlsZTwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPi9idWlsZGZpbGVzL29yYWNsZS4xMC4xLjMueG1sPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LndlYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3QuZWFyPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qc3Qud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS5tb2R1bGU8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLm1vZHVsZTwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+CQotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC5lYXI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLm1vZHVsZTwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+CQkKLQk8L3B1Ymxpc2hlcj4KLQotCTxjbGFzc3BhdGggaWQ9Im9yYWNsZV9hZG1pbiI+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9hZG1pbi5qYXIiLz4KLQk8L2NsYXNzcGF0aD4KLQkKLQk8Y2xhc3NwYXRoIGlkPSJvcmFjbGVfYm9vdCI+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9vYzRqLmphciIvPgotCTwvY2xhc3NwYXRoPgotCQotCTxjbGFzc3BhdGggaWQ9Im9yYWNsZV9vYzRqIj4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L29jNGouamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9vYzRqY2xpZW50LmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vb2M0ai1hcGkuamFyIi8+ICAgIAkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvYWN0aXZhdGlvbi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L2xpYi9hc20uamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvYXNtLWF0dHJzLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2Nvbm5lY3Rvci5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L2xpYi9lamIuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvZWpiMzAuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvamFjYy1hcGkuamFyIi8+CQotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2phdmF4NzcuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvamF2YXg4OC5qYXIiLz4JCQotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2pheC1xbmFtZS1uYW1lc3BhY2UuamFyIi8+IAkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvam1zLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2pteF9yZW1vdGVfYXBpLmphciIvPgkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvanRhLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL21haWwuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvb2M0ai11bnN1cHBvcnRlZC1hcGkuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvc2VydmxldC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L2xpYi9vanNwLmphciIvPgotICAgICAgICA8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vanNwL2xpYi90YWdsaWIvb2pzcHV0aWwuamFyIi8+CQkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS8uLi8uLi9saWIveG1scGFyc2VydjIuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS8uLi8uLi90b3BsaW5rL2psaWIvYW50bHIuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS8uLi8uLi90b3BsaW5rL2psaWIvdG9wbGluay5qYXIiLz4JCSAgCQkKLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9Ly4uLy4uL3RvcGxpbmsvamxpYi90b3BsaW5rLWVzc2VudGlhbHMuamFyIi8+CQkgIAkJCQkKLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9Ly4uLy4uL3dlYnNlcnZpY2VzL2xpYi93c2RsLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vLi4vLi4vd2Vic2VydmljZXMvbGliL2pheHItYXBpLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vLi4vLi4vd2Vic2VydmljZXMvbGliL2pheHJwYy1hcGkuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS8uLi8uLi93ZWJzZXJ2aWNlcy9saWIvc2Fhai1hcGkuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS8uLi8uLi93ZWJzZXJ2aWNlcy9saWIvandzLWFwaS5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9Ly4uLy4uL3dlYnNlcnZpY2VzL2xpYi9vcmF3c21ldGFkYXRhLmphciIvPgkJCi0JPC9jbGFzc3BhdGg+Ci0JCi0JPGpuZGlDb25uZWN0aW9uPgotCQk8cHJvdmlkZXJVcmw+b3JtaTovL2xvY2FsaG9zdDoke29jNGouYWRtaW4ucG9ydH08L3Byb3ZpZGVyVXJsPgotCQk8aW5pdGlhbENvbnRleHRGYWN0b3J5PmNvbS5ldmVybWluZC5zZXJ2ZXIucm1pLlJNSUluaXRpYWxDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci0KLTwvdG5zOlNlcnZlclJ1bnRpbWU+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovc2VydmVycy9vcmFjbGUuMTAuMS4zLnNlcnZlcmRlZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm9jNGovc2VydmVycy9vcmFjbGUuMTAuMS4zLnNlcnZlcmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxYzNmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5vYzRqL3NlcnZlcnMvb3JhY2xlLjEwLjEuMy5zZXJ2ZXJkZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0bnM6U2VydmVyUnVudGltZQotCXhtbG5zOnRucz0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgIgotCW5hbWU9Ik9yYWNsZSBPQzRKIFN0YW5kYWxvbmUgU2VydmVyIHYxMC4xLjMiIHZlcnNpb249InYxMC4xLjMiPgotCQotCTxwcm9wZXJ0eSBpZD0iT0M0Sl9IT01FIgotCQlsYWJlbCA9ICIlbGFiZWwuajJlZS5ob21lIgotCQl0eXBlPSJkaXJlY3RvcnkiCi0JCWNvbnRleHQ9InJ1bnRpbWUiCi0JCWRlZmF1bHQ9IkM6L29yYWNsZS9PQzRKMTAuMS4zL2oyZWUvaG9tZSIvPgotCQkKLQk8cHJvcGVydHkgaWQ9Im9jNGouYWRtaW4udXNlciIKLQkJbGFiZWw9IiVsYWJlbC5hZG1pbi51c2VyIgotCQl0eXBlPSJzdHJpbmciCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0ib2M0amFkbWluIiAvPgotCQkKLQk8cHJvcGVydHkgaWQ9Im9jNGouYWRtaW4ucGFzc3dvcmQiCi0JCWxhYmVsPSIlbGFiZWwuYWRtaW4ucHciCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSJ3ZWxjb21lIiAvPgotCQkKLQk8cHJvcGVydHkgaWQ9Im9jNGouYWRtaW4ucG9ydCIKLQkJbGFiZWw9IiVsYWJlbC5ob3N0LnBvcnQiCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSIyMzc5MSIgLz4KLQkJCi0JPHByb3BlcnR5IGlkPSJvYzRqLmh0dHAucG9ydCIKLQkJbGFiZWw9IiVsYWJlbC5odHRwLnBvcnQiCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSI4ODg4IiAvPgkKLQkJCQotCTxwcm9wZXJ0eSBpZD0ib2M0ai5iaW5kLndlYnNpdGUiCi0JCWxhYmVsPSIlbGFiZWwud2ViLnNpdGUiCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSJkZWZhdWx0LXdlYi1zaXRlIiAvPgotCQkKLQk8cG9ydD4KLQkJPG5vPiR7b2M0ai5odHRwLnBvcnR9PC9ubz4KLQkJPG5hbWU+SHR0cDwvbmFtZT4KLQkJPHByb3RvY29sPmh0dHA8L3Byb3RvY29sPgotCTwvcG9ydD4KLQkKLQk8bW9kdWxlPgotCQk8dHlwZT5qc3Qud2ViPC90eXBlPgotCQk8cHVibGlzaERpcj4ke09DNEpfSE9NRX0vYXBwbGljYXRpb25zPC9wdWJsaXNoRGlyPgotCQk8cHVibGlzaGVyUmVmZXJlbmNlPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5lamI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7T0M0Sl9IT01FfS9hcHBsaWNhdGlvbnM8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCi0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LmVhcjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHtPQzRKX0hPTUV9L2FwcGxpY2F0aW9uczwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+CQotCQotCTxwcm9qZWN0PgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPm9yYWNsZV9vYzRqPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9wcm9qZWN0PgotCQotCTxzdGFydCA+Ci0JCTxtYWluQ2xhc3M+b3JhY2xlLm9jNGoubG9hZGVyLmJvb3QuQm9vdFN0cmFwPC9tYWluQ2xhc3M+Ci0JCTx3b3JraW5nRGlyZWN0b3J5PiR7T0M0Sl9IT01FfTwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+PC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPjwvdm1QYXJhbWV0ZXJzPgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPm9yYWNsZV9ib290PC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdGFydD4KLQotCTxzdG9wPgotCSAgICA8bWFpbkNsYXNzPmNvbS5ldmVybWluZC5jbGllbnQub3Jpb24uT2M0akFkbWluQ29uc29sZTwvbWFpbkNsYXNzPiAKLQkgICAgPHdvcmtpbmdEaXJlY3Rvcnk+JHtPQzRKX0hPTUV9PC93b3JraW5nRGlyZWN0b3J5PiAgCi0JICAgIDxwcm9ncmFtQXJndW1lbnRzPm9ybWk6Ly9sb2NhbGhvc3Q6JHtvYzRqLmFkbWluLnBvcnR9ICR7b2M0ai5hZG1pbi51c2VyfSAke29jNGouYWRtaW4ucGFzc3dvcmR9IC1zaHV0ZG93biA8L3Byb2dyYW1Bcmd1bWVudHM+Ci0JICAgIDx2bVBhcmFtZXRlcnM+PC92bVBhcmFtZXRlcnM+Ci0JICAgIDxjbGFzc3BhdGhSZWZlcmVuY2U+b3JhY2xlX2FkbWluPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdG9wPgotCQotCTxwdWJsaXNoZXIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXIiPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT5idWlsZC5maWxlPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+L2J1aWxkZmlsZXMvb3JhY2xlLjEwLjEuMy54bWw8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3Qud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUud2ViPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVqYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmpzdC5lYXI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lYXI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmpzdC53ZWI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLm1vZHVsZTwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUubW9kdWxlPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCi0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUubW9kdWxlPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCQotCTwvcHVibGlzaGVyPgotCi0JPGNsYXNzcGF0aCBpZD0ib3JhY2xlX2FkbWluIj4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L2FkbWluLmphciIvPgotCTwvY2xhc3NwYXRoPgotCQotCTxjbGFzc3BhdGggaWQ9Im9yYWNsZV9ib290Ij4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L29jNGouamFyIi8+Ci0JPC9jbGFzc3BhdGg+Ci0JCi0JPGNsYXNzcGF0aCBpZD0ib3JhY2xlX29jNGoiPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vb2M0ai5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L29jNGpjbGllbnQuamFyIi8+ICAgIAkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvYWN0aXZhdGlvbi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L2xpYi9hc20uamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvYXNtLWF0dHJzLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2Nvbm5lY3Rvci5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9L2xpYi9lamIuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvZWpiMzAuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvamFjYy1hcGkuamFyIi8+CQotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2phdmF4NzcuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvamF2YXg4OC5qYXIiLz4JCQotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2pheC1xbmFtZS1uYW1lc3BhY2UuamFyIi8+IAkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvam1zLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL2pteF9yZW1vdGVfYXBpLmphciIvPgkJCi0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvanRhLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vbGliL21haWwuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvb2M0ai11bnN1cHBvcnRlZC1hcGkuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS9saWIvc2VydmxldC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9Ly4uLy4uL2xpYi94bWxwYXJzZXJ2Mi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9Ly4uLy4uL3RvcGxpbmsvamxpYi9hbnRsci5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHtPQzRKX0hPTUV9Ly4uLy4uL3RvcGxpbmsvamxpYi90b3BsaW5rLmphciIvPgkJICAJCQotCQk8YXJjaGl2ZSBwYXRoPSIke09DNEpfSE9NRX0vLi4vLi4vd2Vic2VydmljZXMvbGliL3NvYXAuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7T0M0Sl9IT01FfS8uLi8uLi93ZWJzZXJ2aWNlcy9saWIvd3NkbC5qYXIiLz4JCQotCTwvY2xhc3NwYXRoPgotCQotCTxqbmRpQ29ubmVjdGlvbj4KLQkJPHByb3ZpZGVyVXJsPm9ybWk6Ly9sb2NhbGhvc3Q6JHtvYzRqLmFkbWluLnBvcnR9PC9wcm92aWRlclVybD4KLQkJPGluaXRpYWxDb250ZXh0RmFjdG9yeT5jb20uZXZlcm1pbmQuc2VydmVyLnJtaS5STUlJbml0aWFsQ29udGV4dEZhY3Rvcnk8L2luaXRpYWxDb250ZXh0RmFjdG9yeT4KLQkJPGpuZGlQcm9wZXJ0eT4KLQkJCTxuYW1lPjwvbmFtZT4KLQkJCTx2YWx1ZT48L3ZhbHVlPgotCQk8L2puZGlQcm9wZXJ0eT4KLQk8L2puZGlDb25uZWN0aW9uPgotCi08L3RuczpTZXJ2ZXJSdW50aW1lPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4MzlhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotZ2VuZXJpY3VpLmphcgotb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpXzEuMC4wLmphcgotdGVtcC5mb2xkZXIKLWdlbmVyaWN1aXNyYy56aXAKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTRiYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmE4Mzg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBKYW4gMjEgMTQ6MzM6MDYgRUVUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZGMxN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMzA1LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNVaVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOWVjNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2ljb25zL29iajE2L3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9pY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFhZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2ljb25zL29iajE2L3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9pY29ucy93aXpiYW4vbmV3X3NlcnZlcl93aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvaWNvbnMvd2l6YmFuL25ld19zZXJ2ZXJfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NTY3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9pY29ucy93aXpiYW4vbmV3X3NlcnZlcl93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwNWJlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1HZW5lcmljIFNlcnZlciBQbHVnaW4gVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luRGVzY3JpcHRpb249VUkgQ29tcG9uZW50cyBmb3IgdGhlIGdlbmVyaWMgc2VydmVyIHBsdWdpbi4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZDBhNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0gICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkFudFB1Ymxpc2hlclByb3BlcnR5VGVzdGVyIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmFudFB1Ymxpc2hlclRlc3RlciIKLSAgICAgICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkiCi0gICAgICAgICAgIHByb3BlcnRpZXM9ImlzQW50UHVibGlzaGVyIgotICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KLSAgICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlcyI+Ci0gICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZSIKLSAgICAgIGNvbmZpZ1R5cGVJRD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICBpY29uPSJpY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmIj4KLSAgICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2U+Ci0gICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UudWkuRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlIgotICAgICAgY29uZmlnVHlwZUlEPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvc2VydmVyLmdpZiI+Ci0gICAgPC9sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cHMiPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAiPgotICAgICAgPGxhdW5jaE1vZGUKLSAgICAgICAgICAgIG1vZGU9InJ1biI+Ci0gICAgICA8L2xhdW5jaE1vZGU+Ci0gICAgICA8bGF1bmNoTW9kZQotICAgICAgICAgICAgbW9kZT0iZGVidWciPgotICAgICAgPC9sYXVuY2hNb2RlPgotICAgICAgPGxhdW5jaE1vZGUKLSAgICAgICAgICAgIG1vZGU9InByb2ZpbGUiPgotICAgICAgPC9sYXVuY2hNb2RlPiAgICAgIAotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAiPgotICAgICAgPGxhdW5jaE1vZGUKLSAgICAgICAgICAgIG1vZGU9InJ1biI+Ci0gICAgICA8L2xhdW5jaE1vZGU+Ci0gICAgICA8bGF1bmNoTW9kZQotICAgICAgICAgICAgbW9kZT0iZGVidWciPgotICAgICAgPC9sYXVuY2hNb2RlPiAgICAgIAotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3JQYWdlU2VjdGlvbnMiPgotICAgICAgPHNlY3Rpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuZWRpdG9yLnNlcnZlclByb3BlcnRpZXMiCi0gICAgICAgICBvcmRlcj0iMTAiCi0gICAgICAgICBpbnNlcnRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXcubGVmdCIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy4qIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyUHJvcGVydGllc0VkaXRvclNlY3Rpb24iPgotICAgICAgPC9zZWN0aW9uPgotICAgICAgPHNlY3Rpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuZWRpdG9yLmFudEJ1aWRGaWxlU2VsZWN0aW9uIgotICAgICAgICAgb3JkZXI9IjEiCi0gICAgICAgICBpbnNlcnRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXcucmlnaHQiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuKiIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuZWRpdG9yLkFudEJ1aWxkRmlsZVNlbGVjdGlvbkVkaXRvclNlY3Rpb24iPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaXNBbnRQdWJsaXNoZXIiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0FudFB1Ymxpc2hlclByb3BlcnR5VGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0FudFB1Ymxpc2hlclByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNGI2NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9BbnRQdWJsaXNoZXJQcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5TZXJ2ZXJUeXBlRGVmaW5pdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVycy5BbnRQdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0KLXB1YmxpYyBjbGFzcyBBbnRQdWJsaXNoZXJQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQotCXB1YmxpYyBBbnRQdWJsaXNoZXJQcm9wZXJ0eVRlc3RlcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywKLQkJCU9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0JCWlmIChyZWNlaXZlciBpbnN0YW5jZW9mIElTZXJ2ZXJXb3JraW5nQ29weSApIHsKLQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IChJU2VydmVyV29ya2luZ0NvcHkpcmVjZWl2ZXI7Ci0JCQlTZXJ2ZXJSdW50aW1lIHJ1bnRpbWVEZWZpbml0aW9uID0gU2VydmVyVHlwZURlZmluaXRpb25VdGlsLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKHdjLmdldFJ1bnRpbWUoKSk7Ci0JCQlpZiAoIHJ1bnRpbWVEZWZpbml0aW9uICE9IG51bGwgKXsKLQkJCQlMaXN0IGwgPSBydW50aW1lRGVmaW5pdGlvbi5nZXRQdWJsaXNoZXIoKTsKLQkJCQlJdGVyYXRvciByID0gbC5pdGVyYXRvcigpOwotCQkJCXdoaWxlICggci5oYXNOZXh0KCkgKXsKLQkJCQkJUHVibGlzaGVyIHB1Ymxpc2hlciA9IChQdWJsaXNoZXIpIHIubmV4dCgpOwotCQkJCQlpZiAoQW50UHVibGlzaGVyLlBVQkxJU0hFUl9JRC5lcXVhbHMoIHB1Ymxpc2hlci5nZXRJZCgpICkpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDhjYmI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQ29tbW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkVudmlyb25tZW50VGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLnNvdXJjZWxvb2t1cC5Tb3VyY2VMb29rdXBUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLkphdmFBcmd1bWVudHNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUudXRpbC5FeHRlbnNpb25Qb2ludFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwewotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCBJTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwI2NyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2csIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUYWJzKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nIGRpYWxvZywgU3RyaW5nIG1vZGUpIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXSB0YWJzID0gbmV3IElMYXVuY2hDb25maWd1cmF0aW9uVGFiWzVdOwotCQl0YWJzWzBdID0gbmV3IFNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWIoZ2V0VHlwZUlkcygpKTsKLQkJdGFic1swXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbMV0gPSBuZXcgSmF2YUFyZ3VtZW50c1RhYigpOwotCQl0YWJzWzFdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1syXSA9IG5ldyBTb3VyY2VMb29rdXBUYWIoKTsKLQkJdGFic1syXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbM10gPSBuZXcgRW52aXJvbm1lbnRUYWIoKTsKLQkJdGFic1szXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbNF0gPSBuZXcgQ29tbW9uVGFiKCk7Ci0JCXRhYnNbNF0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQlzZXRUYWJzKHRhYnMpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0VHlwZUlkcygpIAotCXsKLQkgICByZXR1cm4gRXh0ZW5zaW9uUG9pbnRVdGlsLmdldFNlcnZlclR5cGVzRnJvbUxhdW5jaENvbmZpZyggIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiICk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY0xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZWFlNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkNvbW1vblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5FbnZpcm9ubWVudFRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5zb3VyY2Vsb29rdXAuU291cmNlTG9va3VwVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhQXJndW1lbnRzVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhQ2xhc3NwYXRoVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhSlJFVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5jb3JlLnV0aWwuRXh0ZW5zaW9uUG9pbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwewotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCBJTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwI2NyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2csIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVUYWJzKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nIGRpYWxvZywgU3RyaW5nIG1vZGUpIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXSB0YWJzID0gbmV3IElMYXVuY2hDb25maWd1cmF0aW9uVGFiWzddOwotCQl0YWJzWzBdID0gbmV3IFNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWIoZ2V0VHlwZUlkcygpKTsKLQkJdGFic1swXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbMV0gPSBuZXcgSmF2YUFyZ3VtZW50c1RhYigpOwotCQl0YWJzWzFdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1syXSA9IG5ldyBKYXZhQ2xhc3NwYXRoVGFiKCk7Ci0JCXRhYnNbMl0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzNdID0gbmV3IFNvdXJjZUxvb2t1cFRhYigpOwotCQl0YWJzWzNdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1s0XSA9IG5ldyBFbnZpcm9ubWVudFRhYigpOwotCQl0YWJzWzRdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1s1XSA9IG5ldyBKYXZhSlJFVGFiKCk7Ci0JCXRhYnNbNV0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwkgCi0JCXRhYnNbNl0gPSBuZXcgQ29tbW9uVGFiKCk7Ci0JCXRhYnNbNl0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQlzZXRUYWJzKHRhYnMpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKLQkgICAgcmV0dXJuIEV4dGVuc2lvblBvaW50VXRpbC5nZXRTZXJ2ZXJUeXBlc0Zyb21MYXVuY2hDb25maWcoICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIgKTsgLy8kTk9OLU5MUy0xJAl9Ci0JCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5MzY5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXByaXZhdGUgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZURlY29yYXRvcltdIGZEZWNvcmF0b3JzOwotCXB1YmxpYyBHZW5lcmljU2VydmVyQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3JbXSBkZWNvcmF0b3JzKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlmRGVjb3JhdG9ycyA9IGRlY29yYXRvcnM7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID1uZXcgR3JpZExheW91dCgzLGZhbHNlKTsgCi0JCXNldExheW91dChsYXlvdXQpOwotICAgICAgICBzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9sKCl7Ci0JCWZvciAoaW50IGkgPSAwOyBmRGVjb3JhdG9ycyE9IG51bGwgJiYgaSA8IGZEZWNvcmF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmRGVjb3JhdG9yc1tpXS5kZWNvcmF0ZSh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckNvbXBvc2l0ZURlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjM4YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbDsKLQotCi0vKioKLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGludGVyZmFjZSBHZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yIAotewotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZWNvcmF0ZShHZW5lcmljU2VydmVyQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0gICAgLyoqCi0JICogQ2FsbGVkIGlmIGFsbCB0aGUgZmllbGRzIGFyZSB2YWxpZC4gVGhpcyBnaXZlcyBzdWJjbGFzc2VzIG9wcG9ydHVuaXR5IHRvCi0JICogdmFsaWRhdGUgYW5kIHRha2UgbmVjZXNzYXJ5IGFjdGlvbnMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdmFsaWRhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTU4OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JSW5zdGFsbGFibGVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotCi0vKioKLSAqIEEgc2VydmVyRGVmaW5pdGlvblR5cGUgYXdhcmUgd2l6YXJkIGZvciBkZWZpbmluZyBydW50aW1lcy4KLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcwotICAgICAgICBTZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQgewotCi0gICAgcHJpdmF0ZSBHZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yW10gZkRlY29yYXRvcnM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBHZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEZyYWdtZW50I2lzQ29tcGxldGUoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0gICAgICAgIFJ1bnRpbWVEZWxlZ2F0ZSBydW50aW1lID0gZ2V0UnVudGltZURlbGVnYXRlKCk7Ci0gICAgICAgIGlmKCBydW50aW1lID09IG51bGwgKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IHJ1bnRpbWUudmFsaWRhdGUoKTsKLSAgICAgICAgcmV0dXJuIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuaXNPSygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50KCBDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSApIHsKLSAgICAgICAgTWFwIHByb3BlcnRpZXMgPSBudWxsOwotICAgICAgICBTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBudWxsOwotICAgICAgICBpZiggZ2V0UnVudGltZURlbGVnYXRlKCkgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBnZXRSdW50aW1lRGVsZWdhdGUoKS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbiggZ2V0U2VydmVyRGVmaW5pdGlvbklkKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgKTsKLSAgICAgICAgfQotICAgICAgICBJSW5zdGFsbGFibGVSdW50aW1lIGlyID0gU2VydmVyUGx1Z2luCi0gICAgICAgICAgICAgICAgLmZpbmRJbnN0YWxsYWJsZVJ1bnRpbWUoIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpLmdldFJ1bnRpbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSApOwotICAgICAgICBpZiggaXIgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZEZWNvcmF0b3JzID0gbmV3IEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3JbM107Ci0gICAgICAgICAgICBmRGVjb3JhdG9yc1swXSA9IG5ldyBKUkVTZWxlY3REZWNvcmF0b3IoIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpLCBnZXRXaXphcmQoKSApOwotICAgICAgICAgICAgZkRlY29yYXRvcnNbMV0gPSBuZXcgU2VydmVyVHlwZURlZmluaXRpb25SdW50aW1lRGVjb3JhdG9yKAotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBwcm9wZXJ0aWVzLCBnZXRXaXphcmQoKSwgZ2V0UnVudGltZURlbGVnYXRlKCkgKTsKLSAgICAgICAgICAgIGZEZWNvcmF0b3JzWzJdID0gbmV3IEluc3RhbGxhYmxlUnVudGltZURlY29yYXRvciggZ2V0V2l6YXJkKCksCi0gICAgICAgICAgICAgICAgICAgIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpICk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmRGVjb3JhdG9ycyA9IG5ldyBHZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yWzJdOwotICAgICAgICAgICAgZkRlY29yYXRvcnNbMF0gPSBuZXcgSlJFU2VsZWN0RGVjb3JhdG9yKCBnZXRSdW50aW1lRGVsZWdhdGUoKSwgZ2V0V2l6YXJkKCkgKTsKLSAgICAgICAgICAgIGZEZWNvcmF0b3JzWzFdID0gbmV3IFNlcnZlclR5cGVEZWZpbml0aW9uUnVudGltZURlY29yYXRvcigKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgcHJvcGVydGllcywgZ2V0V2l6YXJkKCksIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBuZXcgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZSggcGFyZW50LCBmRGVjb3JhdG9ycyApOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlcnZlckRlZmluaXRpb25JZCgpIHsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnREZWZpbml0aW9uID0gbnVsbDsKLSAgICAgICAgaWYoIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpICE9IG51bGwgKQotICAgICAgICAgICAgY3VycmVudERlZmluaXRpb24gPSBnZXRSdW50aW1lRGVsZWdhdGUoKS5nZXRSdW50aW1lKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgaWYoIGN1cnJlbnREZWZpbml0aW9uICE9IG51bGwgJiYgY3VycmVudERlZmluaXRpb24ubGVuZ3RoKCkgPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREZWZpbml0aW9uOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEZyYWdtZW50I2VudGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgaWYoIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpICE9IG51bGwgKQotICAgICAgICAgICAgZ2V0UnVudGltZURlbGVnYXRlKCkuZ2V0UnVudGltZVdvcmtpbmdDb3B5KCkuc2V0TmFtZSggY3JlYXRlTmFtZSgpICk7Ci0KLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBmRGVjb3JhdG9ycy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBmRGVjb3JhdG9yc1tpXS52YWxpZGF0ZSgpICkvL2ZhaWxlZCBkbyBub3QgY29udGludWUKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGl0KCkgewotICAgICAgICAvLyB2YWxpZGF0ZSB0byBzYXZlIGxhdGVzdCB2YWx1ZXMKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBmRGVjb3JhdG9ycy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBmRGVjb3JhdG9yc1tpXS52YWxpZGF0ZSgpICkvL2ZhaWxlZCBkbyBub3QgY29udGludWUKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVOYW1lKCkgewotICAgICAgICBSdW50aW1lRGVsZWdhdGUgZGwgPSBnZXRSdW50aW1lRGVsZWdhdGUoKTsKLSAgICAgICAgSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gZGwuZ2V0UnVudGltZSgpLmdldFJ1bnRpbWVUeXBlKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gTkxTLmJpbmQoCi0gICAgICAgICAgICAgICAgR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMucnVudGltZU5hbWUsIHJ1bnRpbWVUeXBlLmdldE5hbWUoKSApOwotICAgICAgICBJUnVudGltZVtdIGxpc3QgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0gICAgICAgIGludCBzdWZmaXggPSAxOwotICAgICAgICBTdHJpbmcgc3VmZml4TmFtZSA9IG5hbWU7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAobGlzdFtpXS5nZXROYW1lKCkuZXF1YWxzKCBuYW1lICkgfHwgbGlzdFtpXS5nZXROYW1lKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBzdWZmaXhOYW1lICkpCi0gICAgICAgICAgICAgICAgICAgICYmICFsaXN0W2ldLmVxdWFscyggZGwuZ2V0UnVudGltZSgpICkgKQotICAgICAgICAgICAgICAgIHN1ZmZpeCsrOwotICAgICAgICAgICAgc3VmZml4TmFtZSA9IG5hbWUgKyAnICcgKyBzdWZmaXg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggc3VmZml4ID4gMSApCi0gICAgICAgICAgICByZXR1cm4gc3VmZml4TmFtZTsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBHZW5lcmljU2VydmVyUnVudGltZSBnZXRSdW50aW1lRGVsZWdhdGUoKSB7Ci0gICAgICAgIElSdW50aW1lV29ya2luZ0NvcHkgd2MgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkKLSAgICAgICAgICAgICAgICAuZ2V0T2JqZWN0KCBUYXNrTW9kZWwuVEFTS19SVU5USU1FICk7Ci0gICAgICAgIGlmKCB3YyA9PSBudWxsICkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKEdlbmVyaWNTZXJ2ZXJSdW50aW1lKSB3Yy5sb2FkQWRhcHRlcigKLSAgICAgICAgICAgICAgICBHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSApOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpLlNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCNkZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIHJOYW1lID0gZ2V0UnVudGltZU5hbWUoKTsKLSAgICAgICAgaWYoIHJOYW1lID09IG51bGwgfHwgck5hbWUubGVuZ3RoKCkgPCAxICkKLSAgICAgICAgICAgIHJOYW1lID0gIkdlbmVyaWMiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBOTFMuYmluZCgKLSAgICAgICAgICAgICAgICBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5ydW50aW1lV2l6YXJkRGVzY3JpcHRpb24sIHJOYW1lICk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwudWkuU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50I3RpdGxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRpdGxlKCkgewotICAgICAgICBTdHJpbmcgck5hbWUgPSBnZXRSdW50aW1lTmFtZSgpOwotICAgICAgICBpZiggck5hbWUgPT0gbnVsbCB8fCByTmFtZS5sZW5ndGgoKSA8IDEgKQotICAgICAgICAgICAgck5hbWUgPSAiR2VuZXJpYyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIE5MUy5iaW5kKAotICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnJ1bnRpbWVXaXphcmRUaXRsZSwgck5hbWUgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSdW50aW1lTmFtZSgpIHsKLSAgICAgICAgaWYoIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBnZXRSdW50aW1lRGVsZWdhdGUoKS5nZXRSdW50aW1lKCkgIT0gbnVsbCApCi0gICAgICAgICAgICByZXR1cm4gZ2V0UnVudGltZURlbGVnYXRlKCkuZ2V0UnVudGltZSgpLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWQ3ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBnZXQgbWVzc2FnZXMKLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTkRMRT0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyVUlNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkRGlhbG9nRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGREaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRQdWJsaXNoZXJTZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHVibGlzaGVyU2VjdGlvbkhlYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnV0dG9uQnJvd3NlRm9yQnVpbGRGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcnZlckVkaXRvclNlY3Rpb25EZXNjcmlwdGlvbjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTZXJ2ZXJFZGl0b3JTZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyUnVubmluZ0Nhbk5vdFNhdmU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyVHlwZUdyb3VwX2xhYmVsX2Jyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lV2l6YXJkRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVdpemFyZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlck5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyV2l6YXJkRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyV2l6YXJkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbGVkX2pyZV9saW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpyZV9zZWxlY3RfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEpSRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsU2VydmVyQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxhdGlvbkRpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eVBhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JOb0FudEJ1aWxkRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYWJlbEJ1aWxkRmlsZTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVPcGVyYXRpb25EZXNjcmlwdGlvbjsJCi0Jc3RhdGljewotCQkgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoUkVTT1VSQ0VfQlVORExFLCBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjJkYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQW50QnVpbGREaWFsb2dUaXRsZT1TZWxlY3QgRmlsZQotQW50UHVibGlzaGVyU2VjdGlvbkRlc2NyaXB0aW9uPU1vZGlmeSB0aGUgcHJvcGVydGllcyBmb3IgdGhlIEFOVCBiYXNlZCBtb2R1bGUgcHVibGlzaGVyCi1BbnRQdWJsaXNoZXJTZWN0aW9uSGVhZGluZz1BbnQgUHVibGlzaGVyIFByb3BlcnRpZXMKLUJ1dHRvbkJyb3dzZUZvckJ1aWxkRmlsZT1Ccm93c2UuLi4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQW50QnVpbGREaWFsb2dEZXNjcmlwdGlvbj1TZWxlY3QgdGhlIGJ1aWxkIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgZHVyaW5nIHB1Ymxpc2hpbmcKLXNlcnZlcldpemFyZFRpdGxlPU5ldyB7MH0gU2VydmVyCi1zZXJ2ZXJXaXphcmREZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgezB9IHNlcnZlciAKLXNlcnZlclJ1bm5pbmdDYW5Ob3RTYXZlPVRoZSBzZXJ2ZXIgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSBhIGNoYW5nZSB0byB0aGUgc2V0dGluZ3MgY2FuIGJlIHNhdmVkLgotcnVudGltZVdpemFyZFRpdGxlPU5ldyB7MH0gUnVudGltZQotcnVudGltZVdpemFyZERlc2NyaXB0aW9uPURlZmluZSBhIG5ldyB7MH0gcnVudGltZQotc2VydmVyVHlwZUdyb3VwX2xhYmVsX2Jyb3dzZT1Ccm93c2UuLi4KLXNlcnZlck5hbWUgPSB7MH0KLXJ1bnRpbWVOYW1lPSB7MH0KLWluc3RhbGxlZF9qcmVfbGluayA9IFlvdSBjYW4gdXNlIDxhPkluc3RhbGxlZCBKUkUgcHJlZmVyZW5jZXM8L2E+IHRvIGNyZWF0ZSBhIG5ldyBKUkUKLWluc3RhbGxTZXJ2ZXJCdXR0b249SW5zdGFsbCBTZXJ2ZXIKLWluc3RhbGxhdGlvbkRpcmVjdG9yeT1TZWxlY3QgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeQotanJlX3NlbGVjdF9sYWJlbD0gJkpSRToKLWRlZmF1bHRKUkUgPSBEZWZhdWx0IEpSRQotaW52YWxpZFBhdGggPSB7MH0gaXMgbm90IHZhbGlkCi1lbXB0eVBhdGg9U3BlY2lmeSBhIHZhbGlkIHBhdGgKLUVycm9yTm9BbnRCdWlsZEZpbGU9QW50IGJ1aWxkIGZpbGUgZG9lcyBub3QgZXhpc3QuCi1MYWJlbEJ1aWxkRmlsZT1CdWlsZCBmaWxlOgotU2VydmVyRWRpdG9yU2VjdGlvblRpdGxlPVNlcnZlciBQcm9wZXJ0aWVzCi1TZXJ2ZXJFZGl0b3JTZWN0aW9uRGVzY3JpcHRpb249TW9kaWZ5IHNldHRpbmdzIGZvciB0aGUgc2VydmVyLgotVXBkYXRlT3BlcmF0aW9uRGVzY3JpcHRpb249VXBkYXRlIGdlbmVyaWMgc2VydmVyIHByb3BlcnR5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3ZmMxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLQotLyoqCi0gKiAKLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJXaXphcmRGcmFnbWVudCBleHRlbmRzCi0gICAgICAgIFNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBHZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yW10gZkRlY29yYXRvcnM7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCi0gICAgICAgIFNlcnZlclJ1bnRpbWUgc2VydmVyUnVudGltZSA9IGdldFNlcnZlclR5cGVEZWZpbml0aW9uRm9yKCBnZXRTZXJ2ZXIoKSApOwotICAgICAgICBpZiggc2VydmVyUnVudGltZSA9PSBudWxsICkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gZ2V0U2VydmVyKCk7Ci0gICAgICAgIEdlbmVyaWNTZXJ2ZXIgZGwgPSAoR2VuZXJpY1NlcnZlcikgc2VydmVyLmxvYWRBZGFwdGVyKAotICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXIuY2xhc3MsIG51bGwgKTsKLQotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IGRsLnZhbGlkYXRlKCk7Ci0gICAgICAgIHJldHVybiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmlzT0soKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50KCBDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSApIHsKLSAgICAgICAgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IGdldFNlcnZlcigpOwotICAgICAgICBHZW5lcmljU2VydmVyIGRsID0gKEdlbmVyaWNTZXJ2ZXIpIHNlcnZlci5sb2FkQWRhcHRlcigKLSAgICAgICAgICAgICAgICBHZW5lcmljU2VydmVyLmNsYXNzLCBudWxsICk7Ci0gICAgICAgIFNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiA9IGdldFNlcnZlclR5cGVEZWZpbml0aW9uRm9yKCBzZXJ2ZXIgKTsKLSAgICAgICAgZkRlY29yYXRvcnMgPSBuZXcgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZURlY29yYXRvclsxXTsKLSAgICAgICAgZkRlY29yYXRvcnNbMF0gPSBuZXcgU2VydmVyVHlwZURlZmluaXRpb25TZXJ2ZXJEZWNvcmF0b3IoIGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgbnVsbCwgZ2V0V2l6YXJkKCksIGRsICk7Ci0gICAgICAgIG5ldyBHZW5lcmljU2VydmVyQ29tcG9zaXRlKCBwYXJlbnQsIGZEZWNvcmF0b3JzICk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VydmVyCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbkZvciggSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciApIHsKLSAgICAgICAgR2VuZXJpY1NlcnZlclJ1bnRpbWUgcnVudGltZSA9IChHZW5lcmljU2VydmVyUnVudGltZSkgc2VydmVyCi0gICAgICAgICAgICAgICAgLmdldFJ1bnRpbWUoKS5nZXRBZGFwdGVyKCBHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcyApOwotICAgICAgICBpZiggcnVudGltZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgSVJ1bnRpbWUgd2MgPSAoSVJ1bnRpbWUpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgVGFza01vZGVsLlRBU0tfUlVOVElNRSApOwotICAgICAgICAgICAgcnVudGltZSA9IChHZW5lcmljU2VydmVyUnVudGltZSkgd2MKLSAgICAgICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoIEdlbmVyaWNTZXJ2ZXJSdW50aW1lLmNsYXNzICk7Ci0gICAgICAgICAgICBpZiggcnVudGltZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICBydW50aW1lID0gKEdlbmVyaWNTZXJ2ZXJSdW50aW1lKSB3Yy5sb2FkQWRhcHRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXJSdW50aW1lLmNsYXNzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHNlcnZlclR5ZXBJZCA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgU3RyaW5nIHJ1bnRpbWVUeXBlSWQgPSBydW50aW1lLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIGlmKCBydW50aW1lVHlwZUlkID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBNYXAgcnVudGltZVByb3BlcnRpZXMgPSBydW50aW1lLmdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpOwotICAgICAgICBTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbiggc2VydmVyVHllcElkLAotICAgICAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWQsIHJ1bnRpbWVQcm9wZXJ0aWVzICk7Ci0gICAgICAgIHJldHVybiBkZWZpbml0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKSB7Ci0gICAgICAgIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKQotICAgICAgICAgICAgICAgIC5nZXRPYmplY3QoIFRhc2tNb2RlbC5UQVNLX1NFUlZFUiApOwotICAgICAgICByZXR1cm4gc2VydmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc05hbWVJblVzZSggU3RyaW5nIG5hbWUgKSB7Ci0gICAgICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhc2VydmVyc1tpXS5lcXVhbHMoIGdldFNlcnZlcigpLmdldE9yaWdpbmFsKCkgKQotICAgICAgICAgICAgICAgICAgICAmJiAoc2VydmVyc1tpXS5nZXROYW1lKCkuZXF1YWxzKCBuYW1lICkpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBOTFMuYmluZCgKLSAgICAgICAgICAgICAgICBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5zZXJ2ZXJOYW1lLCBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbkZvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZlcigpICkuZ2V0TmFtZSgpICk7Ci0gICAgICAgIGludCBzdWZmaXggPSAxOwotICAgICAgICBTdHJpbmcgc3VmZml4TmFtZSA9IG5hbWU7Ci0gICAgICAgIHdoaWxlKCBpc05hbWVJblVzZSggc3VmZml4TmFtZSApICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VmZml4TmFtZSA9IG5hbWUgKyAnICcgKyBzdWZmaXg7Ci0gICAgICAgICAgICBzdWZmaXgrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VmZml4TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgaWYoZkRlY29yYXRvcnMgPT0gbnVsbCApewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgZkRlY29yYXRvcnMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZkRlY29yYXRvcnNbaV0udmFsaWRhdGUoKSApLy9mYWlsZWQgZG8gbm90IGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgaWYoZkRlY29yYXRvcnMgPT0gbnVsbCApewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vIHZhbGlkYXRlIG5lZWRlZCB0byBzYXZlIHRoZSBsYXRlc3QgdmFsdWVzLgotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGZEZWNvcmF0b3JzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGZEZWNvcmF0b3JzW2ldLnZhbGlkYXRlKCkgKS8vZmFpbGVkIGRvIG5vdCBjb250aW51ZQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpLlNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCNkZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIHNOYW1lID0gZ2V0U2VydmVyTmFtZSgpOwotICAgICAgICBpZiggc05hbWUgPT0gbnVsbCB8fCBzTmFtZS5sZW5ndGgoKSA8IDEgKQotICAgICAgICAgICAgc05hbWUgPSAiR2VuZXJpYyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIE5MUy5iaW5kKAotICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnNlcnZlcldpemFyZERlc2NyaXB0aW9uLCBzTmFtZSApOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7Ci0gICAgICAgIGlmKCBnZXRTZXJ2ZXIoKSAhPSBudWxsICYmIGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSAhPSBudWxsICkKLSAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpLlNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCN0aXRsZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0aXRsZSgpIHsKLSAgICAgICAgU3RyaW5nIHNOYW1lID0gZ2V0U2VydmVyTmFtZSgpOwotICAgICAgICBpZiggc05hbWUgPT0gbnVsbCB8fCBzTmFtZS5sZW5ndGgoKSA8IDEgKQotICAgICAgICAgICAgc05hbWUgPSAiR2VuZXJpYyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIE5MUy5iaW5kKAotICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnNlcnZlcldpemFyZFRpdGxlLCBzTmFtZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1VpUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNVaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTZjMjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1VpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1VpUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JCi0JLyoqCi0JICogUGx1Zy1pbiBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkiOyAvLyROT04tTkxTLTEkCi0JCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQkFOX0lNQUdFID0gImdlbmVyaWNsb2dvIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBHZW5lcmljVWlQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBHZW5lcmljVWlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLkdlbmVyaWNVaVBsdWdpblJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEdlbmVyaWNVaVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gR2VuZXJpY1VpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0gICAgcHJvdGVjdGVkIEltYWdlUmVnaXN0cnkgY3JlYXRlSW1hZ2VSZWdpc3RyeSgpIHsKLSAgICAgICAgSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0gICAgICAgIEltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvaWNvbnMvd2l6YmFuL25ld19zZXJ2ZXJfd2l6LnBuZyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZWdpc3RyeS5wdXQoV0laQkFOX0lNQUdFLCBkZXNjKTsKLSAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5OwotICAgIH0KLSAgCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpewotCQlyZXR1cm4gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3Ioa2V5KTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvSW5zdGFsbGFibGVSdW50aW1lRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0luc3RhbGxhYmxlUnVudGltZURlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjVhMzVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvSW5zdGFsbGFibGVSdW50aW1lRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JSW5zdGFsbGFibGVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLQotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlUnVudGltZURlY29yYXRvciBpbXBsZW1lbnRzCi0JCUdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3IgewotCi0JcHJpdmF0ZSBHZW5lcmljU2VydmVyUnVudGltZSBmUnVudGltZTsKLQlwcml2YXRlIElXaXphcmRIYW5kbGUgZldpemFyZDsKLQotCXB1YmxpYyBJbnN0YWxsYWJsZVJ1bnRpbWVEZWNvcmF0b3IoSVdpemFyZEhhbmRsZSB3aXphcmQsIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUpIHsKLQkJZlJ1bnRpbWUgPSBydW50aW1lOwotCQlmV2l6YXJkID0gd2l6YXJkOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlY29yYXRlKGZpbmFsIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWZpbmFsIElJbnN0YWxsYWJsZVJ1bnRpbWUgaXIgPSBTZXJ2ZXJQbHVnaW4KLQkJCQkuZmluZEluc3RhbGxhYmxlUnVudGltZShmUnVudGltZS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKQotCQkJCQkJLmdldElkKCkpOwotCi0JCUJ1dHRvbiBpbnN0YWxsID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5pbnN0YWxsU2VydmVyQnV0dG9uKTsKLQkJaW5zdGFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29tcG9zaXRlCi0JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuaW5zdGFsbGF0aW9uRGlyZWN0b3J5KTsKLQkJCQlmaW5hbCBTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCQotCQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpci5pbnN0YWxsKG5ldyBQYXRoKHNlbGVjdGVkRGlyZWN0b3J5KSwKLQkJCQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLAotCQkJCQkJCQkJCSJFcnJvciBpbnN0YWxsaW5nIHJ1bnRpbWUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJCi0JCQkJCXRyeSB7Ci0JCQkJCQlmV2l6YXJkLnJ1bih0cnVlLCBmYWxzZSwgcnVubmFibGUpOwotCQkJCQkKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwKLQkJCQkJCQkJIkVycm9yIGluc3RhbGxpbmcgcnVudGltZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvSlJFU2VsZWN0RGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0pSRVNlbGVjdERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njc1NTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvSlJFU2VsZWN0RGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci0KLQotcHVibGljIGNsYXNzIEpSRVNlbGVjdERlY29yYXRvciBpbXBsZW1lbnRzIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3IgewotCXByaXZhdGUgTGlzdCBpbnN0YWxsZWRKUkVzOwotCXByaXZhdGUgU3RyaW5nW10ganJlTmFtZXM7Ci0JcHJpdmF0ZSBHZW5lcmljU2VydmVyUnVudGltZSBmUnVudGltZTsKLQlwcml2YXRlIElXaXphcmRIYW5kbGUgZldpemFyZDsgCi0JcHVibGljIEpSRVNlbGVjdERlY29yYXRvcihHZW5lcmljU2VydmVyUnVudGltZSBydW50aW1lLCBJV2l6YXJkSGFuZGxlIHdpemFyZEhhbmRsZSl7Ci0JCXN1cGVyKCk7Ci0JCWZSdW50aW1lID0gcnVudGltZTsKLQkJZldpemFyZCA9IHdpemFyZEhhbmRsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGVjb3JhdGUoZmluYWwgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJdXBkYXRlSlJFcygpOwotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhjb21wb3NpdGUsU1dULk5PTkUpOwotCQlsaW5rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5OT05FLHRydWUsZmFsc2UsMywxKSk7Ci0JCWxpbmsuc2V0VGV4dChHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5pbnN0YWxsZWRfanJlX2xpbmspOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuanJlX3NlbGVjdF9sYWJlbCk7Ci0JCQotCQlmaW5hbCBDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5OT05FLGZhbHNlLGZhbHNlLDIsMSk7Ci0JCQotCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBzZWwgPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gbnVsbDsKLQkJCQlpZiAoc2VsID4gMCkKLQkJCQkJdm1JbnN0YWxsID0gKElWTUluc3RhbGwpIGluc3RhbGxlZEpSRXMuZ2V0KHNlbCAtIDEpOwotCQkJCi0JCQkJZlJ1bnRpbWUuc2V0Vk1JbnN0YWxsKHZtSW5zdGFsbCk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyBjdXJyZW50Vk0gPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKHNob3dQcmVmZXJlbmNlUGFnZShjb21wb3NpdGUpKSB7Ci0JCQkJCXVwZGF0ZUpSRXMoKTsKLQkJCQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQkJCQljb21iby5zZXRUZXh0KGN1cnJlbnRWTSk7Ci0JCQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IC0xKQotCQkJCQkJY29tYm8uc2VsZWN0KDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGZSdW50aW1lIT1udWxsKXsKLQkJCWlmKGZSdW50aW1lLmlzVXNpbmdEZWZhdWx0SlJFKCkpewotCQkJCWNvbWJvLnNlbGVjdCgwKTsKLQkJCX1lbHNlewotCQkJCWNvbWJvLnNldFRleHQoZlJ1bnRpbWUuZ2V0Vk1JbnN0YWxsKCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQcmVmZXJlbmNlUGFnZShHZW5lcmljU2VydmVyQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IG1hbmFnZXIuZmluZCgib3JnLmVjbGlwc2UuamR0LnVpLnByZWZlcmVuY2VzLkphdmFCYXNlUHJlZmVyZW5jZVBhZ2UiKS5maW5kU3ViTm9kZSgib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLnByZWZlcmVuY2VzLlZNUHJlZmVyZW5jZVBhZ2UiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCVByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIyID0gbmV3IFByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCW1hbmFnZXIyLmFkZFRvUm9vdChub2RlKTsKLQkJZmluYWwgUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwgbWFuYWdlcjIpOwotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlIH07Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGNvbXBvc2l0ZS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotCQkJCQlyZXN1bHRbMF0gPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSlJFcygpIHsKLQkJaW5zdGFsbGVkSlJFcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZNSW5zdGFsbFR5cGVbXSB2bUluc3RhbGxUeXBlcyA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGVzKCk7Ci0JCWludCBzaXplID0gdm1JbnN0YWxsVHlwZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSB2bUluc3RhbGxUeXBlc1tpXS5nZXRWTUluc3RhbGxzKCk7Ci0JCQlpbnQgc2l6ZTIgPSB2bUluc3RhbGxzLmxlbmd0aDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCWluc3RhbGxlZEpSRXMuYWRkKHZtSW5zdGFsbHNbal0pOwotCQkJfQotCQl9Ci0JCQotCQlzaXplID0gaW5zdGFsbGVkSlJFcy5zaXplKCk7Ci0JCWpyZU5hbWVzID0gbmV3IFN0cmluZ1tzaXplKzFdOwotCQlqcmVOYW1lc1swXSA9IEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmRlZmF1bHRKUkU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IChJVk1JbnN0YWxsKSBpbnN0YWxsZWRKUkVzLmdldChpKTsKLQkJCWpyZU5hbWVzW2krMV0gPSB2bUluc3RhbGwuZ2V0TmFtZSgpOwotCQl9Ci0JfQotCQotCQotCQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCSAgICBJU3RhdHVzIHN0YXR1cyA9IGZSdW50aW1lLnZhbGlkYXRlKCk7Ci0JICAgIGlmKCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LICkKLQkgICAgewotCSAgICAgICAgZldpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCSAgICAgICAgZldpemFyZC51cGRhdGUoKTsKLQkgICAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0KLQkgICAgZldpemFyZC5zZXRNZXNzYWdlKCIiLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZXaXphcmQudXBkYXRlKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NGIzZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklGb3JtQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLS8qKgotICogU1dUIFV0aWxpdGllcy4KLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIFNXVFV0aWwgewotCXByaXZhdGUgc3RhdGljIEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRpYWxpemVEaWFsb2dVbml0cyhDb250cm9sIHRlc3RDb250cm9sKSB7Ci0JCS8vIENvbXB1dGUgYW5kIHN0b3JlIGEgZm9udCBtZXRyaWMKLQkJR0MgZ2MgPSBuZXcgR0ModGVzdENvbnRyb2wpOwotCQlnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB3aWR0aCBoaW50IGZvciBhIGJ1dHRvbiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdldEJ1dHRvbldpZHRoSGludChCdXR0b24gYnV0dG9uKSB7Ci0JCWludCB3aWR0aEhpbnQgPSBEaWFsb2cuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULAotCQkJCXRydWUpLngpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBidXR0b24gd2l0aCB0aGUgc3RhbmRhcmQgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcAotCSAqICAgICAgICAgICAgdGhlIGNvbXBvbmVudCB0byBhZGQgdGhlIGJ1dHRvbiB0bwotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbiBsYWJlbAotCSAqIEByZXR1cm4gYSBidXR0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbXAsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCQliLnNldFRleHQobGFiZWwpOwotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGIpOwotCQliLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBiOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgRExVcyB0byBwaXhlbHMuCi0JICogCi0JICogQHBhcmFtIGNvbXAKLQkgKiAgICAgICAgICAgIGEgY29tcG9uZW50Ci0JICogQHBhcmFtIHgKLQkgKiAgICAgICAgICAgIHBpeGVscwotCSAqIEByZXR1cm4gZGx1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKENvbXBvc2l0ZSBjb21wLCBpbnQgeCkgewotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wKTsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgeCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBETFVzIHRvIHBpeGVscy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcAotCSAqICAgICAgICAgICAgYSBjb21wb25lbnQKLQkgKiBAcGFyYW0geQotCSAqICAgICAgICAgICAgcGl4ZWxzCi0JICogQHJldHVybiBkbHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKENvbXBvc2l0ZSBjb21wLCBpbnQgeSkgewotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wKTsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsIHkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCwgdGV4dCBhbmQgYSBidXR0b24gdG8gb3BlbiBhIGRpcmVjdG9yeSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4gVGV4dCB0aGF0IGhvbGRzIHZhbHVlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUxhYmVsZWRQYXRoKFN0cmluZyB0aXRsZSwgU3RyaW5nIHZhbHVlLCBmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUxhYmVsZWRQYXRoKHRpdGxlLCB2YWx1ZSwgcGFyZW50LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwsIHRleHQgYW5kIGEgYnV0dG9uIHRvIG9wZW4gYSBkaXJlY3RvdHkgZGlhbG9nLiBUaGlzCi0JICogbWV0aG9kIGNyZWF0ZXMgRm9ydW0gVUkgY29tcGF0aWJsZSB3aWRnZXRzLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqIEByZXR1cm4gVGV4dCB0aGF0IGhvbGRzIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUxhYmVsZWRQYXRoKFN0cmluZyB0aXRsZSwgU3RyaW5nIHZhbHVlLCBmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbnVsbDsKLQkJVGV4dCBjVGV4dCA9IG51bGw7Ci0JCUJ1dHRvbiBidXR0b24gPSBudWxsOwotCi0JCWlmICh0b29sa2l0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotICAgICAgICAgICAgbGFiZWwuc2V0VGV4dCh0aXRsZSk7Ci0JCQljVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNIQURPV19JTiB8IFNXVC5CT1JERVIpOwotCQkJYnV0dG9uID0gU1dUVXRpbC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5zZXJ2ZXJUeXBlR3JvdXBfbGFiZWxfYnJvd3NlKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZUZvcm1MYWJlbCh0aXRsZSwgcGFyZW50LCB0b29sa2l0KTsKLQkJCWNUZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KHBhcmVudCwgdmFsdWUpOwotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5zZXJ2ZXJUeXBlR3JvdXBfbGFiZWxfYnJvd3NlLAotCQkJCQlTV1QuUFVTSCk7Ci0JCX0KLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0KLQkJZmluYWwgVGV4dCB0ZXh0ID0gY1RleHQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRleHQuc2V0VGV4dCh2YWx1ZSk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRsZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cocGFyZW50LmdldFNoZWxsKCkpOwotCQkJCWRsZy5zZXRGaWx0ZXJQYXRoKHRleHQuZ2V0VGV4dCgpLnJlcGxhY2UoJ1xcJywgJy8nKSk7Ci0JCQkJU3RyaW5nIHJlcyA9IGRsZy5vcGVuKCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCXRleHQuc2V0VGV4dChyZXMucmVwbGFjZSgnXFwnLCAnLycpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsLCB0ZXh0IGFuZCBhIGJ1dHRvbiB0aGF0cyBvcGVucyBhIGZpbGUgZGlhbG9nCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4gVGV4dCB0aGF0IGhvbGRzIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVMYWJlbGVkRmlsZShTdHJpbmcgdGl0bGUsIFN0cmluZyB2YWx1ZSwgZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbGVkRmlsZSh0aXRsZSwgdmFsdWUsIHBhcmVudCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsLCB0ZXh0IGFuZCBhIGJ1dHRvbiB0aGF0cyBvcGVucyBhIGZpbGUgZGlhbG9nLiBUaGlzIG1ldGhvZAotCSAqIGlzIHVzZWQgZm9yIGNyZWF0aW5nIEZvcm0gVUkgY29tcGF0aWJsZSB3aWRnZXRzCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVMYWJlbGVkRmlsZShTdHJpbmcgdGl0bGUsIFN0cmluZyB2YWx1ZSwgZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCi0JCUxhYmVsIGxhYmVsOwotCQlUZXh0IGNUZXh0OwotCQlCdXR0b24gYnV0dG9uOwotCQlpZiAodG9vbGtpdCA9PSBudWxsKSB7Ci0JCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQodGl0bGUpOwotCQkJY1RleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSEFET1dfSU4gfCBTV1QuQk9SREVSKTsKLQkJCWJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuc2VydmVyVHlwZUdyb3VwX2xhYmVsX2Jyb3dzZSk7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVGb3JtTGFiZWwodGl0bGUsIHBhcmVudCwgdG9vbGtpdCk7Ci0JCQljVGV4dCA9IHRvb2xraXQuY3JlYXRlVGV4dChwYXJlbnQsIHZhbHVlKTsKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuc2VydmVyVHlwZUdyb3VwX2xhYmVsX2Jyb3dzZSwKLQkJCQkJU1dULlBVU0gpOwotCQl9Ci0JCWZpbmFsIFRleHQgdGV4dCA9IGNUZXh0OwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdGV4dC5zZXRUZXh0KHZhbHVlKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGaWxlRGlhbG9nIGRsZyA9IG5ldyBGaWxlRGlhbG9nKHBhcmVudC5nZXRTaGVsbCgpKTsKLQkJCQlkbGcuc2V0RmlsZU5hbWUodGV4dC5nZXRUZXh0KCkucmVwbGFjZSgnXFwnLCAnLycpKTsKLQkJCQlTdHJpbmcgcmVzID0gZGxnLm9wZW4oKTsKLQkJCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQkJdGV4dC5zZXRUZXh0KHJlcy5yZXBsYWNlKCdcXCcsICcvJykpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQotCQl9KTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwgYW5kIGEgdGV4dAotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuIFRleHQgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUxhYmVsZWRUZXh0KFN0cmluZyB0aXRsZSwgU3RyaW5nIHZhbHVlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUxhYmVsZWRUZXh0KCB0aXRsZSwgdmFsdWUsIHBhcmVudCwgbnVsbCApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBhbmQgYSB0ZXh0LiBUaGlzIG1ldGhvZCBjcmVhdGVkIGZvcm0gdWkgY29tcGF0aWJsZQotCSAqIHdpZGdldHMKLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcmV0dXJuIFRleHQgY29udHJvbCB0aGF0IGhvbGRzIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVMYWJlbGVkVGV4dChTdHJpbmcgdGl0bGUsIFN0cmluZyB2YWx1ZSwgQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCi0JCUxhYmVsIGxhYmVsOwotCQlUZXh0IHRleHQ7Ci0JCWlmICh0b29sa2l0ID09IG51bGwpIHsKLQkJCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQkJbGFiZWwuc2V0VGV4dCh0aXRsZSk7Ci0JCQl0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0hBRE9XX0lOIHwgU1dULkJPUkRFUik7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVGb3JtTGFiZWwodGl0bGUsIHBhcmVudCwgdG9vbGtpdCk7Ci0JCQl0ZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KHBhcmVudCwgdmFsdWUpOwotCQl9Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRleHQuc2V0VGV4dCh2YWx1ZSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENIRUNLIHN0eWxlIGJ1dHRvbiBhbmQgbGFiZWwKLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybiBDaGVjayBCdXR0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVMYWJlbGVkQ2hlY2soU3RyaW5nIHRpdGxlLCBib29sZWFuIHZhbHVlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUxhYmVsZWRDaGVjayh0aXRsZSwgdmFsdWUsIHBhcmVudCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENIRUNLIHN0eWxlIGJ1dHRvbiBhbmQgbGFiZWwuIFRoaXMgbWV0aG9kIGlzIGZvcm0gdWkgY29tcGF0aWJsZQotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVMYWJlbGVkQ2hlY2soU3RyaW5nIHRpdGxlLCBib29sZWFuIHZhbHVlLCBDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCUxhYmVsIGxhYmVsOwotCQlCdXR0b24gYnV0dG9uOwotCQlpZiAodG9vbGtpdCA9PSBudWxsKSB7Ci0JCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQodGl0bGUpOwotCQkJYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVGb3JtTGFiZWwodGl0bGUsIHBhcmVudCwgdG9vbGtpdCk7Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsIG51bGwsIFNXVC5DSEVDSyk7Ci0JCX0KLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlidXR0b24uc2V0U2VsZWN0aW9uKHZhbHVlKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwgYW5kIGFuIGVkaXRhYmxlIENvbWJvLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybiBDb21ibwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlTGFiZWxlZENvbWJvKFN0cmluZyB0aXRsZSwgU3RyaW5nW10gdmFsdWVzLENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlTGFiZWxlZENvbWJvKHRpdGxlLCB2YWx1ZXMsIHBhcmVudCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIGFuZCBhbiBlZGl0YWJsZSBDb21ibwotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcmV0dXJuIENvbWJvCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVMYWJlbGVkQ29tYm8oU3RyaW5nIHRpdGxlLCBTdHJpbmdbXSB2YWx1ZXMsIENvbXBvc2l0ZSBwYXJlbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQotCQlMYWJlbCBsYWJlbDsKLQotCQlpZiAodG9vbGtpdCA9PSBudWxsKSB7Ci0JCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQodGl0bGUpOwotCQl9IGVsc2UgewotCQkJY3JlYXRlRm9ybUxhYmVsKHRpdGxlLCBwYXJlbnQsIHRvb2xraXQpOwotCQl9Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWlmICh0b29sa2l0ICE9IG51bGwpIHsKLQkJCXRvb2xraXQuYWRhcHQoY29tYm8sIHRydWUsIHRydWUpOwotCQl9Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb21iby5hZGQodmFsdWVzW2ldKTsKLQkJfQotCQlpZiAoY29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKQotCQkJY29tYm8uc2VsZWN0KDApOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBhbmQgYW4gZWRpdGFibGUgQ29tYm8uCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIHZhbHVlcwotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuIENvbWJvCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVMYWJlbGVkRWRpdGFibGVDb21ibyhTdHJpbmcgdGl0bGUsIFN0cmluZ1tdIHZhbHVlcyxTdHJpbmcgdmFsdWUsQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbGVkRWRpdGFibGVDb21ibyh0aXRsZSwgdmFsdWVzLHZhbHVlLCBwYXJlbnQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBhbmQgYW4gZWRpdGFibGUgQ29tYm8KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHJldHVybiBDb21ibwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlTGFiZWxlZEVkaXRhYmxlQ29tYm8oU3RyaW5nIHRpdGxlLCBTdHJpbmdbXSB2YWx1ZXMsU3RyaW5nIHZhbHVlLCBDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0KLQkJTGFiZWwgbGFiZWw7Ci0KLQkJaWYgKHRvb2xraXQgPT0gbnVsbCkgewotCQkJbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0JCQlsYWJlbC5zZXRUZXh0KHRpdGxlKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZUZvcm1MYWJlbCh0aXRsZSwgcGFyZW50LCB0b29sa2l0KTsKLQkJfQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5TSEFET1dfSU4gfCBTV1QuQk9SREVSKTsKLQkJaWYgKHRvb2xraXQgIT0gbnVsbCkgewotCQkJdG9vbGtpdC5hZGFwdChjb21ibywgdHJ1ZSwgdHJ1ZSk7Ci0JCX0KLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbWJvLmFkZCh2YWx1ZXNbaV0pOwotCQl9Ci0JCWlmIChjb21iby5nZXRJdGVtQ291bnQoKSA+IDApCi0JCQljb21iby5zZWxlY3QoMCk7Ci0JCWNvbWJvLnNldFRleHQodmFsdWUpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGFiZWwgY3JlYXRlRm9ybUxhYmVsKFN0cmluZyB0aXRsZSwgQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlMYWJlbCBsYWJlbDsKLQkJbGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHBhcmVudCwgdGl0bGUpOwotCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzMjg4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLQotLyoqCi0gKiBBIHdpemFyZCBmcmFnbWVudCB0aGF0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHNlcnZlcmRlZiBmaWxlcy4KLSAqCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCi0gICAgcHJpdmF0ZSBJV2l6YXJkSGFuZGxlIGZXaXphcmQ7Ci0JCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSkgewotCSAgICAKLQkgICAgdGhpcy5mV2l6YXJkID0gaGFuZGxlOwotCSAgICBDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkID0gbmV3IEdyaWRMYXlvdXQoMSxmYWxzZSk7Ci0JCWdyaWQubWFyZ2luV2lkdGg9MDsKLQkJY29udGFpbmVyLnNldExheW91dChncmlkKTsKLQkgICAgY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQloYW5kbGUuc2V0SW1hZ2VEZXNjcmlwdG9yKEdlbmVyaWNVaVBsdWdpbi5nZXREZWZhdWx0KCkuaW1hZ2VEZXNjcmlwdG9yKEdlbmVyaWNVaVBsdWdpbi5XSVpCQU5fSU1BR0UpKTsKLQkJaGFuZGxlLnNldFRpdGxlKHRpdGxlKCkpOwotCQloYW5kbGUuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24oKSk7Ci0JCWNyZWF0ZUNvbnRlbnQoY29udGFpbmVyLGhhbmRsZSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCXB1YmxpYyBJV2l6YXJkSGFuZGxlIGdldFdpemFyZCgpewotCSAgICByZXR1cm4gZldpemFyZDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gdG8gYmUgZGlzcGxheWVkIG9uIHRoZSB3aXphcmQgaGVhZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBkZXNjcmlwdGlvbigpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSB3aXphcmQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdGl0bGUoKTsKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHJlYWwgY29udGVudAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gaGFuZGxlCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlQ29udGVudChDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSk7Ci0KLQkvKioKLQkgKiBSZXR1bnMgdGhlIFNlcnZlclJ1bnRpbWUuCi0JICogQHBhcmFtIGRlZmluaXRpb25JRAotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0JICogQHJldHVybgotCSAqLwkKLQlwcm90ZWN0ZWQgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihTdHJpbmcgZGVmaW5pdGlvbklELCBNYXAgcHJvcGVydGllcykKLQl7Ci0JICAgIHJldHVybiBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIoKS5nZXRTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbihkZWZpbml0aW9uSUQscHJvcGVydGllcyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dW5zIHRoZSBTZXJ2ZXJSdW50aW1lLgotICAgICAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWQKLSAgICAgKiBAcGFyYW0gcnVudGltZVR5cGVJZAotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogQHJldHVybgotICAgICAqLyAKLSAgICBwcm90ZWN0ZWQgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihTdHJpbmcgc2VydmVyVHlwZUlkLCBTdHJpbmcgcnVudGltZVR5cGVJZCwgTWFwIHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICByZXR1cm4gQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyKCkuZ2V0U2VydmVyUnVudGltZURlZmluaXRpb24oc2VydmVyVHlwZUlkLCBydW50aW1lVHlwZUlkLCBwcm9wZXJ0aWVzKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvbkRlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvbkRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGJjZGY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvU2VydmVyVHlwZURlZmluaXRpb25EZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogUHJvdmlkZXMgdGhlIFVJIG9iamVjdHMgZm9yIGdhdGhlcmluZyB1c2VyIGluZm9ybWF0aW9uCi0gKiBmb3Igc2VydmVyIHByb3BlcnRpZXMuCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbkRlY29yYXRvciBpbXBsZW1lbnRzIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3IgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9SVU5USU1FID0gUHJvcGVydHkuQ09OVEVYVF9SVU5USU1FOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfU0VSVkVSID0gUHJvcGVydHkuQ09OVEVYVF9TRVJWRVI7Ci0JcHJpdmF0ZSBTZXJ2ZXJSdW50aW1lIGZEZWZpbml0aW9uOwotICAgIHByaXZhdGUgTWFwIGZQcm9wZXJ0aWVzOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0OwotCXByb3RlY3RlZCBTdHJpbmcgZkxhc3RNZXNzYWdlOwotCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIGZXaXphcmQ7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9wZXJ0eUNvbnRyb2xzPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFBhdGhNb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlTdHJpbmcgcGF0aCA9ICgoVGV4dCkgZS53aWRnZXQpLmdldFRleHQoKTsKLQkJCQotCQkJaWYocGF0aC5sZW5ndGgoKTwxKQotCQkJewotCQkJCWZMYXN0TWVzc2FnZSA9IEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmVtcHR5UGF0aDsKLQkJCQlmV2l6YXJkLnNldE1lc3NhZ2UoZkxhc3RNZXNzYWdlLElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJfQotCQkJZWxzZSBpZighcGF0aEV4aXN0KHBhdGgpKXsKLQkJCQlmTGFzdE1lc3NhZ2UgPSBOTFMuYmluZChHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5pbnZhbGlkUGF0aCxwYXRoKTsKLQkJCQlmV2l6YXJkLnNldE1lc3NhZ2UoZkxhc3RNZXNzYWdlLElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJfWVsc2V7Ci0JCQkJaWYoZkxhc3RNZXNzYWdlIT1udWxsICYmIGZMYXN0TWVzc2FnZS5lcXVhbHMoZldpemFyZC5nZXRNZXNzYWdlKCkpKXsKLQkJCQkJZkxhc3RNZXNzYWdlPW51bGw7Ci0JCQkJCWZXaXphcmQuc2V0TWVzc2FnZShudWxsLElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQkJfQotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0KLQkJcHJpdmF0ZSBib29sZWFuIHBhdGhFeGlzdChTdHJpbmcgcGF0aCl7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJCXJldHVybiBmLmV4aXN0cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZGVmaW5pdGlvbgotCSAqIEBwYXJhbSBpbml0aWFsUHJvcGVydGllcwotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHBhcmFtIGhhbmRsZQotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbkRlY29yYXRvcihTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24sIE1hcCBpbml0aWFsUHJvcGVydGllcywgU3RyaW5nIGNvbnRleHQsIElXaXphcmRIYW5kbGUgaGFuZGxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQkJZlByb3BlcnRpZXMgPSBpbml0aWFsUHJvcGVydGllczsKLQkJZkNvbnRleHQgPSBjb250ZXh0OwotCQlmV2l6YXJkID0gaGFuZGxlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yI2RlY29yYXRlKG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRlKEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJTGlzdCBwcm9wZXJ0aWVzID1udWxsOyAKLQkJaWYoZkRlZmluaXRpb249PW51bGwpewotCQkJcHJvcGVydGllcz0gbmV3IEFycmF5TGlzdCgwKTsKLQkJfQotCQllbHNlewotCQkJcHJvcGVydGllcz0gZkRlZmluaXRpb24uZ2V0UHJvcGVydHkoKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCWlmICh0aGlzLmZDb250ZXh0LmVxdWFscyhwcm9wZXJ0eS5nZXRDb250ZXh0KCkpKQotCQkJCWNyZWF0ZVByb3BlcnR5Q29udHJvbChjb21wb3NpdGUsIHByb3BlcnR5KTsKLQkJfQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JfQotCi0JCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb3BlcnR5Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBQcm9wZXJ0eSBwcm9wZXJ0eSl7Ci0gICAgCWlmKCBQcm9wZXJ0eS5UWVBFX0RJUkVDVE9SWS5lcXVhbHMocHJvcGVydHkuZ2V0VHlwZSgpKSkgewotICAgIAkJVGV4dCBwYXRoID0gU1dUVXRpbC5jcmVhdGVMYWJlbGVkUGF0aChwcm9wZXJ0eS5nZXRMYWJlbCgpLGdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpLHBhcmVudCk7Ci0gICAgCQlwYXRoLnNldERhdGEocHJvcGVydHkpOwotICAgIAkJcGF0aC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgUGF0aE1vZGlmeUxpc3RlbmVyKCkpOwotICAgIAkJcmVnaXN0ZXJDb250cm9sKHBhdGgpOwotICAgICAJfSBlbHNlIGlmKCBQcm9wZXJ0eS5UWVBFX0ZJTEUuZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAJICAgIFRleHQgZmlsZSA9IFNXVFV0aWwuY3JlYXRlTGFiZWxlZEZpbGUocHJvcGVydHkuZ2V0TGFiZWwoKSxnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSxwYXJlbnQpOwotICAgIAkJZmlsZS5zZXREYXRhKHByb3BlcnR5KTsKLSAgICAJCWZpbGUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IFBhdGhNb2RpZnlMaXN0ZW5lcigpKTsKLSAgICAJCXJlZ2lzdGVyQ29udHJvbChmaWxlKTsKLSAgICAgICAJfSBlbHNlIGlmKCBQcm9wZXJ0eS5UWVBFX0JPT0xFQU4uZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAJICAgIEJ1dHRvbiBib29sID1TV1RVdGlsLmNyZWF0ZUxhYmVsZWRDaGVjayhwcm9wZXJ0eS5nZXRMYWJlbCgpLCgidHJ1ZSIuZXF1YWxzKCBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSkpLAlwYXJlbnQpOyAvLyROT04tTkxTLTEkCi0gICAgCQlib29sLnNldERhdGEocHJvcGVydHkpOwotICAgIAkJcmVnaXN0ZXJDb250cm9sKGJvb2wpOwotICAgICAgIAl9ZWxzZSBpZihQcm9wZXJ0eS5UWVBFX1NFTEVDVC5lcXVhbHMocHJvcGVydHkuZ2V0VHlwZSgpKSkgewotICAgIAkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcGVydHkuZ2V0RGVmYXVsdCgpLCIsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJCWludCB0b2tlbkNvdW50ID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0gICAgCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW3Rva2VuQ291bnRdOwotICAgIAkJaW50IGkgPTA7Ci0gICAgCQl3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpICYmIGk8dG9rZW5Db3VudCl7Ci0gICAgCQkJdmFsdWVzW2ldPXRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAJCQlpKys7Ci0gICAgCQl9Ci0gICAgICAgCQlDb21ibyBjb21ibyA9IFNXVFV0aWwuY3JlYXRlTGFiZWxlZENvbWJvKHByb3BlcnR5LmdldExhYmVsKCksdmFsdWVzLCBwYXJlbnQpOwotICAgICAgIAkJY29tYm8uc2V0RGF0YShwcm9wZXJ0eSk7Ci0gICAgICAgCQlyZWdpc3RlckNvbnRyb2woY29tYm8pOwotICAgICAgIAl9ZWxzZSBpZihQcm9wZXJ0eS5UWVBFX1NFTEVDVF9FRElULmVxdWFscyhwcm9wZXJ0eS5nZXRUeXBlKCkpKSB7Ci0gICAgCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eS5nZXREZWZhdWx0KCksIiwiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJaW50IHRva2VuQ291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLSAgICAJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbdG9rZW5Db3VudF07Ci0gICAgCQlpbnQgaSA9MDsKLSAgICAJCXdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgJiYgaTx0b2tlbkNvdW50KXsKLSAgICAJCQl2YWx1ZXNbaV09dG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgIAkJCWkrKzsKLSAgICAJCX0KLSAgICAgICAJCUNvbWJvIGNvbWJvID0gU1dUVXRpbC5jcmVhdGVMYWJlbGVkRWRpdGFibGVDb21ibyhwcm9wZXJ0eS5nZXRMYWJlbCgpLHZhbHVlcyxnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSwgcGFyZW50KTsKLSAgICAgICAJCWNvbWJvLnNldERhdGEocHJvcGVydHkpOwotICAgICAgIAkJcmVnaXN0ZXJDb250cm9sKGNvbWJvKTsKLSAgICAgICAJfQotICAgICAgIAllbHNlIHsvL2RlZmF1bHQgaXMgVEVYVAotICAgIAkgICAgVGV4dCBkZWZhdWx0VGV4dD0gU1dUVXRpbC5jcmVhdGVMYWJlbGVkVGV4dChwcm9wZXJ0eS5nZXRMYWJlbCgpLGdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpLHBhcmVudCk7Ci0gICAgCQlkZWZhdWx0VGV4dC5zZXREYXRhKHByb3BlcnR5KTsKLSAgICAJCXJlZ2lzdGVyQ29udHJvbChkZWZhdWx0VGV4dCk7Ci0gICAgCX0KLSAgICB9Ci0KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJDb250cm9sKENvbnRyb2wgY29udHJvbCkKLSAgICB7Ci0gICAgCWZQcm9wZXJ0eUNvbnRyb2xzLmFkZChjb250cm9sKTsKLSAgICB9Ci0JCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eSBwcm9wZXJ0eSl7CQotCQlpZihmUHJvcGVydGllcyE9bnVsbCAmJiBmUHJvcGVydGllcy5pc0VtcHR5KCk9PWZhbHNlKXsKLQkJLy91c2VyIHByb3BlcnRpZXMgZXhpc3QgdXNlIHRob3NlCi0JCQlyZXR1cm4gZkRlZmluaXRpb24uZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcygoU3RyaW5nKWZQcm9wZXJ0aWVzLmdldChwcm9wZXJ0eS5nZXRJZCgpKSk7Ci0JCX0JCi0JCWlmKFByb3BlcnR5LlRZUEVfU0VMRUNUX0VESVQuZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcGVydHkuZ2V0RGVmYXVsdCgpLCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKCB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKXsKLQkJCQlyZXR1cm4gZkRlZmluaXRpb24uZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZEZWZpbml0aW9uLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMocHJvcGVydHkuZ2V0RGVmYXVsdCgpKTsJCi0JfQkKLQotICAgLyoqCi0gICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lL3ZhbHVlIHBhaXJzLgotICAgICogQHJldHVybiBNYXAgY29udGFpbmluZyB0aGUgdmFsdWVzIGNvbGxlY3RlZCBmcm9tIHRoZSB1c2VyCi0gICAgKi8KLQlwdWJsaWMgTWFwIGdldFZhbHVlcygpewotCQlNYXAgcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIAlmb3IoaW50IGk9MDsgaTxmUHJvcGVydHlDb250cm9scy5zaXplKCk7aSsrKXsKLSAgICAJCVByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpKChDb250cm9sKWZQcm9wZXJ0eUNvbnRyb2xzLmdldChpKSkuZ2V0RGF0YSgpOwotICAgIAkJaWYoZlByb3BlcnR5Q29udHJvbHMuZ2V0KGkpaW5zdGFuY2VvZiBCdXR0b24pewotICAgIAkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWZQcm9wZXJ0eUNvbnRyb2xzLmdldChpKTsKLSAgICAJCQlwcm9wZXJ0eU1hcC5wdXQocHJvcC5nZXRJZCgpLEJvb2xlYW4udG9TdHJpbmcoYnV0dG9uLmdldFNlbGVjdGlvbigpKSk7Ci0gICAgCQl9Ci0gICAgCQllbHNlIGlmKGZQcm9wZXJ0eUNvbnRyb2xzLmdldChpKSBpbnN0YW5jZW9mIENvbWJvKXsKLSAgICAJCQlDb21ibyBjb21ibyA9IChDb21ibylmUHJvcGVydHlDb250cm9scy5nZXQoaSk7Ci0gICAgIAkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgIAkJCWlmICggaW5kZXggPiAwICl7Ly9pcyB0aGVyZSBhIHNlbGVjdGlvbj8KLSAgICAgCQkJICAgIHByb3BlcnR5TWFwLnB1dChwcm9wLmdldElkKCksY29tYm8uZ2V0SXRlbShpbmRleCkpOwotICAgICAJCQl9Ci0gICAgIAkJCWVsc2V7Ci0gICAgIAkJCSAgIHByb3BlcnR5TWFwLnB1dChwcm9wLmdldElkKCksY29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgCQkJfQotICAgICAJCQkKLSAgICAJCX1lbHNlewotICAgIAkJCVRleHQgdGV4dCA9IChUZXh0KWZQcm9wZXJ0eUNvbnRyb2xzLmdldChpKTsKLSAgICAJCQlwcm9wZXJ0eU1hcC5wdXQocHJvcC5nZXRJZCgpLHRleHQuZ2V0VGV4dCgpKTsKLSAgICAJCX0KLSAgICAJfQotICAgIAlyZXR1cm4gcHJvcGVydHlNYXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblJ1bnRpbWVEZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvU2VydmVyVHlwZURlZmluaXRpb25SdW50aW1lRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMmM5MjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblJ1bnRpbWVEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLQotcHVibGljIGNsYXNzIFNlcnZlclR5cGVEZWZpbml0aW9uUnVudGltZURlY29yYXRvciBleHRlbmRzIFNlcnZlclR5cGVEZWZpbml0aW9uRGVjb3JhdG9yIHsKLQotCXByaXZhdGUgR2VuZXJpY1NlcnZlclJ1bnRpbWUgZlJ1bnRpbWU7Ci0JcHVibGljIFNlcnZlclR5cGVEZWZpbml0aW9uUnVudGltZURlY29yYXRvcihTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24sIE1hcCBpbml0aWFsUHJvcGVydGllcywgSVdpemFyZEhhbmRsZSB3aXphcmQsIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUpIHsKLQkJc3VwZXIoZGVmaW5pdGlvbiwgaW5pdGlhbFByb3BlcnRpZXMsQ09OVEVYVF9SVU5USU1FLHdpemFyZCk7Ci0JCWZSdW50aW1lPXJ1bnRpbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKXsKLQotCQlpZihmUnVudGltZT09bnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZlJ1bnRpbWUuc2V0U2VydmVyRGVmaW5pdGlvbklkKGZSdW50aW1lLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotICAgICAgICBmUnVudGltZS5zZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoZ2V0VmFsdWVzKCkpOwotICAgICAgIAotCQlJU3RhdHVzIHN0YXR1cyA9IGZSdW50aW1lLnZhbGlkYXRlKCk7Ci0JCQotCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmlzT0soKSl7Ci0KLQkJCWZXaXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQkJZldpemFyZC51cGRhdGUoKTsKLQkgICAgICAgIFN0cmluZyB3RGlyID0gZlJ1bnRpbWUuZ2V0U2VydmVyVHlwZURlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGZSdW50aW1lLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKCkuZ2V0U3RhcnQoKS5nZXRXb3JraW5nRGlyZWN0b3J5KCkpOyAKLQkgICAgICAgIGZSdW50aW1lLmdldFJ1bnRpbWVXb3JraW5nQ29weSgpLnNldExvY2F0aW9uKG5ldyBQYXRoKHdEaXIpKTsKLQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlmV2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCWZXaXphcmQudXBkYXRlKCk7Ci0JCXJldHVybiB0cnVlOyAKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uU2VydmVyRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uU2VydmVyRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYThjYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNlcnZlckRlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci0vKioKLSAqIFNlcnZlciBwcm9wZXJ0aWVzIGRlY29yYXRvci4KLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNlcnZlckRlY29yYXRvciBleHRlbmRzCi0JCVNlcnZlclR5cGVEZWZpbml0aW9uRGVjb3JhdG9yIHsKLQkKLQlwcml2YXRlIEdlbmVyaWNTZXJ2ZXIgZlNlcnZlcjsKLQlwdWJsaWMgU2VydmVyVHlwZURlZmluaXRpb25TZXJ2ZXJEZWNvcmF0b3IoU2VydmVyUnVudGltZSBkZWZpbml0aW9uLCBNYXAgaW5pdGlhbFByb3BlcnRpZXMsSVdpemFyZEhhbmRsZSB3aXphcmQsR2VuZXJpY1NlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIoZGVmaW5pdGlvbiwgaW5pdGlhbFByb3BlcnRpZXMsQ09OVEVYVF9TRVJWRVIsIHdpemFyZCk7Ci0JCWZTZXJ2ZXI9c2VydmVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gICAgICAgIGlmKGZTZXJ2ZXIhPW51bGwpCi0gICAgICAgIHsKLQkJCWZTZXJ2ZXIuc2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKGdldFZhbHVlcygpKTsKLQkJCXN0YXR1cyA9IGZTZXJ2ZXIudmFsaWRhdGUoKTsKLSAgICAgICAgfQotCQlpZihzdGF0dXM9PW51bGwgfHwgc3RhdHVzLmlzT0soKSkKLQkJewotCQkJZldpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQlmV2l6YXJkLnVwZGF0ZSgpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZldpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJZldpemFyZC51cGRhdGUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvZWRpdG9yL0FudEJ1aWxkRmlsZVNlbGVjdGlvbkVkaXRvclNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvZWRpdG9yL0FudEJ1aWxkRmlsZVNlbGVjdGlvbkVkaXRvclNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhNGRmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL2VkaXRvci9BbnRCdWlsZEZpbGVTZWxlY3Rpb25FZGl0b3JTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklGb3JtQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclNlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBBbnRCdWlsZEZpbGVTZWxlY3Rpb25FZGl0b3JTZWN0aW9uIGV4dGVuZHMgU2VydmVyRWRpdG9yU2VjdGlvbnsKLQlwcm90ZWN0ZWQgR2VuZXJpY1NlcnZlciBmU2VydmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgVGV4dCBidWlsZEZpbGVUZXh0OwotCXByb3RlY3RlZCBib29sZWFuIGZVcGRhdGluZzsKLSAgIAotCXByaXZhdGUgY2xhc3MgQnVpbGRGaWxlRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyewotCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwKLQkJCQlPYmplY3QgZWxlbWVudCkgewotCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGUpZWxlbWVudCk7Ci0JCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5lbmRzV2l0aCgiLnhtbCIpKXsgLy8kTk9OLU5MUy0xJAotCQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCQkJCWlmKCBjb250ZW50VHlwZSAhPSBudWxsKXsKLQkJCQkJCXJldHVybiAib3JnLmVjbGlwc2UuYW50LmNvcmUuYW50QnVpbGRGaWxlIi5lcXVhbHMoY29udGVudFR5cGUuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQkKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0ICYmICEoKElQcm9qZWN0KWVsZW1lbnQpLmlzT3BlbigpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKXsgLy8gaS5lLiBJUHJvamVjdCwgSUZvbGRlcgotCQkJCXRyeSB7Ci0JCQkJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9ICgoSUNvbnRhaW5lcillbGVtZW50KS5tZW1iZXJzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKXsKLQkJCQkJCWlmIChzZWxlY3Qodmlld2VyLCBwYXJlbnRFbGVtZW50LCByZXNvdXJjZXNbaV0pKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vSWdub3JlZAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCX0KLQkJCi0JfQotICAgIAotCXB1YmxpYyB2b2lkIGluaXQoZmluYWwgSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlpZiggc2VydmVyICE9IG51bGwgKXsKLQkJCWZTZXJ2ZXIgPSAoR2VuZXJpY1NlcnZlcilzZXJ2ZXIubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlci5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0ICkgewotCQkJCWlmKGV2dC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoIEdlbmVyaWNTZXJ2ZXJSdW50aW1lLlNFUlZFUl9JTlNUQU5DRV9QUk9QRVJUSUVTICkpIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAhZlVwZGF0aW5nICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmVXBkYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAJCQlPYmplY3QgdmFsdWUgPSBmU2VydmVyLmdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpLmdldChHZW5lcmljU2VydmVyLlBST1BfQ1VTVE9NX0JVSUxEX1NDUklQVCk7Ci0gICAgICAgICAgICAgIAkJCWJ1aWxkRmlsZVRleHQuc2V0VGV4dCh2YWx1ZSA9PSBudWxsPyAiIjogKFN0cmluZyl2YWx1ZSApOyAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGZVcGRhdGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCX07Ci0JCXNlcnZlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciApOwotCi0JCQotCX0KLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVNlY3Rpb24oZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVTZWN0aW9uKHBhcmVudCk7Ci0JCUZvcm1Ub29sa2l0IGZvcm1Ub29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IGZvcm1Ub29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkVYUEFOREVECi0JCQkJfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJCXNlY3Rpb24uc2V0VGV4dChHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5BbnRQdWJsaXNoZXJTZWN0aW9uSGVhZGluZyk7Ci0JCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLkFudFB1Ymxpc2hlclNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5OT05FLHRydWUsZmFsc2UpKTsKLQkJCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZm9ybVRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPTM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDE1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuTk9ORSx0cnVlLGZhbHNlKSk7Ci0JCQotCQkKLQkJTGFiZWwgYnVpbGRGaWxlTGFiZWwgPSBmb3JtVG9vbGtpdC5jcmVhdGVMYWJlbChjb21wb3NpdGUsIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLkxhYmVsQnVpbGRGaWxlKTsKLQkJYnVpbGRGaWxlTGFiZWwuc2V0Rm9yZWdyb3VuZChmb3JtVG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRDb2xvcihJRm9ybUNvbG9ycy5USVRMRSkpOwotCQlidWlsZEZpbGVUZXh0ID0gZm9ybVRvb2xraXQuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgb2xkVmFsdWUgPSBmU2VydmVyLmdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpLmdldChHZW5lcmljU2VydmVyLlBST1BfQ1VTVE9NX0JVSUxEX1NDUklQVCk9PW51bGwgPyIiOiAvLyROT04tTkxTLTEkCi0JCQkoU3RyaW5nKWZTZXJ2ZXIuZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCkuZ2V0KEdlbmVyaWNTZXJ2ZXIuUFJPUF9DVVNUT01fQlVJTERfU0NSSVBUKSA7Ci0JCWJ1aWxkRmlsZVRleHQuc2V0VGV4dChvbGRWYWx1ZSk7Ci0JCQotCQlidWlsZEZpbGVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIG5ldyBMaXN0ZW5lcigpIHsJCQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlleGVjdXRlVXBkYXRlT3BlcmF0aW9uKCBHZW5lcmljU2VydmVyLlBST1BfQ1VTVE9NX0JVSUxEX1NDUklQVCwgYnVpbGRGaWxlVGV4dC5nZXRUZXh0KCkgKTsKLQkJCQkKLQkJCX0KLQkJCi0JCX0pOwotCQkKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlidWlsZEZpbGVUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlCdXR0b24gYnVpbGRGaWxlQnRuID0gZm9ybVRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuQnV0dG9uQnJvd3NlRm9yQnVpbGRGaWxlLCBTV1QuUFVTSCk7Ci0JCWJ1aWxkRmlsZUJ0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coCi0JCQkJCQlwYXJlbnQuZ2V0U2hlbGwoKSwgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwKLQkJCQkJCW5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJCQkvLyBkaWFsb2cuc2V0VmFsaWRhdG9yKG5ldyBGaWxlVmFsaWRhdG9yKCkpOwotCQkJCWRpYWxvZy5zZXRBbGxvd011bHRpcGxlKGZhbHNlKTsKLQkJCQlkaWFsb2cuc2V0VGl0bGUoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuQW50QnVpbGREaWFsb2dUaXRsZSk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuQW50QnVpbGREaWFsb2dEZXNjcmlwdGlvbik7Ci0JCQkJZGlhbG9nLmFkZEZpbHRlcihuZXcgQnVpbGRGaWxlRmlsdGVyKCkpOwotCQkJCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQotCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCQkJYnVpbGRGaWxlVGV4dC5zZXRUZXh0KFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCkuZ2VuZXJhdGVWYXJpYWJsZUV4cHJlc3Npb24oIndvcmtzcGFjZV9sb2MiLGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IAotCi0JCQl9Ci0JCQotCQl9KTsKLQotCQlmb3JtVG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JICAgIHN1cGVyLmRpc3Bvc2UoKTsKLQkgICAgICAgaWYoIHNlcnZlciE9IG51bGwgKQotCSAgICAgICAgICAgIHNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciApOwotCSAgCi0JfQotCQotCXB1YmxpYyBJU3RhdHVzW10gZ2V0U2F2ZVN0YXR1cygpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBmaWxlbmFtZSA9IFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCkucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbihidWlsZEZpbGVUZXh0LmdldFRleHQoKSk7Ci0JCQlpZiAoIGZpbGVuYW1lIT0gbnVsbCAmJiBmaWxlbmFtZS5sZW5ndGgoKT4wICApCi0JCQl7Ci0JCQkJRmlsZSBmID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotCQkJCWlmICggIWYuZXhpc3RzKCkgKXsKLQkJCQkJSVN0YXR1c1tdIHN0ID0gbmV3IFN0YXR1c1sxXTsJCi0JCQkJCXN0WzBdID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLEdlbmVyaWNVaVBsdWdpbi5QTFVHSU5fSUQsR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuRXJyb3JOb0FudEJ1aWxkRmlsZSk7Ci0JCQkJCXJldHVybiBzdDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJR2VuZXJpY1VpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNhdmVTdGF0dXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVXBkYXRlT3BlcmF0aW9uKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKQotCXsKLQkJaWYgKCFmVXBkYXRpbmcpIHsKLQkJCWZVcGRhdGluZyA9IHRydWU7Ci0JCQlleGVjdXRlKG5ldyBVcGRhdGVTZXJ2ZXJQcm9wZXJ0eU9wZXJhdGlvbihzZXJ2ZXIsCi0JCQkJCUdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLlVwZGF0ZU9wZXJhdGlvbkRlc2NyaXB0aW9uLAotCQkJCQlwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpKTsKLQkJCWZVcGRhdGluZyA9IGZhbHNlOwotCQl9Ci0JfQotfSAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlclByb3BlcnRpZXNFZGl0b3JTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJQcm9wZXJ0aWVzRWRpdG9yU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWE1NDQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlclByb3BlcnRpZXNFZGl0b3JTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoZXNMaXN0ZW5lcjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckJlaGF2aW91cjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljU2VydmVyVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuU2VydmVyRWRpdG9yU2VjdGlvbjsKLQotcHVibGljIGNsYXNzIFNlcnZlclByb3BlcnRpZXNFZGl0b3JTZWN0aW9uIGV4dGVuZHMgU2VydmVyRWRpdG9yU2VjdGlvbnsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9JRF9TRVJWRVJfUlVOTklORyA9ICJzZXJ2ZXJfcnVubmluZyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgR2VuZXJpY1NlcnZlciBmU2VydmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQlwcml2YXRlIElMYXVuY2hlc0xpc3RlbmVyMiBmTGF1bmNoTGlzdGVuZXI7Ci0JcHJpdmF0ZSBNYXAgZkNvbnRyb2xzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmVXBkYXRpbmc7Ci0gICAKLSAgICAKLQlwdWJsaWMgdm9pZCBpbml0KGZpbmFsIElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJaWYoc2VydmVyIT1udWxsKXsKLQkJCWZTZXJ2ZXIgPSAoR2VuZXJpY1NlcnZlcilzZXJ2ZXIubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlci5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpewotCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZSggUHJvcGVydHlDaGFuZ2VFdmVudCBldnQgKSB7Ci0JCQkJaWYoZXZ0LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyggR2VuZXJpY1NlcnZlclJ1bnRpbWUuU0VSVkVSX0lOU1RBTkNFX1BST1BFUlRJRVMgKSkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoICFmVXBkYXRpbmcgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZVcGRhdGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250cm9scygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZlVwZGF0aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCX07Ci0JCXNlcnZlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciApOwotCQlmTGF1bmNoTGlzdGVuZXIgPSBuZXcgSUxhdW5jaGVzTGlzdGVuZXIyKCkgewotCQkKLQkJCXB1YmxpYyB2b2lkIGxhdW5jaGVzUmVtb3ZlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQkvL05vdGhpbmcgdG8gZG8KLQkJCX0KLQkJCQotCQkJcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRTZXJ2ZXJMYXVuY2hDb25maWcoSUxhdW5jaFtdIGxhdW5jaGVzKXsKLQkJCQlmb3IgKGludCBpPTA7IGk8IGxhdW5jaGVzLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoQ29uZmlnID0gbGF1bmNoZXNbaV0uZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpOwotCQkJCQkJaWYgKGxhdW5jaENvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIHNlcnZlcklkOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXNlcnZlcklkID0gbGF1bmNoQ29uZmlnLmdldEF0dHJpYnV0ZSggR2VuZXJpY1NlcnZlckJlaGF2aW91ci5BVFRSX1NFUlZFUl9JRCwgKFN0cmluZykgbnVsbCk7Ci0JCQkJCQkJCWlmIChmU2VydmVyLmdldFNlcnZlcigpLmdldElkKCkuZXF1YWxzKHNlcnZlcklkKSkgewotCQkJCQkJCQkJcmV0dXJuIGxhdW5jaENvbmZpZzsKLQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vSWdub3JlCi0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsYXVuY2hlc0NoYW5nZWQoSUxhdW5jaFtdIGxhdW5jaGVzKSB7Ci0JCQkJLy9Ob3RoaW5nIHRvIGRvCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgbGF1bmNoZXNBZGRlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBsYyA9IGdldFNlcnZlckxhdW5jaENvbmZpZyhsYXVuY2hlcyk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoIGxjICAhPSBudWxsKXsKLQkJCQkJCWlmICgidHJ1ZSIuZXF1YWxzKGxjLmdldEF0dHJpYnV0ZShHZW5lcmljU2VydmVyQmVoYXZpb3VyLkFUVFJfU1RPUCwgImZhbHNlIikpKXsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQkJCi0JCQkJCQlzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoIG5ldyBSdW5uYWJsZSgpIHsJCQkJCQkKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtID0gZ2V0TWFuYWdlZEZvcm0oKTsKLQkJCQkJCQkJCW1hbmFnZWRGb3JtLmdldE1lc3NhZ2VNYW5hZ2VyKCkucmVtb3ZlTWVzc2FnZShNRVNTQUdFX0lEX1NFUlZFUl9SVU5OSU5HKTsKLQkJCQkJCQkJCW1hbmFnZWRGb3JtLmdldE1lc3NhZ2VNYW5hZ2VyKCkudXBkYXRlKCk7Ci0JCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQl9KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2V7Ci0JCQkJCQkJc2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7CQkJCQkJCi0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCWdldE1hbmFnZWRGb3JtKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5hZGRNZXNzYWdlKE1FU1NBR0VfSURfU0VSVkVSX1JVTk5JTkcsR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuc2VydmVyUnVubmluZ0Nhbk5vdFNhdmUgLCBudWxsLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJfSk7Ci0JCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJR2VuZXJpY1VpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQkJCQkJCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgbGF1bmNoZXNUZXJtaW5hdGVkKElMYXVuY2hbXSBsYXVuY2hlcykgewotCQkJCWlmKGdldFNlcnZlckxhdW5jaENvbmZpZyhsYXVuY2hlcykgIT0gbnVsbCApCi0JCQkJewotCQkJCQlzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWdldE1hbmFnZWRGb3JtKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5yZW1vdmVNZXNzYWdlKE1FU1NBR0VfSURfU0VSVkVSX1JVTk5JTkcpOwotCQkJCQkJfQkJCQotCQkJCQl9KTsKLQkJCQl9CQkJCQkKLQkJCQkJCi0JCQl9Ci0JCQotCQl9OwotCQkKLQkJZ2V0TGF1bmNoTWFuYWdlcigpLmFkZExhdW5jaExpc3RlbmVyKGZMYXVuY2hMaXN0ZW5lcik7Ci0JCQotCX0KLSAgICAKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLSAgICAgICAgTGlzdCBwcm9wcyA9IGZTZXJ2ZXIuZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFByb3BlcnR5KCk7IAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9wcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmKHByb3BlcnR5LmdldENvbnRleHQoKS5lcXVhbHMoUHJvcGVydHkuQ09OVEVYVF9TRVJWRVIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBQcm9wZXJ0eS5UWVBFX0JPT0xFQU4uZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkgKXsKLSAgICAgICAgICAgICAgICAgICAgQnV0dG9uIGIgPSAoQnV0dG9uKWZDb250cm9scy5nZXQoIHByb3BlcnR5LmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgYi5zZXRTZWxlY3Rpb24oICJ0cnVlIi5lcXVhbHMoICBnZXRQcm9wZXJ0eVZhbHVlKCBwcm9wZXJ0eSApICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBQcm9wZXJ0eS5UWVBFX1NFTEVDVC5lcXVhbHMoIHByb3BlcnR5LmdldFR5cGUoKSApIHx8ICBQcm9wZXJ0eS5UWVBFX1NFTEVDVF9FRElULmVxdWFscyggcHJvcGVydHkuZ2V0VHlwZSgpICkpewotICAgICAgICAgICAgICAgICAgICBDb21ibyBjID0gKENvbWJvKWZDb250cm9scy5nZXQoIHByb3BlcnR5LmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0UHJvcGVydHlWYWx1ZSggcHJvcGVydHkgKT09bnVsbCA/ICIiOiBnZXRQcm9wZXJ0eVZhbHVlKCBwcm9wZXJ0eSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIC8vYy5zZXRUZXh0KCBnZXRQcm9wZXJ0eVZhbHVlKCBwcm9wZXJ0eSApICk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbmRpbmcgdG8gInZhbHVlIG5vdCB1c2VkIiBtc2csIEknbSBhc3N1bWluZyB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgdXNlZCBhcyBpbiBmb2xsb3dpbmcgYmxvY2suCi0gICAgICAgICAgICAgICAgICAgIGMuc2V0VGV4dCggdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgVGV4dCB0ID0gKFRleHQpZkNvbnRyb2xzLmdldCggcHJvcGVydHkuZ2V0SWQoKSApOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRQcm9wZXJ0eVZhbHVlKCBwcm9wZXJ0eSApPT1udWxsID8gIiI6IGdldFByb3BlcnR5VmFsdWUoIHByb3BlcnR5ICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgdC5zZXRUZXh0KCB2YWx1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJRm9ybVRvb2xraXQgZm9ybVRvb2xraXQgPSBnZXRGb3JtVG9vbGtpdChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLQkJU2VjdGlvbiBzZWN0aW9uID0gZm9ybVRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuRVhQQU5ERUQKLQkJCQl8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOwotCQkJc2VjdGlvbi5zZXRUZXh0KEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLlNlcnZlckVkaXRvclNlY3Rpb25UaXRsZSk7Ci0JCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLlNlcnZlckVkaXRvclNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5OT05FLHRydWUsZmFsc2UpKTsKLQkJCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZm9ybVRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPTM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDE1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuTk9ORSx0cnVlLGZhbHNlKSk7Ci0JCQotCQlMaXN0IHByb3BzID0gZlNlcnZlci5nZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UHJvcGVydHkoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSkgaXRlci5uZXh0KCk7Ci0JCQlpZihwcm9wZXJ0eS5nZXRDb250ZXh0KCkuZXF1YWxzKFByb3BlcnR5LkNPTlRFWFRfU0VSVkVSKSkKLQkJCQljcmVhdGVQcm9wZXJ0eUNvbnRyb2woY29tcG9zaXRlLCBwcm9wZXJ0eSxmb3JtVG9vbGtpdCk7Ci0JCX0KLQotCQlmb3JtVG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkKLQkJCi0JCWlmICggZ2V0RXhpc3RpbmdMYXVuY2goKSAhPSBudWxsICl7Ci0JCQlnZXRNYW5hZ2VkRm9ybSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuYWRkTWVzc2FnZShNRVNTQUdFX0lEX1NFUlZFUl9SVU5OSU5HLEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnNlcnZlclJ1bm5pbmdDYW5Ob3RTYXZlICwgbnVsbCwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVXBkYXRlT3BlcmF0aW9uKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKQotCXsKLSAgICAgICAgaWYoICFmVXBkYXRpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmVXBkYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgZXhlY3V0ZSggbmV3IFVwZGF0ZVNlcnZlclByb3BlcnR5T3BlcmF0aW9uKCBzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLlVwZGF0ZU9wZXJhdGlvbkRlc2NyaXB0aW9uLCBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgKSApOwotICAgICAgICAgICAgZlVwZGF0aW5nID0gZmFsc2U7Ci0gICAgICAgIH0KLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb3BlcnR5Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBQcm9wZXJ0eSBwcm9wZXJ0eSwgRm9ybVRvb2xraXQgdG9vbGtpdCl7Ci0gICAgCQotICAgIAlpZiggUHJvcGVydHkuVFlQRV9ESVJFQ1RPUlkuZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAJCWZpbmFsIFRleHQgcGF0aCA9IFNXVFV0aWwuY3JlYXRlTGFiZWxlZFBhdGgocHJvcGVydHkuZ2V0TGFiZWwoKSxnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSxwYXJlbnQsdG9vbGtpdCk7Ci0gICAgICAgICAgICBmQ29udHJvbHMucHV0KCBwcm9wZXJ0eS5nZXRJZCgpLCBwYXRoICk7Ci0gICAgCQlwYXRoLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsJCQkKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJZXhlY3V0ZVVwZGF0ZU9wZXJhdGlvbihwcm9wZXJ0eS5nZXRJZCgpLHBhdGguZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLSAgICAgCX0gZWxzZSBpZiggUHJvcGVydHkuVFlQRV9GSUxFLmVxdWFscyhwcm9wZXJ0eS5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICAKLSAgICAJICAgIGZpbmFsIFRleHQgZmlsZSA9IFNXVFV0aWwuY3JlYXRlTGFiZWxlZEZpbGUocHJvcGVydHkuZ2V0TGFiZWwoKSxnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSxwYXJlbnQsdG9vbGtpdCk7Ci0gICAgCQlmQ29udHJvbHMucHV0KCBwcm9wZXJ0eS5nZXRJZCgpLCBmaWxlICk7Ci0gICAgICAgICAgICBmaWxlLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJZXhlY3V0ZVVwZGF0ZU9wZXJhdGlvbihwcm9wZXJ0eS5nZXRJZCgpLGZpbGUuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsJCi0gICAgICAgCX1lbHNlIGlmKCBQcm9wZXJ0eS5UWVBFX0JPT0xFQU4uZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAJICAgIGZpbmFsIEJ1dHRvbiBib29sID0gU1dUVXRpbC5jcmVhdGVMYWJlbGVkQ2hlY2socHJvcGVydHkuZ2V0TGFiZWwoKSwoInRydWUiLmVxdWFscyggZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSkpKSxwYXJlbnQsdG9vbGtpdCk7IC8vJE5PTi1OTFMtMSQKLSAgICAJICAgIGZDb250cm9scy5wdXQoIHByb3BlcnR5LmdldElkKCksIGJvb2wgKTsKLSAgICAgICAgICAgIGJvb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewkJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZXhlY3V0ZVVwZGF0ZU9wZXJhdGlvbihwcm9wZXJ0eS5nZXRJZCgpLCAgQm9vbGVhbi50b1N0cmluZyhib29sLmdldFNlbGVjdGlvbigpKSk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCS8vIERvIE5vdGhpbmcKLQkJCQl9Ci0JCQl9KTsJCi0gICAgICAgCX1lbHNlIGlmKFByb3BlcnR5LlRZUEVfU0VMRUNULmVxdWFscyhwcm9wZXJ0eS5nZXRUeXBlKCkpKSB7Ci0gICAgCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eS5nZXREZWZhdWx0KCksIiwiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJaW50IHRva2VuQ291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLSAgICAJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbdG9rZW5Db3VudF07Ci0gICAgCQlpbnQgaSA9MDsKLSAgICAJCXdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgJiYgaTx0b2tlbkNvdW50KXsKLSAgICAJCQl2YWx1ZXNbaV09dG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgIAkJCWkrKzsKLSAgICAJCX0KLSAgICAgICAJCWZpbmFsIENvbWJvIGNvbWJvID0gU1dUVXRpbC5jcmVhdGVMYWJlbGVkQ29tYm8ocHJvcGVydHkuZ2V0TGFiZWwoKSwgdmFsdWVzLCBwYXJlbnQsdG9vbGtpdCk7Ci0gICAgICAgCQlmQ29udHJvbHMucHV0KCBwcm9wZXJ0eS5nZXRJZCgpLCBjb21ibyApOwotICAgICAgICAgICAgY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlleGVjdXRlVXBkYXRlT3BlcmF0aW9uKHByb3BlcnR5LmdldElkKCksY29tYm8uZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLSAgICAgICAJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZXhlY3V0ZVVwZGF0ZU9wZXJhdGlvbihwcm9wZXJ0eS5nZXRJZCgpLGNvbWJvLmdldFRleHQoKSk7Ci0JCQkJfQkJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCQl9CQkJCi0JCQl9KTsJCi0gICAgICAgCX1lbHNlIGlmKFByb3BlcnR5LlRZUEVfU0VMRUNUX0VESVQuZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3BlcnR5LmdldERlZmF1bHQoKSwiLCIpOyAvLyROT04tTkxTLTEkCi0gICAgCQlpbnQgdG9rZW5Db3VudCA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotICAgIAkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1t0b2tlbkNvdW50XTsKLSAgICAJCWludCBpID0wOwotICAgIAkJd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSAmJiBpPHRva2VuQ291bnQpewotICAgIAkJCXZhbHVlc1tpXT10b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgCQkJaSsrOwotICAgIAkJfQotICAgICAgIAkJZmluYWwgQ29tYm8gY29tYm8gPSBTV1RVdGlsLmNyZWF0ZUxhYmVsZWRFZGl0YWJsZUNvbWJvKHByb3BlcnR5LmdldExhYmVsKCksIHZhbHVlcyxnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSwgcGFyZW50LHRvb2xraXQpOwotICAgICAgIAkJZkNvbnRyb2xzLnB1dCggcHJvcGVydHkuZ2V0SWQoKSwgY29tYm8gKTsKLSAgICAgICAgICAgIGNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJZXhlY3V0ZVVwZGF0ZU9wZXJhdGlvbihwcm9wZXJ0eS5nZXRJZCgpLGNvbWJvLmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0gICAgICAgCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWV4ZWN1dGVVcGRhdGVPcGVyYXRpb24ocHJvcGVydHkuZ2V0SWQoKSxjb21iby5nZXRUZXh0KCkpOwotCQkJCX0JCQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJfQkJCQotCQkJfSk7CQotICAgICAgIAl9Ci0gICAgICAgCWVsc2UgIHsvLyBQcm9wZXJ0eS5UWVBFX1RFWFQKLSAgICAJICAgIGZpbmFsIFRleHQgZGVmYXVsdFRleHQ9IFNXVFV0aWwuY3JlYXRlTGFiZWxlZFRleHQocHJvcGVydHkuZ2V0TGFiZWwoKSxnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSxwYXJlbnQsdG9vbGtpdCk7Ci0gICAgICAgICAgICBmQ29udHJvbHMucHV0KCBwcm9wZXJ0eS5nZXRJZCgpLCBkZWZhdWx0VGV4dCApOwotICAgIAkJZGVmYXVsdFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlleGVjdXRlVXBkYXRlT3BlcmF0aW9uKHByb3BlcnR5LmdldElkKCksIGRlZmF1bHRUZXh0LmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0gICAgCX0KLSAgICB9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCSByZXR1cm4oU3RyaW5nKSBmU2VydmVyLmdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpLmdldChwcm9wZXJ0eS5nZXRJZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIGlmKCBzZXJ2ZXIhPSBudWxsICkKLSAgICAgICAgICAgIHNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciApOwotICAgICAgIAotICAgICAgICBnZXRMYXVuY2hNYW5hZ2VyKCkucmVtb3ZlTGF1bmNoTGlzdGVuZXIoIGZMYXVuY2hMaXN0ZW5lciApOwotCX0KLQkKLQkKLQlwdWJsaWMgSUxhdW5jaCBnZXRFeGlzdGluZ0xhdW5jaCgpIHsKLQkJSUxhdW5jaE1hbmFnZXIgbGF1bmNoTWFuYWdlciA9IGdldExhdW5jaE1hbmFnZXIoKTsKLQkJCi0JCUlMYXVuY2hbXSBsYXVuY2hlcyA9IGxhdW5jaE1hbmFnZXIuZ2V0TGF1bmNoZXMoKTsKLQkJaW50IHNpemUgPSBsYXVuY2hlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcgPSBsYXVuY2hlc1tpXS5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCQl0cnkgewotCQkJCWlmIChsYXVuY2hDb25maWcgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc2VydmVySWQgPSBsYXVuY2hDb25maWcuZ2V0QXR0cmlidXRlKEdlbmVyaWNTZXJ2ZXJCZWhhdmlvdXIuQVRUUl9TRVJWRVJfSUQsIChTdHJpbmcpIG51bGwpOwotCQkJCQlpZiAoZlNlcnZlci5nZXRTZXJ2ZXIoKS5nZXRJZCgpLmVxdWFscyhzZXJ2ZXJJZCkpIHsKLQkJCQkJCWlmICghbGF1bmNoZXNbaV0uaXNUZXJtaW5hdGVkKCkpCi0JCQkJCQkJcmV0dXJuIGxhdW5jaGVzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElMYXVuY2hNYW5hZ2VyIGdldExhdW5jaE1hbmFnZXIoKSB7Ci0JCUlMYXVuY2hNYW5hZ2VyIGxhdW5jaE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCQlyZXR1cm4gbGF1bmNoTWFuYWdlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlKCl7Ci0JCWlmIChnZXRFeGlzdGluZ0xhdW5jaCgpICE9IG51bGwpewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLEdlbmVyaWNVaVBsdWdpbi5QTFVHSU5fSUQsIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnNlcnZlclJ1bm5pbmdDYW5Ob3RTYXZlKTsKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0JCi0JcHVibGljIElTdGF0dXNbXSBnZXRTYXZlU3RhdHVzKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCApewotCQkJSVN0YXR1c1tdIHN0YXR1c0FycmF5ID0ge3N0YXR1c307Ci0JCQlyZXR1cm4gc3RhdHVzQXJyYXk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNhdmVTdGF0dXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL2VkaXRvci9VcGRhdGVTZXJ2ZXJQcm9wZXJ0eU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9lZGl0b3IvVXBkYXRlU2VydmVyUHJvcGVydHlPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3NzQzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL2VkaXRvci9VcGRhdGVTZXJ2ZXJQcm9wZXJ0eU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuQWJzdHJhY3RPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVNlcnZlclByb3BlcnR5T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gewotCXByaXZhdGUgR2VuZXJpY1NlcnZlciBmR2VuZXJpY1NlcnZlcjsKLQlwcml2YXRlIFN0cmluZyAgZlByb3BlcnR5TmFtZTsKLQlwcml2YXRlIFN0cmluZyBmUFJvcGVydHlWYWx1ZTsKLQlwcml2YXRlIFN0cmluZyBmT2xkVmFsdWU7Ci0JCi0JcHVibGljIFVwZGF0ZVNlcnZlclByb3BlcnR5T3BlcmF0aW9uKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotCQlzdXBlcihuYW1lKTsKLQkJaWYoc2VydmVyIT1udWxsKXsKLQkJCWZHZW5lcmljU2VydmVyID0gKEdlbmVyaWNTZXJ2ZXIpc2VydmVyLmxvYWRBZGFwdGVyKEdlbmVyaWNTZXJ2ZXIuY2xhc3MsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWZQcm9wZXJ0eU5hbWU9cHJvcGVydHlOYW1lOwotCQlmUFJvcGVydHlWYWx1ZT1wcm9wZXJ0eVZhbHVlOwkKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCggZkdlbmVyaWNTZXJ2ZXIuZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCkgKTsKLQkJaWYobWFwLmNvbnRhaW5zS2V5KGZQcm9wZXJ0eU5hbWUpKQotCQl7Ci0gICAgICAgICAgICBmT2xkVmFsdWUgPSAoIFN0cmluZyApbWFwLmdldCggZlByb3BlcnR5TmFtZSApOwotCQkJbWFwLnB1dChmUHJvcGVydHlOYW1lLCBmUFJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBmR2VuZXJpY1NlcnZlci5zZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoIG1hcCApOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixHZW5lcmljVWlQbHVnaW4uUExVR0lOX0lELDAsIlByb3BlcnR5IGNhbiBub3QgYmUgZm91bmQiLG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JCi0JCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlKG1vbml0b3IsaW5mbyk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcChmR2VuZXJpY1NlcnZlci5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKSk7Ci0JCW1hcC5wdXQoZlByb3BlcnR5TmFtZSwgZk9sZFZhbHVlKTsKLSAgICAgICAgZkdlbmVyaWNTZXJ2ZXIuc2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKG1hcCk7Ci0JCXJldHVybiBudWxsOwotCQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmluc3RhbGxhYmxlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmluc3RhbGxhYmxlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmluc3RhbGxhYmxlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDkzNmZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNWRhODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmluc3RhbGxhYmxlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMjAyLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWYyNWUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5pbnN0YWxsYWJsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4MzcwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSMgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SW5zdGFsbGFibGUgc2VydmVyIGFkYXB0ZXJzCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbkRlc2NyaXB0aW9uPVByb3ZpZGVzIGluc3RhbGxhYmxlIHNlcnZlciBhZGFwdGVycwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmluc3RhbGxhYmxlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxYTM5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuaW5zdGFsbGFibGUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW5zdGFsbGFibGVTZXJ2ZXJzIj4KLSAgICA8aW5zdGFsbGFibGVTZXJ2ZXIKLSAgICAgIGlkPSJvcmcuYXBhY2hlLmdlcm9uaW1vLmdlbmVyaWMucnVudGltZS4xMCIKLSAgICAgIGZlYXR1cmVJZD0ib3JnLmFwYWNoZS5nZXJvbmltby5mZWF0dXJlIgotICAgICAgZmVhdHVyZVZlcnNpb249IjEuMi4wIgotICAgICAgZmVhdHVyZVNpdGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2dlcm9uaW1vL2VjbGlwc2UvdXBkYXRlcy8iLz4KLSAgICA8aW5zdGFsbGFibGVTZXJ2ZXIKLSAgICAgIGlkPSJvcmcuYXBhY2hlLmdlcm9uaW1vLmdlbmVyaWMucnVudGltZS4xMCIKLSAgICAgIGZlYXR1cmVJZD0iY29tLmlibS53ZWJzcGhlcmUuY2UuZmVhdHVyZSIKLSAgICAgIGZlYXR1cmVWZXJzaW9uPSIxLjEuMCIKLSAgICAgIGZlYXR1cmVTaXRlPSJodHRwOi8vZG93bmxvYWQuYm91bGRlci5pYm0uY29tL2libWRsL3B1Yi9zb2Z0d2FyZS93ZWJzcGhlcmUvd2FzY2UvdXBkYXRlcy8iLz4KLSAgICA8aW5zdGFsbGFibGVTZXJ2ZXIKLSAgICAgIGlkPSJjb20ucHJhbWF0aSIKLSAgICAgIGZlYXR1cmVJZD0iY29tLnByYW1hdGkuZWNsaXBzZS5mZWF0dXJlIgotICAgICAgZmVhdHVyZVZlcnNpb249IjEuMC4wIgotICAgICAgZmVhdHVyZVNpdGU9Imh0dHA6Ly93d3cucHJhbWF0aS5jb20vZG93bmxvYWRzL2VjbGlwc2UvdXBkYXRlcy8iLz4KLSAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGIwYTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi0uc2V0dGluZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTc4OGNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5NDVmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUdlbmVyaWMgc2VydmVyIFBERSBUZW1wbGF0ZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUuU2VydmVyUGRlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UucGRlLnVpLAotIG9yZy5lY2xpcHNlLnBkZS5jb3JlCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5MzE4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSMgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICAgICAgICAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlc18zLjAvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBzcmMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL2J1aWxkLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTdmMTAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlIiBkZWZhdWx0PSJidWlsZC5qYXJzIiBiYXNlZGlyPSIuIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJiYXNld3MiIHZhbHVlPSIke3dzfSIvPgotCTxwcm9wZXJ0eSBuYW1lPSJiYXNlb3MiIHZhbHVlPSIke29zfSIvPgotCTxwcm9wZXJ0eSBuYW1lPSJiYXNlYXJjaCIgdmFsdWU9IiR7YXJjaH0iLz4KLQk8cHJvcGVydHkgbmFtZT0iYmFzZW5sIiB2YWx1ZT0iJHtubH0iLz4KLQotCTwhLS0gQ29tcGlsZXIgc2V0dGluZ3MuIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJqYXZhY0ZhaWxPbkVycm9yIiB2YWx1ZT0iZmFsc2UiLz4KLQk8cHJvcGVydHkgbmFtZT0iamF2YWNEZWJ1Z0luZm8iIHZhbHVlPSJvbiIvPgotCTxwcm9wZXJ0eSBuYW1lPSJqYXZhY1ZlcmJvc2UiIHZhbHVlPSJ0cnVlIi8+Ci0JPHByb3BlcnR5IG5hbWU9ImphdmFjU291cmNlIiB2YWx1ZT0iMS4zIi8+Ci0JPHByb3BlcnR5IG5hbWU9ImphdmFjVGFyZ2V0IiB2YWx1ZT0iMS4yIi8+Ci0JPHByb3BlcnR5IG5hbWU9ImNvbXBpbGVyQXJnIiB2YWx1ZT0iIi8+Ci0JPHBhdGggaWQ9InBhdGhfYm9vdGNsYXNzcGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHtqYXZhLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotCQk8L2ZpbGVzZXQ+Ci0JPC9wYXRoPgotCTxwcm9wZXJ0eSBuYW1lPSJib290Y2xhc3NwYXRoIiByZWZpZD0icGF0aF9ib290Y2xhc3NwYXRoIi8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnRpZXMiPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJwbHVnaW5UZW1wIiB2YWx1ZT0iJHtidWlsZFRlbXBGb2xkZXJ9L3BsdWdpbnMiPgotCQkJPGlzc2V0IHByb3BlcnR5PSJidWlsZFRlbXBGb2xkZXIiLz4KLQkJPC9jb25kaXRpb24+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5UZW1wIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtwbHVnaW5UZW1wfS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlIj4KLQkJCTxpc3NldCBwcm9wZXJ0eT0iYnVpbGRUZW1wRm9sZGVyIi8+Ci0JCTwvY29uZGl0aW9uPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQucmVzdWx0LmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRlbXAuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfS90ZW1wLmZvbGRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLmRlc3RpbmF0aW9uIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQudXBkYXRlLmphciIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IkJ1aWxkIHRoZSBwbHVnLWluOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlIGZvciBhbiB1cGRhdGUgc2l0ZS4iPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC5qYXJzIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS8iLz4KLQkJPC9hbnRjYWxsPgotCQk8emlwIGRlc3RmaWxlPSIke3BsdWdpbi5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMC5qYXIiIGJhc2VkaXI9IiR7dGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAiIGZpbGVzb25seT0iZmFsc2UiIHdoZW5lbXB0eT0ic2tpcCIgdXBkYXRlPSJmYWxzZSIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iQGRvdCIgZGVwZW5kcz0iaW5pdCIgdW5sZXNzPSJAZG90IiBkZXNjcmlwdGlvbj0iQ3JlYXRlIGphcjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZSBAZG90LiI+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfS9AZG90LmJpbiIvPgotCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfS9AZG90LmJpbiIvPgotCQk8IS0tIGNvbXBpbGUgdGhlIHNvdXJjZSBjb2RlIC0tPgotCQk8amF2YWMgZGVzdGRpcj0iJHt0ZW1wLmZvbGRlcn0vQGRvdC5iaW4iIGZhaWxvbmVycm9yPSIke2phdmFjRmFpbE9uRXJyb3J9IiB2ZXJib3NlPSIke2phdmFjVmVyYm9zZX0iIGRlYnVnPSIke2phdmFjRGVidWdJbmZvfSIgaW5jbHVkZUFudFJ1bnRpbWU9Im5vIiBib290Y2xhc3NwYXRoPSIke2Jvb3RjbGFzc3BhdGh9IiBzb3VyY2U9IiR7amF2YWNTb3VyY2V9IiB0YXJnZXQ9IiR7amF2YWNUYXJnZXR9IgkJPgotCQkJPGNvbXBpbGVyYXJnIGxpbmU9IiR7Y29tcGlsZXJBcmd9Ii8+Ci0JCQk8Y2xhc3NwYXRoPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5vc2dpXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5oZWxwXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5zd3RfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnN3dC53aW4zMi53aW4zMi54ODZfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpmYWNlXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS53b3JrYmVuY2hfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5XzMuMS4wL2NvbXBhdGliaWxpdHkuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5XzMuMS4wL0Bkb3QiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9uc18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXNfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbXBhdGliaWxpdHlfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLndpbjMyXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcl8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuYW50LmNvcmVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi9vcmcuZWNsaXBzZS5wZGUudWkvZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UucGRlLnVpXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi9vcmcuZWNsaXBzZS5wZGUudWkvb3JnLmVjbGlwc2UucGRlLnVpXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS5pZGVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLndpbjMyXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS52aWV3c18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudXBkYXRlLmNvcmVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51cGRhdGUudWlfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmZvcm1zXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5qZmFjZS50ZXh0XzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS50ZXh0XzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcl8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkuZWRpdG9yc18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVyc18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZGVidWcuY29yZV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuZGVidWcudWlfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmNvbnNvbGVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpkdC5jb3JlXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS50ZWFtLmNvcmVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuamR0LmRlYnVnXzMuMS4wL2pkaS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuamR0LmRlYnVnXzMuMS4wL2pkaW1vZGVsLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZHQuZGVidWdfMy4xLjAvdG9vbHMuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmdfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpkdC51aV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uuc2VhcmNoXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb21wYXJlXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZ18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5wZGVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnBkZS5jb3JlXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuYnVpbGRfMy4xLjAvcGRlYnVpbGQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtYW50bHIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtYXBhY2hlLWJjZWwuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtYXBhY2hlLWJzZi5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1hcGFjaGUtbG9nNGouamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtYXBhY2hlLW9yby5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1hcGFjaGUtcmVnZXhwLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWFwYWNoZS1yZXNvbHZlci5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1jb21tb25zLWxvZ2dpbmcuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtY29tbW9ucy1uZXQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtaWNvbnRyYWN0LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWphaS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1qYXZhbWFpbC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1qZGVwZW5kLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWptZi5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1qc2NoLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWp1bml0LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWxhdW5jaGVyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LW5ldHJleHguamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtbm9kZXBzLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LXN0YXJ0ZWFtLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LXN0eWxlYm9vay5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1zd2luZy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC10cmF4LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LXZhai5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC13ZWJsb2dpYy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC14YWxhbjEuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQteHNscC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWFudGxyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1hcGFjaGUtYmNlbC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtYXBhY2hlLWJzZi5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtYXBhY2hlLWxvZzRqLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1hcGFjaGUtb3JvLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1hcGFjaGUtcmVnZXhwLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1hcGFjaGUtcmVzb2x2ZXIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWNvbW1vbnMtbG9nZ2luZy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtY29tbW9ucy1uZXQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWljb250cmFjdC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtamFpLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1qYXZhbWFpbC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtamRlcGVuZC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtam1mLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1qc2NoLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1qdW5pdC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtbGF1bmNoZXIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LW5ldHJleHguamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LW5vZGVwcy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtc3RhcnRlYW0uamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LXN0eWxlYm9vay5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtc3dpbmcuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LXRyYXguamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LXZhai5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtd2VibG9naWMuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LXhhbGFuMS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQteHNscC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL0Bkb3QiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmp1bml0XzMuOC4xL2p1bml0LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5hbnQudWlfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHNfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmpkdC5qdW5pdF8zLjEuMC9qdW5pdHN1cHBvcnQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmpkdC5qdW5pdC5ydW50aW1lXzMuMS4wL2p1bml0cnVudGltZS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkuaW50cm9fMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5oZWxwLmJhc2VfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUubHVjZW5lXzEuNC4zL2x1Y2VuZS0xLjQuMy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5sdWNlbmVfMS40LjMvcGFyc2VyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlcl8zLjEuMC5qYXIiLz4KLQkJCTwvY2xhc3NwYXRoPgotCQkJPHNyYyBwYXRoPSJzcmMvIgkJCS8+Ci0JCQk8L2phdmFjPgotCQk8IS0tIENvcHkgbmVjZXNzYXJ5IHJlc291cmNlcyAtLT4KLQkJPGNvcHkgdG9kaXI9IiR7dGVtcC5mb2xkZXJ9L0Bkb3QuYmluIiBmYWlsb25lcnJvcj0idHJ1ZSIgb3ZlcndyaXRlPSJmYWxzZSI+Ci0JCQk8ZmlsZXNldCBkaXI9InNyYy8iIGV4Y2x1ZGVzPSIqKi8qLmphdmEsICoqL3BhY2thZ2UuaHRtKixudWxsIgkJCS8+Ci0JCTwvY29weT4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfSIvPgotCQk8Y29weSB0b2Rpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9AZG90IiBmYWlsb25lcnJvcj0idHJ1ZSIgb3ZlcndyaXRlPSJmYWxzZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7dGVtcC5mb2xkZXJ9L0Bkb3QuYmluIgkJCS8+Ci0JCTwvY29weT4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9L0Bkb3QuYmluIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InNyYy56aXAiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0ic3JjLnppcCI+Ci0JCTxta2RpciBkaXI9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0iLz4KLQkJPHppcCBkZXN0ZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9zcmMuemlwIiBmaWxlc29ubHk9ImZhbHNlIiB3aGVuZW1wdHk9InNraXAiIHVwZGF0ZT0iZmFsc2UiPgotCQkJPGZpbGVzZXQgZGlyPSJzcmMvIiBpbmNsdWRlcz0iKiovKi5qYXZhIgkJCS8+Ci0JCTwvemlwPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC5qYXJzIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iQnVpbGQgYWxsIHRoZSBqYXJzIGZvciB0aGUgcGx1Zy1pbjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZS4iPgotCQk8YXZhaWxhYmxlIHByb3BlcnR5PSJAZG90IiBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L0Bkb3QiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJAZG90Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLnNvdXJjZXMiIGRlcGVuZHM9ImluaXQiPgotCQk8YXZhaWxhYmxlIHByb3BlcnR5PSJzcmMuemlwIiBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L3NyYy56aXAiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJzcmMuemlwIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImdhdGhlci5iaW4ucGFydHMiIGRlcGVuZHM9ImluaXQiIGlmPSJkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciI+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAiLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAiIGZhaWxvbmVycm9yPSJ0cnVlIiBvdmVyd3JpdGU9ImZhbHNlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9AZG90IiBpbmNsdWRlcz0iKioiCQkJLz4KLQkJPC9jb3B5PgotCQk8Y29weSB0b2Rpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMCIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0iZmFsc2UiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iTUVUQS1JTkYvLG51bGwscGx1Z2luLnhtbCx0ZW1wbGF0ZXNfMy4wLyxpY29ucy8scGx1Z2luLnByb3BlcnRpZXMsYnVpbGQucHJvcGVydGllcyIJCQkvPgotCQk8L2NvcHk+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLnppcHMiIGRlcGVuZHM9ImluaXQiPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJnYXRoZXIuc291cmNlcyIgZGVwZW5kcz0iaW5pdCIgaWY9ImRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIj4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMCIvPgotCQk8Y29weSBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L3NyYy56aXAiIHRvZGlyPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlXzEuMC4wIiBmYWlsb25lcnJvcj0iZmFsc2UiIG92ZXJ3cml0ZT0iZmFsc2UiLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3ZlcndyaXRlPSJmYWxzZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJzcmMvIgkJCS8+Ci0JCTwvY29weT4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2F0aGVyLmxvZ3MiIGRlcGVuZHM9ImluaXQiIGlmPSJkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciI+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAiLz4KLQkJPGNvcHkgZmlsZT0iJHt0ZW1wLmZvbGRlcn0vQGRvdC5iaW4ubG9nIiB0b2Rpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdmVyd3JpdGU9ImZhbHNlIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iQ2xlYW4gdGhlIHBsdWctaW46IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUgb2YgYWxsIHRoZSB6aXBzLCBqYXJzIGFuZCBsb2dzIGNyZWF0ZWQuIj4KLQkJPGRlbGV0ZSBkaXI9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vQGRvdCIvPgotCQk8ZGVsZXRlIGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vc3JjLnppcCIvPgotCQk8ZGVsZXRlIGZpbGU9IiR7cGx1Z2luLmRlc3RpbmF0aW9ufS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlXzEuMC4wLmphciIvPgotCQk8ZGVsZXRlIGZpbGU9IiR7cGx1Z2luLmRlc3RpbmF0aW9ufS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlXzEuMC4wLnppcCIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icmVmcmVzaCIgZGVwZW5kcz0iaW5pdCIgaWY9ImVjbGlwc2UucnVubmluZyIgZGVzY3JpcHRpb249IlJlZnJlc2ggdGhpcyBmb2xkZXIuIj4KLQkJPGVjbGlwc2UuY29udmVydFBhdGggZmlsZVN5c3RlbVBhdGg9IkQ6L19iZ2Uvd29ya3NwYWNlcy93b3Jrc3BhY2Uvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZSIgcHJvcGVydHk9InJlc291cmNlUGF0aCIvPgotCQk8ZWNsaXBzZS5yZWZyZXNoTG9jYWwgcmVzb3VyY2U9IiR7cmVzb3VyY2VQYXRofSIgZGVwdGg9ImluZmluaXRlIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InppcC5wbHVnaW4iIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSB6aXAgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIGZvciB0aGUgcGx1Zy1pbjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZS4iPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC5qYXJzIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYnVpbGQuc291cmNlcyIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImdhdGhlci5iaW4ucGFydHMiPgotCQkJPHBhcmFtIG5hbWU9ImRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIiB2YWx1ZT0iJHt0ZW1wLmZvbGRlcn0vIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJnYXRoZXIuc291cmNlcyI+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS8iLz4KLQkJPC9hbnRjYWxsPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke3RlbXAuZm9sZGVyfSIgaW5jbHVkZXM9IioqLyouYmluLmxvZyIJCQkvPgotCQk8L2RlbGV0ZT4KLQkJPHppcCBkZXN0ZmlsZT0iJHtwbHVnaW4uZGVzdGluYXRpb259L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAuemlwIiBiYXNlZGlyPSIke3RlbXAuZm9sZGVyfSIgZmlsZXNvbmx5PSJ0cnVlIiB3aGVuZW1wdHk9InNraXAiIHVwZGF0ZT0iZmFsc2UiLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvaWNvbnMvb2JqMTYvd2l6X25ld19zZXJ2ZXJfcGx1Z2luLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvaWNvbnMvb2JqMTYvd2l6X25ld19zZXJ2ZXJfcGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZDExYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL2ljb25zL29iajE2L3dpel9uZXdfc2VydmVyX3BsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1OWE1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0jIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgICAgICAgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPSBHZW5lcmljIHNlcnZlciBQREUgVGVtcGxhdGUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotdGVtcGxhdGUuZ2VuZXJpY1NlcnZlci5uYW1lPUdlbmVyaWMgU2VydmVyIFBsdWdpbiBXaXphcmQKLXRlbXBsYXRlLmdlbmVyaWNTZXJ2ZXIuZGVzY3JpcHRpb249XAotPHA+VGhpcyB3aXphcmQgY3JlYXRlcyBhIHNpbXBsZSBnZW5lcmljIHNlcnZlciBwbHVnLWluLiBcCi1UaGUgLnNlcnZlcmRlZiBmaWxlIGFuZCB0aGUgYnVpbGQueG1sIGZpbGUgZm9yIEFOVCBiYXNlZCBwdWJsaXNoaW5nIGFyZSBjcmVhdGVkLiBcCi1DcmVhdGVkIGZpbGVzIGFyZSB0aGUgc2FtZSBmaWxlcyB1c2VkIGZvciBKQm9zcyAzLjIuMyBpbiBHZW5lcmljIEV4YW1wbGVzLiBcCi08L3A+XAotPHA+PGI+RXh0ZW5zaW9uIFVzZWQ8L2I+PC9wPlwKLTxsaT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5zZXJ2ZXJkZWZpbml0aW9uPC9saT4gXAotPGxpPm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVGFyZ2V0SGFuZGxlcnM8L2xpPiBcCi08bGk+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXM8L2xpPiBcCi08bGk+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmRGcmFnbWVudHM8L2xpPiBcCi08bGk+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzPC9saT4gXAotPGxpPm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXM8L2xpPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxOGE0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wZGUudWkucGx1Z2luQ29udGVudCI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0iV1RQIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclBsdWdpbk5ld1dpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL29iajE2L3dpel9uZXdfc2VydmVyX3BsdWdpbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZS5nZW5lcmljU2VydmVyIgotICAgICAgICAgICAgamF2YT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiV0ZW1wbGF0ZS5nZW5lcmljU2VydmVyLm5hbWUiCi0gICAgICAgICAgICByY3A9ImZhbHNlIgotICAgICAgICAgICAgdWktY29udGVudD0idHJ1ZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAldGVtcGxhdGUuZ2VuZXJpY1NlcnZlci5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL1NlcnZlclBkZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9TZXJ2ZXJQZGVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkODc3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL1NlcnZlclBkZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyUGRlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmVyUGRlUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFNlcnZlclBkZVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZlclBkZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUiLCBwYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJQbHVnaW5OZXdXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclBsdWdpbk5ld1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2RhNGFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclBsdWdpbk5ld1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUudWkuSUZpZWxkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUudWkudGVtcGxhdGVzLklUZW1wbGF0ZVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLnVpLnRlbXBsYXRlcy5OZXdQbHVnaW5UZW1wbGF0ZVdpemFyZDsKLS8qKgotICogTmV3IEdlbmVyaWMgc2VydmVyIHBsdWctaW4gd2l6YXJkLiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlclBsdWdpbk5ld1dpemFyZCBleHRlbmRzIE5ld1BsdWdpblRlbXBsYXRlV2l6YXJkIHsKLQotCXB1YmxpYyBJVGVtcGxhdGVTZWN0aW9uW10gY3JlYXRlVGVtcGxhdGVTZWN0aW9ucygpewotCQlyZXR1cm4gbmV3IElUZW1wbGF0ZVNlY3Rpb25bXSB7bmV3IEdlbmVyaWNTZXJ2ZXJUZW1wbGF0ZSgpfTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJRmllbGREYXRhIGRhdGEpIHsKLQkJc3VwZXIuaW5pdChkYXRhKTsKLQkJc2V0V2luZG93VGl0bGUoTWVzc2FnZXMud2luZG93VGl0bGVXaXphcmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclRlbXBsYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjJhYzM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclRlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZS5TZXJ2ZXJQZGVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLmNvcmUucGx1Z2luLklQbHVnaW5CYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5jb3JlLnBsdWdpbi5JUGx1Z2luRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wbHVnaW4uSVBsdWdpbkV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wbHVnaW4uSVBsdWdpbk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wbHVnaW4uSVBsdWdpblJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwudWkud2l6YXJkcy50ZW1wbGF0ZXMuUGx1Z2luUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS51aS50ZW1wbGF0ZXMuT3B0aW9uVGVtcGxhdGVTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS51aS50ZW1wbGF0ZXMuVGVtcGxhdGVPcHRpb247Ci0vKioKLSAqIFNpbXBsZSBnZW5lcmljIHNlcnZlciBwbHVnLWluIHRlbXBsYXRlCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlclRlbXBsYXRlIGV4dGVuZHMgT3B0aW9uVGVtcGxhdGVTZWN0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VSVkVSX1ZFUlNJT04gPSAic2VydmVyX3ZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVJWRVJfU1RBUlRfQkVGT1JFX1BVQkxJU0ggPSAic2VydmVyX3N0YXJ0X2JlZm9yZV9wdWJsaXNoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VSVkVSX0xBVU5DSFRZUEUgPSAic2VydmVyX2xhdW5jaHR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVJWRVJfVkVORE9SID0gInNlcnZlcl92ZW5kb3IiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVJWRVJfREVTQ1JJUFRJT04gPSAic2VydmVyX2Rlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VSVkVSX05BTUUgPSAic2VydmVyX25hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSBsYXVuY2hPcHRzID0ge3siamF2YSIsTWVzc2FnZXMubGFiZWxKYXZhTGF1bmNoQ29uZmlndXJhdGlvbn0seyJleHRlcm5hbCIsTWVzc2FnZXMubGFiZWxFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb259fTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkCi0JCi0JcHJpdmF0ZSBUZW1wbGF0ZU9wdGlvbiBmU2VydmVyTmFtZU9wdGlvbjsKLQlwcml2YXRlIFRlbXBsYXRlT3B0aW9uIGZTZXJ2ZXJEZXNjcmlwdGlvbk9wdGlvbjsKLQlwcml2YXRlIFRlbXBsYXRlT3B0aW9uIGZTZXJ2ZXJWZW5kb3JPcHRpb247Ci0JcHJpdmF0ZSBUZW1wbGF0ZU9wdGlvbiBmU2VydmVyVmVyc2lvbk9wdGlvbjsKLQlwcml2YXRlIFRlbXBsYXRlT3B0aW9uIGZMYXVuY2hUeXBlT3B0aW9uOwotCXByaXZhdGUgVGVtcGxhdGVPcHRpb24gZlN0YXJ0QmVmb3JQdWJsaXNoT3B0aW9uOwotCQotCXB1YmxpYyBHZW5lcmljU2VydmVyVGVtcGxhdGUoKSB7Ci0JCXNldFBhZ2VDb3VudCgxKTsKLQkJY3JlYXRlT3B0aW9ucygpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlT3B0aW9ucygpewotCQotCQlmU2VydmVyTmFtZU9wdGlvbj0gYWRkT3B0aW9uKEtFWV9TRVJWRVJfTkFNRSxNZXNzYWdlcy5sYWJlbFNlcnZlck5hbWUsInlvdXIgc2VydmVyJ3MgbmFtZSIsMCk7IC8vJE5PTi1OTFMtMiQKLQkJZlNlcnZlckRlc2NyaXB0aW9uT3B0aW9uID0gYWRkT3B0aW9uKEtFWV9TRVJWRVJfREVTQ1JJUFRJT04sIkRlc2NyaXB0aW9uIiwiVXNlciBkZXNjcmlwdGlvbiBvZiB5b3VyIHNlcnZlciIsMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmU2VydmVyVmVuZG9yT3B0aW9uPSBhZGRPcHRpb24oS0VZX1NFUlZFUl9WRU5ET1IsTWVzc2FnZXMubGFiZWxTZXJ2ZXJWZW5kb3IsIlNlcnZlciB2ZW5kb3InIHMgbmFtZSIsMCk7IC8vJE5PTi1OTFMtMiQKLQkJZlNlcnZlclZlcnNpb25PcHRpb249IGFkZE9wdGlvbihLRVlfU0VSVkVSX1ZFUlNJT04sTWVzc2FnZXMubGFiZWxTZXJ2ZXJWZXNpb24sIjAiLDApOyAvLyROT04tTkxTLTIkCi0JCWZMYXVuY2hUeXBlT3B0aW9uPSBhZGRPcHRpb24oS0VZX1NFUlZFUl9MQVVOQ0hUWVBFLE1lc3NhZ2VzLmxhYmVsTGF1bmNoVHlwZSxsYXVuY2hPcHRzLCJqYXZhIiwwKTsgLy8kTk9OLU5MUy0yJAotCQlmU3RhcnRCZWZvclB1Ymxpc2hPcHRpb249IGFkZE9wdGlvbihLRVlfU0VSVkVSX1NUQVJUX0JFRk9SRV9QVUJMSVNILE1lc3NhZ2VzLmxhYmVsU3RhcnRCZWZvcmVQdWJsaXNoLGZhbHNlLDApOwotCQkKLQkJZlNlcnZlck5hbWVPcHRpb24uc2V0UmVxdWlyZWQodHJ1ZSk7Ci0JCWZTZXJ2ZXJEZXNjcmlwdGlvbk9wdGlvbi5zZXRSZXF1aXJlZCh0cnVlKTsKLQkJZlNlcnZlclZlbmRvck9wdGlvbi5zZXRSZXF1aXJlZCh0cnVlKTsKLQkJZlNlcnZlclZlcnNpb25PcHRpb24uc2V0UmVxdWlyZWQodHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VjdGlvbklkKCkgewotCQlyZXR1cm4gImdlbmVyaWNzZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTW9kZWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLQkJSVBsdWdpbkJhc2UgcGx1Z2luID0gbW9kZWwuZ2V0UGx1Z2luQmFzZSgpOwotCQlJUGx1Z2luTW9kZWxGYWN0b3J5IGZhY3RvcnkgPSBtb2RlbC5nZXRQbHVnaW5GYWN0b3J5KCk7CQkKLQkJYWRkUnVudGltZVR5cGUocGx1Z2luLCBmYWN0b3J5KTsKLQkJYWRkU2VydmVyVHlwZShwbHVnaW4sIGZhY3RvcnkpOwotCQlhZGRXaXphcmRGcmFnbWVudChwbHVnaW4sIGZhY3RvcnkpOwotCQlhZGRTZXJ2ZXJJbWFnZShwbHVnaW4sIGZhY3RvcnkpOwotCQlhZGRSdW50aW1lVGFyZ2V0SGFuZGxlcihwbHVnaW4sIGZhY3RvcnkpOwotCQlhZGRTZXJ2ZXJEZWZpbml0aW9uKHBsdWdpbiwgZmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlcnZlckRlZmluaXRpb24oSVBsdWdpbkJhc2UgcGx1Z2luLCBJUGx1Z2luTW9kZWxGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBsdWdpbkV4dGVuc2lvbiBkZWZpbml0aW9uRXh0ZW5zaW9uID0gY3JlYXRlRXh0ZW5zaW9uKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5zZXJ2ZXJkZWZpbml0aW9uIix0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlJUGx1Z2luRWxlbWVudCBzZXJ2ZXJEZWYgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQoZGVmaW5pdGlvbkV4dGVuc2lvbik7Ci0JCXNlcnZlckRlZi5zZXROYW1lKCJzZXJ2ZXJkZWZpbml0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyRGVmLnNldEF0dHJpYnV0ZSgiaWQiLGdldFJ1bnRpbWVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJEZWYuc2V0QXR0cmlidXRlKCJkZWZpbml0aW9uZmlsZSIsIi9zZXJ2ZXJzLyIrZ2V0U3RyaW5nT3B0aW9uKEtFWV9TRVJWRVJfTkFNRSkrIi5zZXJ2ZXJkZWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJZGVmaW5pdGlvbkV4dGVuc2lvbi5hZGQoc2VydmVyRGVmKTsKLQkJaWYoIWRlZmluaXRpb25FeHRlbnNpb24uaXNJblRoZU1vZGVsKCkpCi0JCQlwbHVnaW4uYWRkKGRlZmluaXRpb25FeHRlbnNpb24pOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJ1bnRpbWVUYXJnZXRIYW5kbGVyKElQbHVnaW5CYXNlIHBsdWdpbiwgSVBsdWdpbk1vZGVsRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQbHVnaW5FeHRlbnNpb24gaGFuZGxlckV4dGVuc2lvbiA9IGNyZWF0ZUV4dGVuc2lvbigib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUYXJnZXRIYW5kbGVycyIsdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVBsdWdpbkVsZW1lbnQgaGFuZGxlcj0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KGhhbmRsZXJFeHRlbnNpb24pOwotCQloYW5kbGVyLnNldE5hbWUoInJ1bnRpbWVUYXJnZXRIYW5kbGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJaGFuZGxlci5zZXRBdHRyaWJ1dGUoImlkIixnZXROYW1lc3BhY2UoKSsiLnJ1bnRpbWVUYXJnZXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWhhbmRsZXIuc2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkcyIsZ2V0UnVudGltZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCWhhbmRsZXIuc2V0QXR0cmlidXRlKCJjbGFzcyIsIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lVGFyZ2V0SGFuZGxlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaGFuZGxlckV4dGVuc2lvbi5hZGQoaGFuZGxlcik7Ci0JCWlmKCFoYW5kbGVyRXh0ZW5zaW9uLmlzSW5UaGVNb2RlbCgpKQotCQkJcGx1Z2luLmFkZChoYW5kbGVyRXh0ZW5zaW9uKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBhZGRTZXJ2ZXJJbWFnZShJUGx1Z2luQmFzZSBwbHVnaW4sIElQbHVnaW5Nb2RlbEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGx1Z2luRXh0ZW5zaW9uIGltYWdlRXh0ZW5zaW9uID0gY3JlYXRlRXh0ZW5zaW9uKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnNlcnZlckltYWdlcyIsdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVBsdWdpbkVsZW1lbnQgc2VydmVySW1hZ2UgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQoaW1hZ2VFeHRlbnNpb24pOwotCQlzZXJ2ZXJJbWFnZS5zZXROYW1lKCJpbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXNlcnZlckltYWdlLnNldEF0dHJpYnV0ZSgiaWQiLGdldE5hbWVzcGFjZSgpKyIuc2VydmVySW1hZ2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNlcnZlckltYWdlLnNldEF0dHJpYnV0ZSgiaWNvbiIsImljb25zL3NlcnZlci5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNlcnZlckltYWdlLnNldEF0dHJpYnV0ZSgidHlwZUlkcyIsZ2V0U2VydmVySWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW1hZ2VFeHRlbnNpb24uYWRkKHNlcnZlckltYWdlKTsKLQkJCi0JCUlQbHVnaW5FbGVtZW50IHJ1bnRpbWVJbWFnZSA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudChpbWFnZUV4dGVuc2lvbik7Ci0JCXJ1bnRpbWVJbWFnZS5zZXROYW1lKCJpbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXJ1bnRpbWVJbWFnZS5zZXRBdHRyaWJ1dGUoImlkIixnZXROYW1lc3BhY2UoKSsiLnJ1bnRpbWVJbWFnZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcnVudGltZUltYWdlLnNldEF0dHJpYnV0ZSgiaWNvbiIsImljb25zL3NlcnZlci5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJ1bnRpbWVJbWFnZS5zZXRBdHRyaWJ1dGUoInR5cGVJZHMiLGdldFJ1bnRpbWVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlpbWFnZUV4dGVuc2lvbi5hZGQocnVudGltZUltYWdlKTsKLQkJaWYoIWltYWdlRXh0ZW5zaW9uLmlzSW5UaGVNb2RlbCgpKQotCQkJcGx1Z2luLmFkZChpbWFnZUV4dGVuc2lvbik7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgYWRkV2l6YXJkRnJhZ21lbnQoSVBsdWdpbkJhc2UgcGx1Z2luLCBJUGx1Z2luTW9kZWxGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBsdWdpbkV4dGVuc2lvbiB3aXphcmRFeHRlbnNpb24gPSBjcmVhdGVFeHRlbnNpb24oIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkRnJhZ21lbnRzIix0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlJUGx1Z2luRWxlbWVudCBydW50aW1lV2l6ID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHdpemFyZEV4dGVuc2lvbik7Ci0JCXJ1bnRpbWVXaXouc2V0TmFtZSgiZnJhZ21lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlydW50aW1lV2l6LnNldEF0dHJpYnV0ZSgiaWQiLGdldE5hbWVzcGFjZSgpKyIucnVudGltZVdpemFyZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcnVudGltZVdpei5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJ1bnRpbWVXaXouc2V0QXR0cmlidXRlKCJ0eXBlSWRzIixnZXRSdW50aW1lSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJd2l6YXJkRXh0ZW5zaW9uLmFkZChydW50aW1lV2l6KTsKLQkJaWYoIXdpemFyZEV4dGVuc2lvbi5pc0luVGhlTW9kZWwoKSkKLQkJCXBsdWdpbi5hZGQod2l6YXJkRXh0ZW5zaW9uKTsKLQkJCi0JCUlQbHVnaW5FbGVtZW50IHNlcnZlcldpeiA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudCh3aXphcmRFeHRlbnNpb24pOwotCQlzZXJ2ZXJXaXouc2V0TmFtZSgiZnJhZ21lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJXaXouc2V0QXR0cmlidXRlKCJpZCIsZ2V0TmFtZXNwYWNlKCkrIi5zZXJ2ZXJXaXphcmQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHNlcnZlcldpei5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJXaXphcmRGcmFnbWVudCIpOyAgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyV2l6LnNldEF0dHJpYnV0ZSgidHlwZUlkcyIsZ2V0U2VydmVySWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJd2l6YXJkRXh0ZW5zaW9uLmFkZChzZXJ2ZXJXaXopOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlcnZlclR5cGUoSVBsdWdpbkJhc2UgcGx1Z2luLCBJUGx1Z2luTW9kZWxGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBsdWdpbkV4dGVuc2lvbiBzZXJ2ZXJFeHRlbnNpb24gPWNyZWF0ZUV4dGVuc2lvbigib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzIix0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlJUGx1Z2luRWxlbWVudCBzZXJ2ZXJUeXBlID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHNlcnZlckV4dGVuc2lvbik7Ci0JCXNlcnZlclR5cGUuc2V0TmFtZSgic2VydmVyVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCXNlcnZlclR5cGUuc2V0QXR0cmlidXRlKCJydW50aW1lIiwidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoImlkIixnZXRTZXJ2ZXJJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgiaW5pdGlhbFN0YXRlIiwic3RvcHBlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoInN1cHBvcnRzUmVtb3RlSG9zdHMiLCJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoInJ1bnRpbWVUeXBlSWQiLGdldFJ1bnRpbWVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iLGdldFN0cmluZ09wdGlvbihLRVlfU0VSVkVSX0RFU0NSSVBUSU9OKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoImxhdW5jaENvbmZpZ0lkIixnZXRTZWxlY3RlZENvbmZpZ1R5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoImJlaGF2aW91ckNsYXNzIixnZXRTZWxlY3RlZEJlaGF2aW91ckNsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCXNlcnZlclR5cGUuc2V0QXR0cmlidXRlKCJuYW1lIixnZXRTdHJpbmdPcHRpb24oS0VZX1NFUlZFUl9OQU1FKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoInN0YXJ0VGltZW91dCIsIjc1MDAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgic3RvcFRpbWVvdXQiLCIzMDAwMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoImhhc0NvbmZpZ3VyYXRpb24iLCJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoImxhdW5jaE1vZGVzIiwicnVuLGRlYnVnIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgic3RhcnRCZWZvcmVQdWJsaXNoIiwgQm9vbGVhbi50b1N0cmluZyhnZXRCb29sZWFuT3B0aW9uKEtFWV9TRVJWRVJfU1RBUlRfQkVGT1JFX1BVQkxJU0gpKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyRXh0ZW5zaW9uLmFkZChzZXJ2ZXJUeXBlKTsKLQkJaWYoIXNlcnZlckV4dGVuc2lvbi5pc0luVGhlTW9kZWwoKSkKLQkJCXBsdWdpbi5hZGQoc2VydmVyRXh0ZW5zaW9uKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBhZGRSdW50aW1lVHlwZShJUGx1Z2luQmFzZSBwbHVnaW4sIElQbHVnaW5Nb2RlbEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGx1Z2luRXh0ZW5zaW9uIGV4dGVuc2lvbiA9Y3JlYXRlRXh0ZW5zaW9uKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZVR5cGVzIix0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlJUGx1Z2luRWxlbWVudCBydW50aW1lVHlwZSA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudChleHRlbnNpb24pOwotCQlydW50aW1lVHlwZS5zZXROYW1lKCJydW50aW1lVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCXJ1bnRpbWVUeXBlLnNldEF0dHJpYnV0ZSgiaWQiLGdldFJ1bnRpbWVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlydW50aW1lVHlwZS5zZXRBdHRyaWJ1dGUoIm5hbWUiLGdldFN0cmluZ09wdGlvbihLRVlfU0VSVkVSX05BTUUpKTsgLy8kTk9OLU5MUy0xJAotCQlydW50aW1lVHlwZS5zZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIixnZXRTdHJpbmdPcHRpb24oS0VZX1NFUlZFUl9ERVNDUklQVElPTikpOyAvLyROT04tTkxTLTEkCi0JCXJ1bnRpbWVUeXBlLnNldEF0dHJpYnV0ZSgidmVuZG9yIixnZXRTdHJpbmdPcHRpb24oS0VZX1NFUlZFUl9WRU5ET1IpKTsgLy8kTk9OLU5MUy0xJAotCQlydW50aW1lVHlwZS5zZXRBdHRyaWJ1dGUoInZlcnNpb24iLGdldFN0cmluZ09wdGlvbihLRVlfU0VSVkVSX1ZFUlNJT04pKTsgLy8kTk9OLU5MUy0xJAotCQlydW50aW1lVHlwZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQlJUGx1Z2luRWxlbWVudCBtb2R1bGVUeXBlID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHJ1bnRpbWVUeXBlKTsKLQkJbW9kdWxlVHlwZS5zZXROYW1lKCJtb2R1bGVUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJbW9kdWxlVHlwZS5zZXRBdHRyaWJ1dGUoInR5cGVzIiwianN0LndlYiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgbW9kdWxlVHlwZS5zZXRBdHRyaWJ1dGUoInZlcnNpb25zIiwiMS4yLCAxLjMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHJ1bnRpbWVUeXBlLmFkZChtb2R1bGVUeXBlKTsKLSAgICAgICAgCi0JCWV4dGVuc2lvbi5hZGQocnVudGltZVR5cGUpOwotCQlpZighZXh0ZW5zaW9uLmlzSW5UaGVNb2RlbCgpKQotCQkJcGx1Z2luLmFkZChleHRlbnNpb24pOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRSdW50aW1lSWQoKXsKLQkJcmV0dXJuIGdldE5hbWVzcGFjZSgpKyIucnVudGltZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2VydmVySWQoKXsKLQkJcmV0dXJuIGdldE5hbWVzcGFjZSgpKyIuc2VydmVyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lc3BhY2UoKQotCXsKLQkJcmV0dXJuIG1vZGVsLmdldFBsdWdpbkJhc2UoKS5nZXRJZCgpOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRTZWxlY3RlZEJlaGF2aW91ckNsYXNzKCkgewotCQlpZihpc0V4dGVybmFsU2VsZWN0ZWQoKSkKLQkJCXJldHVybiAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuRXh0ZXJuYWxTZXJ2ZXJCZWhhdmlvdXIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckJlaGF2aW91ciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeHRlcm5hbFNlbGVjdGVkKCl7Ci0JCVN0cmluZyBzZWxlY3RlZFR5cGUgPSBnZXRTdHJpbmdPcHRpb24oS0VZX1NFUlZFUl9MQVVOQ0hUWVBFKTsKLQkJcmV0dXJuICJleHRlcm5hbCIuZXF1YWxzKHNlbGVjdGVkVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTZWxlY3RlZENvbmZpZ1R5cGUoKXsKLQkJaWYoaXNFeHRlcm5hbFNlbGVjdGVkKCkpCi0JCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSBnZXRQbHVnaW5SZXNvdXJjZUJ1bmRsZSgpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldE5ld0ZpbGVzKCl7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117Imljb25zLyIsICJzZXJ2ZXIvIiwiYnVpbGRmaWxlcy8ifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZWRFeHRlbnNpb25Qb2ludCgpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVPcHRpb25zKFRlbXBsYXRlT3B0aW9uIGNoYW5nZWQpewotCQlpZihjaGFuZ2VkLmlzUmVxdWlyZWQoKSAmJiBjaGFuZ2VkLmlzRW1wdHkoKSl7Ci0JCQlmbGFnTWlzc2luZ1JlcXVpcmVkT3B0aW9uKGNoYW5nZWQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVRlbXBsYXRlT3B0aW9uW10gb3B0aW9ucyA9IGdldE9wdGlvbnMoMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYob3B0aW9uc1tpXS5pc1JlcXVpcmVkKCkgJiYgb3B0aW9uc1tpXS5pc0VtcHR5KCkpewotCQkJCWZsYWdNaXNzaW5nUmVxdWlyZWRPcHRpb24ob3B0aW9uc1tpXSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXJlc2V0UGFnZVN0YXRlKCk7Ci0JfQotCQotCQotCQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKFdpemFyZCB3aXphcmQpIHsKLQkJV2l6YXJkUGFnZSBwYWdlID0gY3JlYXRlUGFnZSgwKTsKLQkJcGFnZS5zZXRUaXRsZShNZXNzYWdlcy5wYWdlVGl0bGUpOwotCQlwYWdlLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnBhZ2VEZXNjcmlwdGlvbik7Ci0JCXdpemFyZC5hZGRQYWdlKHBhZ2UpOwotCQltYXJrUGFnZXNBZGRlZCgpOwotCX0KLQkKLQkKLSAKLQlwcm90ZWN0ZWQgVVJMIGdldEluc3RhbGxVUkwoKSB7Ci0JCXJldHVybiBTZXJ2ZXJQZGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucGRlLnVpLnRlbXBsYXRlcy5BYnN0cmFjdFRlbXBsYXRlU2VjdGlvbiNnZXREZXBlbmRlbmNpZXMoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVBsdWdpblJlZmVyZW5jZVtdIGdldERlcGVuZGVuY2llcyhTdHJpbmcgc2NoZW1hVmVyc2lvbikgewotCQlJUGx1Z2luUmVmZXJlbmNlW10gZGVwID0gbmV3IElQbHVnaW5SZWZlcmVuY2VbNF07Ci0JCWRlcFswXSA9IG5ldyBQbHVnaW5SZWZlcmVuY2UoIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIsIG51bGwsIDApOyAvLyROT04tTkxTLTEkCi0JCWRlcFsxXSA9IG5ldyBQbHVnaW5SZWZlcmVuY2UoIm9yZy5lY2xpcHNlLnVpIiwgbnVsbCwgMCk7IC8vJE5PTi1OTFMtMSQKLQkJZGVwWzJdID0gbmV3IFBsdWdpblJlZmVyZW5jZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiLCBudWxsLCAwKTsgLy8kTk9OLU5MUy0xJAotCQlkZXBbM10gPSBuZXcgUGx1Z2luUmVmZXJlbmNlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkiLCBudWxsLCAwKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVwOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoU3RyaW5nIHZhcmlhYmxlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRWYWx1ZSh2YXJpYWJsZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjM1N2VhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUuaW50ZXJuYWwubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbEphdmFMYXVuY2hDb25maWd1cmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGFiZWxFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbFNlcnZlck5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbFNlcnZlclZlbmRvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxhYmVsU2VydmVyVmVzaW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGFiZWxMYXVuY2hUeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGFiZWxTdGFydEJlZm9yZVB1Ymxpc2g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aW5kb3dUaXRsZVdpemFyZDsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5MGNlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSMgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICAgICAgICAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWxhYmVsSmF2YUxhdW5jaENvbmZpZ3VyYXRpb249SmF2YSBsYXVuY2ggY29maWd1cmF0aW9uCi1sYWJlbEV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbj1FeHRlcm5hbCBsYXVuY2ggY29uZmlndXJhdGlvbgotbGFiZWxTZXJ2ZXJOYW1lPVNlcnZlciBOYW1lCi1sYWJlbFNlcnZlclZlbmRvcj1TZXJ2ZXIgVmVuZG9yCi1sYWJlbFNlcnZlclZlc2lvbj1TZXJ2ZXIgVmVyc2lvbgotbGFiZWxMYXVuY2hUeXBlPUxhdW5jaCB0eXBlCi1sYWJlbFN0YXJ0QmVmb3JlUHVibGlzaD1TdGFydCBCZWZvcmUgcHVibGlzaAotcGFnZVRpdGxlPUdlbmVyaWMgU2VydmVyIFBsdWctaW4KLXBhZ2VEZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgR2VuZXJpYyBzZXJ2ZXIgcGx1Zy1pbgotd2luZG93VGl0bGVXaXphcmQ9TmV3IEdlbmVyaWMgU2VydmVyIHBsdWctaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvdGVtcGxhdGVzXzMuMC9nZW5lcmljc2VydmVyL2J1aWxkZmlsZXMvJHNlcnZlcl9uYW1lJC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3RlbXBsYXRlc18zLjAvZ2VuZXJpY3NlcnZlci9idWlsZGZpbGVzLyRzZXJ2ZXJfbmFtZSQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzIwY2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvdGVtcGxhdGVzXzMuMC9nZW5lcmljc2VydmVyL2J1aWxkZmlsZXMvJHNlcnZlcl9uYW1lJC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJkZXBsb3lleHRlbnNpb24iICBkZWZhdWx0PSJkZXBsb3kuajJlZS53ZWIiICBiYXNlZGlyPSIuIj4KLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLndlYiI+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIj4gCi0JCQk8emlwZmlsZXNldCBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCSAgICAgICAgCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCQkJCTxleGNsdWRlIG5hbWU9IioqLyoud2FyIi8+Ci0JCQk8L3ppcGZpbGVzZXQ+Ci0JCTwvamFyPgotICAJCTxtb3ZlIGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIiB0b2Rpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJkZXBsb3kuajJlZS5lamIiPgotCQk8amFyIGRlc3RmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciI+IAotCQkJPHppcGZpbGVzZXQgZGlyPSIke21vZHVsZS5kaXJ9Ij4KLQkgICAgICAgIAk8aW5jbHVkZSBuYW1lPSIqKi8qLioiLz4KLQkgICAgICAgCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0gIAkJPG1vdmUgZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiIHRvZGlyPSIke3NlcnZlci5wdWJsaXNoLmRpcn0iLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLmVhciI+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIj4gCi0JCQk8emlwZmlsZXNldCBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCSAgICAgICAgCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCSAgICAgICAJCTxleGNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotCQkJPC96aXBmaWxlc2V0PgotCQk8L2phcj4KLSAgCQk8bW92ZSBmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciIgdG9kaXI9IiR7c2VydmVyLnB1Ymxpc2guZGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0idW5kZXBsb3kuajJlZS53ZWIiPgotCQk8ZGVsZXRlIGZpbGU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS53YXIiPiA8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InVuZGVwbG95LmoyZWUuZWpiIj4KLQkJPGRlbGV0ZSBmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIj4gPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLmVhciI+Ci0JCTxkZWxldGUgZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciI+IDwvZGVsZXRlPgotCTwvdGFyZ2V0PgkKLQkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3RlbXBsYXRlc18zLjAvZ2VuZXJpY3NlcnZlci9pY29ucy9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS90ZW1wbGF0ZXNfMy4wL2dlbmVyaWNzZXJ2ZXIvaWNvbnMvc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxYWUzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3RlbXBsYXRlc18zLjAvZ2VuZXJpY3NlcnZlci9pY29ucy9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS90ZW1wbGF0ZXNfMy4wL2dlbmVyaWNzZXJ2ZXIvc2VydmVycy8kc2VydmVyX25hbWUkLnNlcnZlcmRlZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvdGVtcGxhdGVzXzMuMC9nZW5lcmljc2VydmVyL3NlcnZlcnMvJHNlcnZlcl9uYW1lJC5zZXJ2ZXJkZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMjg3MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS90ZW1wbGF0ZXNfMy4wL2dlbmVyaWNzZXJ2ZXIvc2VydmVycy8kc2VydmVyX25hbWUkLnNlcnZlcmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHRuczpTZXJ2ZXJSdW50aW1lCi0JeG1sbnM6dG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIFNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCAiCi0JbmFtZT0iSkJPU1MgMy4yLjMiIHZlcnNpb249InYzLjIuMyI+Ci08cHJvcGVydHkgaWQ9InNlcnZlclJvb3REaXJlY3RvcnkiCi0JbGFiZWw9IiVBcHBsaWNhdGlvblNlcnZlckRpcmVjdG9yeSIKLQl0eXBlPSJkaXJlY3RvcnkiCi0JY29udGV4dD0icnVudGltZSIKLQlkZWZhdWx0PSIveW91cl9zZXJ2ZXJfcm9vdC9hcHBzZXJ2ZXJzL2pib3NzLTMuMi4zIiAvPgotPHByb3BlcnR5IGlkPSJzZXJ2ZXJBZGRyZXNzIgotCWxhYmVsPSIlc2VydmVyQWRkcmVzcyIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9IjEyNy4wLjAuMSIgLz4KLTxwcm9wZXJ0eSBpZD0icG9ydCIKLQlsYWJlbD0iJXNlcnZlclBvcnQiCi0JdHlwZT0ic3RyaW5nIgotCWNvbnRleHQ9InNlcnZlciIKLQlkZWZhdWx0PSI4MDgwIiAvPgotPHByb3BlcnR5IGlkPSJzZXJ2ZXJDb25maWciCi0JbGFiZWw9IiVqYm9zczMyM3NlcnZlckNvbmZpZyIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9ImRlZmF1bHQiIC8+Ci08cHJvcGVydHkgaWQ9ImNsYXNzUGF0aCIKLQlsYWJlbD0iJXNlcnZlcmNsYXNzUGF0aCIKLQl0eXBlPSJkaXJlY3RvcnkiCi0JY29udGV4dD0icnVudGltZSIKLQlkZWZhdWx0PSIveW91cl9zZXJ2ZXJfcm9vdC9hcHBzZXJ2ZXJzL2pib3NzLTMuMi4zIiAvPgotCi0JPHBvcnQ+Ci0JCTxubz4kJHtwb3J0fTwvbm8+Ci0JCTxuYW1lPkh0dHA8L25hbWU+Ci0JCTxwcm90b2NvbD5odHRwPC9wcm90b2NvbD4KLQk8L3BvcnQ+Ci0KLQk8bW9kdWxlPgotCQk8dHlwZT5qMmVlLndlYjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JCR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyQke3NlcnZlckNvbmZpZ30vZGVwbG95PC9wdWJsaXNoRGlyPgotCQk8cHVibGlzaGVyUmVmZXJlbmNlPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQk8bW9kdWxlPgotCQk8dHlwZT5qMmVlLmVqYjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JCR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyQke3NlcnZlckNvbmZpZ30vZGVwbG95PC9wdWJsaXNoRGlyPgotCQk8cHVibGlzaGVyUmVmZXJlbmNlPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQk8bW9kdWxlPgotCQk8dHlwZT5qMmVlLmVhcjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JCR7c2VydmVyUm9vdERpcmVjdG9yeX0vc2VydmVyLyQke3NlcnZlckNvbmZpZ30vZGVwbG95PC9wdWJsaXNoRGlyPgotCQk8cHVibGlzaGVyUmVmZXJlbmNlPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQotCTxwcm9qZWN0PgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpib3NzLnByb2plY3Q8L2NsYXNzcGF0aFJlZmVyZW5jZT4KLQk8L3Byb2plY3Q+Ci0JCi0JPHN0YXJ0PgotCQk8bWFpbkNsYXNzPm9yZy5qYm9zcy5NYWluPC9tYWluQ2xhc3M+Ci0JCTx3b3JraW5nRGlyZWN0b3J5PiQke3NlcnZlclJvb3REaXJlY3Rvcnl9L2Jpbjwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+LWMgJCR7c2VydmVyQ29uZmlnfTwvcHJvZ3JhbUFyZ3VtZW50cz4KLQkJPHZtUGFyYW1ldGVycz48L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zczwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RhcnQ+Ci0KLQk8c3RvcD4KLQkJPG1haW5DbGFzcz5vcmcuamJvc3MuU2h1dGRvd248L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JCR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluPC93b3JraW5nRGlyZWN0b3J5PgotCQk8cHJvZ3JhbUFyZ3VtZW50cz4tUzwvcHJvZ3JhbUFyZ3VtZW50cz4KLQkJPHZtUGFyYW1ldGVycz48L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT5qYm9zczwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvc3RvcD4KLQk8cHVibGlzaGVyIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyIj4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+YnVpbGQuZmlsZTwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPi9idWlsZGZpbGVzL2pib3NzMzIzLnhtbDwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmoyZWUud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUud2ViPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guajJlZS5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmoyZWUud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS53ZWI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQudW5wdWJsaXNoLmoyZWUuZWpiPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qMmVlLmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVhcjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guajJlZS5lYXI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLmVhcjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+CQkJCQotCTwvcHVibGlzaGVyPgotCi0JPGNsYXNzcGF0aCBpZD0iamJvc3MiID4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9iaW4vcnVuLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9iaW4vc2h1dGRvd24uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2NsaWVudC9qYm9zcy1qMmVlLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9zZXJ2ZXIvJCR7c2VydmVyQ29uZmlnfS9saWIvamF2YXguc2VydmxldC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vbGliL2pib3NzLWJvb3QuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi9qYm9zcy1zeXN0ZW0uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi9qYm9zcy1qbXguamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi9qYm9zcy1jb21tb24uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi9jb25jdXJyZW50LmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9zZXJ2ZXIvJCR7c2VydmVyQ29uZmlnfS9saWIvamJvc3MuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L3NlcnZlci8kJHtzZXJ2ZXJDb25maWd9L2xpYi9qbnBzZXJ2ZXIuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L3NlcnZlci8kJHtzZXJ2ZXJDb25maWd9L2xpYi9qcGwtcGF0dGVybi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vc2VydmVyLyQke3NlcnZlckNvbmZpZ30vbGliL2pwbC11dGlsLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9zZXJ2ZXIvJCR7c2VydmVyQ29uZmlnfS9saWIvamJvc3MtdHJhbnNhY3Rpb24uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L3NlcnZlci8kJHtzZXJ2ZXJDb25maWd9L2xpYi9iY2VsLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9saWIvamRvbS5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vbGliL3hlcmNlc0ltcGwuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi94bWwtYXBpcy5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vbGliL2dudS1yZWdleHAuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi9nZXRvcHQuamFyIiAvPgotCTwvY2xhc3NwYXRoPgotCi0JPGNsYXNzcGF0aCBpZD0iamJvc3MucHJvamVjdCIgPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2NsaWVudC9qYm9zcy1qMmVlLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9zZXJ2ZXIvZGVmYXVsdC9saWIvamF2YXguc2VydmxldC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vc2VydmVyL2RlZmF1bHQvbGliL2FjdGl2YXRpb24uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L3NlcnZlci9kZWZhdWx0L2xpYi9tYWlsLmphciIgLz4KLQk8L2NsYXNzcGF0aD4KLQk8am5kaUNvbm5lY3Rpb24+Ci0JCTxwcm92aWRlclVybD5qbnA6Ly8kJHtzZXJ2ZXJBZGRyZXNzfToxMDk5PC9wcm92aWRlclVybD4KLQkJPGluaXRpYWxDb250ZXh0RmFjdG9yeT5vcmcuam5wLmludGVyZmFjZXMuTmFtaW5nQ29udGV4dEZhY3Rvcnk8L2luaXRpYWxDb250ZXh0RmFjdG9yeT4KLQkJPGpuZGlQcm9wZXJ0eT4KLQkJCTxuYW1lPjwvbmFtZT4KLQkJCTx2YWx1ZT48L3ZhbHVlPgotCQk8L2puZGlQcm9wZXJ0eT4KLQk8L2puZGlDb25uZWN0aW9uPgotPC90bnM6U2VydmVyUnVudGltZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1MDU1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmVfMy4wLjAuamFyCi1zcmMuamFyCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZWYwYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSBwbHVnaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvZGVidWc9dHJ1ZQotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9wdWJsaXNoaW5nPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNjdjZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmU0MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgTm92IDEwIDE3OjExOjM1IEhTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjA4NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0jVGh1IFNlcCAxMyAxNToyNTowNiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoLCoudGVzdHN1aXRlLCouZGVwbG95LCoubG9jYXRpb24sKi5leGVjdXRpb24sKi5kYXRhcG9vbCwqLmFydGlmYWN0LCouaHRtbCwqLnN2Zwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTg0N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIEZlYiAyMyAyMToxNTozOCBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhNjBlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlY2NhYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAxLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuUHJldmlld1BsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDQsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDMsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMTAwLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFmMDhiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL2ljb25zL29iajE2L3ByZXZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9pY29ucy9vYmoxNi9wcmV2aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxYWUzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL2ljb25zL29iajE2L3ByZXZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NDA3NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUpFRSBQcmV2aWV3IFNlcnZlciBTdXBwb3J0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotcHJldmlld1J1bnRpbWVUeXBlTmFtZT1KMkVFIFByZXZpZXcKLXByZXZpZXdSdW50aW1lVHlwZURlc2NyaXB0aW9uPUEgcnVudGltZSBmb3IgYnVpbGRpbmcgSjJFRSB3ZWIgbW9kdWxlcy4KLQotcHJldmlld1NlcnZlclR5cGVOYW1lPUoyRUUgUHJldmlldwotcHJldmlld1NlcnZlclR5cGVEZXNjcmlwdGlvbj1BIHNlcnZlciB0byBwcmV2aWV3IEoyRUUgd2ViIG1vZHVsZXMuCi0KLXByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uVHlwZT1KMkVFIFByZXZpZXcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMjJjOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXMiPgotICAgIDxydW50aW1lVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcucnVudGltZSIKLSAgICAgICBuYW1lPSIlcHJldmlld1J1bnRpbWVUeXBlTmFtZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXByZXZpZXdSdW50aW1lVHlwZURlc2NyaXB0aW9uIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdSdW50aW1lIj4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9IndzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbnM9IjIuMiwyLjMsMi40LDIuNSIvPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgPC9ydW50aW1lVHlwZT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzIj4KLSAgICAgPHNlcnZlclR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LnNlcnZlciIKLSAgICAgICBuYW1lPSIlcHJldmlld1NlcnZlclR5cGVOYW1lIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcHJldmlld1NlcnZlclR5cGVEZXNjcmlwdGlvbiIKLSAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSIKLSAgICAgICBydW50aW1lPSJ0cnVlIgotICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLSAgICAgICBsYXVuY2hNb2Rlcz0icnVuLGRlYnVnLHByb2ZpbGUiCi0gICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcucnVudGltZSIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZS5QcmV2aWV3U2VydmVyIgotICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiPgotICAgIDxydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcucnVudGltZVRhcmdldCIKLSAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcucnVudGltZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIgotICAgICAgIHZlcnNpb249IjEuMCIvPgotCi0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcucnVudGltZSIvPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyJEZhY3RvcnkiLz4KLSAgICAgIDx0eXBlCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNsYXNzcGF0aFByb3ZpZGVyIi8+Ci0gICAgPC9hZGFwdGVyPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJ3c3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQsMi41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5kZWZhdWx0RmFjZXRzIj4KLSAgICA8ZGVmYXVsdC1mYWNldHM+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIi8+Ci0gICAgICA8ZmFjZXQgaWQ9IndzdC5qc2R0LndlYiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9kZWZhdWx0LWZhY2V0cz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVGYWNldE1hcHBpbmdzIj4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LnJ1bnRpbWUiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LnJ1bnRpbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2VQYXRoQ29tcHV0ZXJzIj4KLSAgICAgPHNvdXJjZVBhdGhDb21wdXRlcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LnNvdXJjZVBhdGhDb21wdXRlciIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmUuUHJldmlld1NvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGVzIj4KLSAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgIG5hbWU9IiVwcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgIGRlbGVnYXRlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUiCi0gICAgICAgIG1vZGVzPSJydW4sZGVidWcscHJvZmlsZSIKLSAgICAgICAgc291cmNlTG9jYXRvcklkPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLnNvdXJjZUxvY2F0b3IuSmF2YVNvdXJjZUxvb2t1cERpcmVjdG9yIgotICAgICAgICBzb3VyY2VQYXRoQ29tcHV0ZXJJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LnNvdXJjZVBhdGhDb21wdXRlciIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzIj4KLSAgICA8bGF1bmNoYWJsZUFkYXB0ZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXciCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZS5QcmV2aWV3TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIvPgotICA8L2V4dGVuc2lvbj4KLQotPCEtLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsU3RhcnR1cCI+Ci0gIDxzdGFydHVwCi0gICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5zdGFydHVwIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwucHJldmlldy5QcmV2aWV3U3RhcnR1cCIvPgotPC9leHRlbnNpb24+Ci0tLT4KLQotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4KLSAgICAgPGltYWdlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXciCi0gICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lLG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5zZXJ2ZXIiCi0gICAgICAgIGljb249Imljb25zL29iajE2L3ByZXZpZXcuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgIDxpbWFnZSBydW50aW1lLWNvbXBvbmVudC10eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcucnVudGltZSIKLSAgICAgICBwYXRoPSJpY29ucy9vYmoxNi9wcmV2aWV3LmdpZiIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIi8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5GYWNldFJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIi8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZXMiPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UiCi0gICAgICBjb25maWdUeXBlSUQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgIGljb249Imljb25zL29iajE2L3ByZXZpZXcuZ2lmIj4KLSAgICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2U+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cHMiPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLnVpLlByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAiPgotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwPgotICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL0lNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9JTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTZhMmQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL0lNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWw7Ci0vKioKLSAqIEludGVyZmFjZSB0byBhIG1lbWVudG8gdXNlZCBmb3Igc2F2aW5nIHRoZSBpbXBvcnRhbnQgc3RhdGUgb2YgYW4gb2JqZWN0Ci0gKiBpbiBhIGZvcm0gdGhhdCBjYW4gYmUgcGVyc2lzdGVkIGluIHRoZSBmaWxlIHN5c3RlbS4KLSAqIDxwPgotICogTWVtZW50b3Mgd2VyZSBkZXNpZ25lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGluIG1pbmQ6Ci0gKiA8b2w+Ci0gKiAgPGxpPkNlcnRhaW4gb2JqZWN0cyBuZWVkIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgcGxhdGZvcm0gc2Vzc2lvbnMuCi0gKiAgICA8L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgYW4gYXBwcm9wcmlhdGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtaWdodCBub3QKLSAqICAgIGJlIGF2YWlsYWJsZS4gSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBza2lwIGFuIG9iamVjdCBpbiB0aGlzIGNhc2UuPC9saT4KLSAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgdGhlIG9iamVjdCBtYXkgYmUKLSAqICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2hlbiB0aGUgb2JqZWN0IHdhcyBvcmlnaW5hbGx5IHNhdmVkLiBJZiBzbywgdGhlCi0gKiAgICBuZXcgY2xhc3Mgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIGZvcm0gb2YgdGhlIGRhdGEuPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1lbWVudG9zIG1lZXQgdGhlc2UgcmVxdWlyZW1lbnRzIGJ5IHByb3ZpZGluZyBzdXBwb3J0IGZvciBzdG9yaW5nIGEKLSAqIG1hcHBpbmcgb2YgYXJiaXRyYXJ5IHN0cmluZyBrZXlzIHRvIHByaW1pdGl2ZSB2YWx1ZXMsIGFuZCBieSBhbGxvd2luZwotICogbWVtZW50b3MgdG8gaGF2ZSBvdGhlciBtZW1lbnRvcyBhcyBjaGlsZHJlbiAoYXJyYW5nZWQgaW50byBhIHRyZWUpLgotICogQSByb2J1c3QgZXh0ZXJuYWwgc3RvcmFnZSBmb3JtYXQgYmFzZWQgb24gWE1MIGlzIHVzZWQuCi0gKiA8L3A+PHA+Ci0gKiBUaGUga2V5IGZvciBhbiBhdHRyaWJ1dGUgbWF5IGJlIGFueSBhbHBoYSBudW1lcmljIHZhbHVlLiAgSG93ZXZlciwgdGhlCi0gKiB2YWx1ZSBvZiA8Y29kZT5UQUdfSUQ8L2NvZGU+IGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVtZW50byB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBvZiB0aGlzIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcwotCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50bwotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBpbnRlZ2VyLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludGVnZXIoU3RyaW5nIGtleSwgaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwYThmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JKUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoQ29udGFpbmVyRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoQ29udGFpbmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lclVuYm91bmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGluZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3B5aW5nRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNyZWF0aW5nWmlwRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRlbGV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJlbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJlYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vUnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckZhY2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGVsZXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb3RBRGlyZWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTWtkaXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdFNlcnZsZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RFSkI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RKTkRJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0Q2FjdHVzVGVzdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbk1vZGlmeU1vZHVsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1Byb2ZpbGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBodHRwUG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclBvcnRJblVzZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoUHJldmlld1BsdWdpbi5QTFVHSU5fSUQgKyAiLmludGVybmFsLk1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjNmNlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1jbGFzc3BhdGhDb250YWluZXJEZXNjcmlwdGlvbj1TZXJ2ZXIgTGlicmFyeQotY2xhc3NwYXRoQ29udGFpbmVyPXswfSBbezF9XQotY2xhc3NwYXRoQ29udGFpbmVyVW5ib3VuZD17MH0gW3sxfV0gKHVuYm91bmQpCi0KLWVycm9yTG9jYXRpb249SW52YWxpZCBsb2NhdGlvbi4KLWVycm9ySlJFPUludmFsaWQgSlJFLgotCi1jb3B5aW5nVGFzaz1Db3B5aW5nIGZyb20gezB9IHRvIHsxfQotZGVsZXRpbmdUYXNrPURlbGV0aW5nIHswfQotZXJyb3JDb3B5aW5nRmlsZT1FcnJvciBjb3B5aW5nIGZpbGUgezB9OiB7MX0KLWVycm9yQ3JlYXRpbmdaaXBGaWxlPUVycm9yIGNyZWF0aW5nIHppcCBmaWxlIHswfTogezF9Ci1lcnJvckRlbGV0ZT1Db3VsZCBub3QgZGVsZXRlIHByZXZpb3VzIGNvcHksIHdoaWNoIG1heSBiZSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLgotZXJyb3JSZW5hbWU9Q291bGQgbm90IHJlcGxhY2Ugd2l0aCB0ZW1wIGZpbGUgezB9LgotZXJyb3JSZWFkaW5nPUVycm9yIHJlYWRpbmcgZmlsZSB7MH0KLWVycm9yTm9SdW50aW1lPUNhbm5vdCB2ZXJpZnkgZmFjZXRzIGJlY2F1c2UgdGhlcmUgaXMgbm8gcnVudGltZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci4KLWVycm9yRmFjZXQ9UHJvamVjdCBmYWNldCB7MH0gdmVyc2lvbiB7MX0gaXMgbm90IHN1cHBvcnRlZC4KLWVycm9yRGVsZXRpbmc9Q291bGQgbm90IGRlbGV0ZSB7MH0uIE1heSBiZSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLgotZXJyb3JOb3RBRGlyZWN0b3J5PUNvdWxkIG5vdCBkZWxldGUgezB9IHNpbmNlIGl0IGlzIG5vdCBhIGRpcmVjdG9yeS4KLWVycm9yTWtkaXI9Q291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgezB9LgotCi11cGRhdGVDbGFzc3BhdGhDb250YWluZXJzPVVwZGF0aW5nIGNsYXNzcGF0aCBjb250YWluZXIgZm9yIHswfQotCi1hcnRpZmFjdFNlcnZsZXQ9U2VydmxldCB7MH0KLWFydGlmYWN0RUpCPUVKQiB7MH0KLWFydGlmYWN0Sk5EST1KTkRJIHswfQotYXJ0aWZhY3RDYWN0dXNUZXN0PUNhY3R1cyB0ZXN0IHswfQotCi1jYW5Nb2RpZnlNb2R1bGVzPVdlYiBtb2R1bGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXJ2ZXIuCi1lcnJvck5vUHJvZmlsZXI9Q291bGQgbm90IGxhdW5jaCBpbiBwcm9maWxpbmcgbW9kZSBiZWNhdXNlIG5vIHByb2ZpbGVycyBhcmUgY29uZmlndXJlZC4KLWVycm9yUHVibGlzaD1BbiBlcnJvciBvY2N1cmVkIGR1cmluZyBwdWJsaXNoaW5nLgotaHR0cFBvcnQ9SFRUUCBQb3J0Ci1lcnJvclBvcnRJblVzZT1Qb3J0IHswfSByZXF1aXJlZCBieSB7MX0gaXMgYWxyZWFkeSBpbiB1c2UuIFRoZSBzZXJ2ZXIgbWF5IGFscmVhZHkgYmUgcnVubmluZyBpbiBhbm90aGVyIHByb2Nlc3MsIG9yIGEgc3lzdGVtIHByb2Nlc3MgbWF5IGJlIHVzaW5nIHRoZSBwb3J0LiBcCi0gIFRvIHN0YXJ0IHRoaXMgc2VydmVyIHlvdSB3aWxsIG5lZWQgdG8gc3RvcCB0aGUgb3RoZXIgcHJvY2VzcyBvciBjaGFuZ2UgdGhlIHBvcnQgbnVtYmVyKHMpLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL1ByZXZpZXdQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL1ByZXZpZXdQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyMGYyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9QcmV2aWV3UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLS8qKgotICogVGhlIG1haW4gcHJldmlldyBzZXJ2ZXIgdG9vbHMgcGx1Z2luIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgUHJldmlld1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLyoqCi0JICogSmF2YSBzZXJ2ZXIgcGx1Z2luIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyIjsKLQotCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JcHJpdmF0ZSBzdGF0aWMgUHJldmlld1BsdWdpbiBzaW5nbGV0b247Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIFByZXZpZXdQbHVnaW4uCi0JICovCi0JcHVibGljIFByZXZpZXdQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNpbmdsZXRvbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqCi0JICogQHJldHVybiBhIHNpbmdsZXRvbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJldmlld1BsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGxvZ2dpbmcuCi0JICoKLQkgKiBAcGFyYW0gc3RhdHVzIGEgc3RhdHVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbXNnKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyYWRmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLS8qKgotICogUHJvZ3Jlc3MgTW9uaXRvciB1dGlsaXR5LgotICovCi1wdWJsaWMgY2xhc3MgUHJvZ3Jlc3NVdGlsIHsKLQkvKioKLQkgKiBQcm9ncmVzc1V0aWwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFByb2dyZXNzVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2YWxpZCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldE1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLXByb2dyZXNzIG1vbml0b3Igd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9uIHRoZQotCSAqIGN1cnJlbnQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIHRpY2tzIGludAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcykgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKLQkJCXJldHVybiBtb25pdG9yOwotCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLXByb2dyZXNzIG1vbml0b3Igd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9uIHRoZQotCSAqIGN1cnJlbnQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIHRpY2tzIGEgbnVtYmVyIG9mIHRpY2tzCi0JICogQHBhcmFtIHN0eWxlIGEgc3R5bGUKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFN1Yk1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MsIGludCBzdHlsZSkgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKLQkJCXJldHVybiBtb25pdG9yOwotCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcywgc3R5bGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliNzA4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQkvKioKLQkgKiBDb25maWcgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05GSUcgPSAwOwotCS8qKgotCSAqIFdhcm5pbmcgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HID0gMTsKLQkvKioKLQkgKiBTZXZlcmUgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVZFUkUgPSAyOwotCS8qKgotCSAqIEZpbmVzdCB0cmFjaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZJTkVTVCA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUFVCTElTSElORyA9IDQ7Ci0KLQkvKioKLQkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgVHJhY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBTdHJpbmcKLQkgKiBAcGFyYW0gdCBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmIChsZXZlbCA9PSBTRVZFUkUpCi0JCQlQcmV2aWV3UGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJldmlld1BsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKLQkJCi0JCWlmICghUHJldmlld1BsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oUHJldmlld1BsdWdpbi5QTFVHSU5fSUQgKyAiICIgKyBzKTsKLQkJaWYgKHQgIT0gbnVsbCkKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL1hNTE1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL1hNTE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFhOTMyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0vKioKLSAqIEEgTWVtZW50byBpcyBhIGNsYXNzIGluZGVwZW5kZW50IGNvbnRhaW5lciBmb3IgcGVyc2lzdGVuY2UKLSAqIGluZm8uICBJdCBpcyBhIHJlZmxlY3Rpb24gb2YgMyBzdG9yYWdlIHJlcXVpcmVtZW50cy4KLSAqCi0gKiAxKSAgIFdlIG5lZWQgdGhlIGFiaWxpdHkgdG8gcGVyc2lzdCBhbiBvYmplY3QgYW5kIHJlc3RvcmUgaXQuICAKLSAqIDIpICAgVGhlIGNsYXNzIGZvciBhbiBvYmplY3QgbWF5IGJlIGFic2VudC4gIElmIHNvIHdlIHdvdWxkIAotICogICAgICBsaWtlIHRvIHNraXAgdGhlIG9iamVjdCBhbmQga2VlcCByZWFkaW5nLiAKLSAqIDMpICAgVGhlIGNsYXNzIGZvciBhbiBvYmplY3QgbWF5IGNoYW5nZS4gIElmIHNvIHRoZSBuZXcgY2xhc3MgCi0gKiAgICAgIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgdGhlIG9sZCBwZXJzaXN0ZW5jZSBpbmZvLgotICoKLSAqIFdlIGNvdWxkIGFzayB0aGUgb2JqZWN0cyB0byBzZXJpYWxpemUgdGhlbXNlbHZlcyBpbnRvIGFuIAotICogT2JqZWN0T3V0cHV0U3RyZWFtLCBEYXRhT3V0cHV0U3RyZWFtLCBvciBIYXNodGFibGUuICBIb3dldmVyIAotICogYWxsIG9mIHRoZXNlIGFwcHJvYWNoZXMgZmFpbCB0byBtZWV0IHRoZSBzZWNvbmQgcmVxdWlyZW1lbnQuCi0gKgotICogTWVtZW50byBzdXBwb3J0cyBiaW5hcnkgcGVyc2lzdGFuY2Ugd2l0aCBhIHZlcnNpb24gSUQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxNZW1lbnRvIGltcGxlbWVudHMgSU1lbWVudG8gewotCXByaXZhdGUgRG9jdW1lbnQgZmFjdG9yeTsKLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQotCS8qKgotCSAqIEFuc3dlciBhIG1lbWVudG8gZm9yIHRoZSBkb2N1bWVudCBhbmQgZWxlbWVudC4gIEZvciBzaW1wbGljaXR5Ci0JICogeW91IHNob3VsZCB1c2UgY3JlYXRlUmVhZFJvb3QgYW5kIGNyZWF0ZVdyaXRlUm9vdCB0byBjcmVhdGUgdGhlIGluaXRpYWwKLQkgKiBtZW1lbnRvcyBvbiBhIGRvY3VtZW50LgotCSAqLwotCXByaXZhdGUgWE1MTWVtZW50byhEb2N1bWVudCBkb2MsIEVsZW1lbnQgZWwpIHsKLQkJZmFjdG9yeSA9IGRvYzsKLQkJZWxlbWVudCA9IGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jY3JlYXRlQ2hpbGQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSkgewotCQlFbGVtZW50IGNoaWxkID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHR5cGUpOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGNoaWxkKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciB3cml0aW5nIGEgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHR5cGUgYSB0eXBlCi0JICogQHJldHVybiBhIG1lbWVudG8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNTE1lbWVudG8gY3JlYXRlV3JpdGVSb290KFN0cmluZyB0eXBlKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50OwotCQl0cnkgewotCQkJZG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgZWxlbWVudCk7ICAgICAgICAgICAgCi0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgbikgewotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZy52YWx1ZU9mKG4pKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGlzIE1lbWVudG8gdG8gYSBXcml0ZXIuCi0JICogCi0JICogQHBhcmFtIG9zIGFuIG91dHB1dCBzdHJlYW0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zKTsKLQkJU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZmFjdG9yeSk7Ci0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsICJVVEYtOCIpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59aW5kZW50LWFtb3VudCIsICIyIik7Ci0JCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgKElPRXhjZXB0aW9uKSAobmV3IElPRXhjZXB0aW9uKCkuaW5pdENhdXNlKGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtZW1lbnRvIHRvIHRoZSBnaXZlbiBmaWxlLgotCSAqCi0JICogQHBhcmFtIGZpbGVuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlVG9GaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZU91dHB1dFN0cmVhbSB3ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXcgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSk7Ci0JCQlzYXZlKHcpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl3LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUGluZ1RocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QaW5nVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwM2Q4MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QaW5nVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotLyoqCi0gKiBUaHJlYWQgdXNlZCB0byBwaW5nIHNlcnZlciB0byB0ZXN0IHdoZW4gaXQgaXMgc3RhcnRlZC4KLSAqLwotcHVibGljIGNsYXNzIFBpbmdUaHJlYWQgewotCS8vIGRlbGF5IGJlZm9yZSBwaW5naW5nIHN0YXJ0cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSU5HX0RFTEFZID0gMjAwMDsKLQotCS8vIGRlbGF5IGJldHdlZW4gcGluZ3MKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19JTlRFUlZBTCA9IDI1MDsKLQotCS8vIG1heGltdW0gbnVtYmVyIG9mIHBpbmdzIGJlZm9yZSBnaXZpbmcgdXAKLQlwcml2YXRlIGludCBtYXhQaW5nczsKLQotCXByaXZhdGUgYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCXByaXZhdGUgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJpdmF0ZSBQcmV2aWV3U2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBQaW5nVGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gdXJsCi0JICogQHBhcmFtIGJlaGF2aW91cgotCSAqLwotCXB1YmxpYyBQaW5nVGhyZWFkKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgdXJsLCBQcmV2aWV3U2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cikgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JCXRoaXMuYmVoYXZpb3VyID0gYmVoYXZpb3VyOwotCQl0aGlzLm1heFBpbmdzID0gZ3Vlc3NNYXhQaW5ncygpOwotCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIlByZXZpZXcgUGluZyBUaHJlYWQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcGluZygpOwotCQkJfQotCQl9OwotCQl0LnNldERhZW1vbih0cnVlKTsKLQkJdC5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgaW50IGd1ZXNzTWF4UGluZ3MoKSB7Ci0JCWludCBzdGFydFRpbWVvdXQgPSAoKFNlcnZlcilzZXJ2ZXIpLmdldFN0YXJ0VGltZW91dCgpICogMTAwMDsKLQkJaWYgKHN0YXJ0VGltZW91dCA+IDApCi0JCQlyZXR1cm4gc3RhcnRUaW1lb3V0IC8gUElOR19JTlRFUlZBTDsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFBpbmcgdGhlIHNlcnZlciB1bnRpbCBpdCBpcyBzdGFydGVkLiBUaGVuIHNldCB0aGUgc2VydmVyIHN0YXRlIHRvCi0JICogU1RBVEVfU1RBUlRFRC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwaW5nKCkgewotCQlpbnQgY291bnQgPSAwOwotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKFBJTkdfREVMQVkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJd2hpbGUgKCFzdG9wKSB7Ci0JCQl0cnkgewotCQkJCWlmIChjb3VudCA9PSBtYXhQaW5ncykgewotCQkJCQl0cnkgewotCQkJCQkJc2VydmVyLnN0b3AoZmFsc2UpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogY291bGQgbm90IHN0b3Agc2VydmVyIik7Ci0JCQkJCX0KLQkJCQkJc3RvcCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljb3VudCsrOwotCQkJCQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHBpbmdpbmcgIiArIGNvdW50KTsKLQkJCQlVUkwgcGluZ1VybCA9IG5ldyBVUkwodXJsKTsKLQkJCQlVUkxDb25uZWN0aW9uIGNvbm4gPSBwaW5nVXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJKChIdHRwVVJMQ29ubmVjdGlvbiljb25uKS5nZXRSZXNwb25zZUNvZGUoKTsKLQkKLQkJCQkvLyBwaW5nIHdvcmtlZCAtIHNlcnZlciBpcyB1cAotCQkJCWlmICghc3RvcCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBzdWNjZXNzIik7Ci0JCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJCQliZWhhdmlvdXIuc2V0U2VydmVyU3RhcnRlZCgpOwotCQkJCX0KLQkJCQlzdG9wID0gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmZSkgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQliZWhhdmlvdXIuc2V0U2VydmVyU3RhcnRlZCgpOwotCQkJCXN0b3AgPSB0cnVlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBmYWlsZWQiKTsKLQkJCQkvLyBwaW5naW5nIGZhaWxlZAotCQkJCWlmICghc3RvcCkgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKFBJTkdfSU5URVJWQUwpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMikgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZWxsIHRoZSBwaW5naW5nIHRvIHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogc3RvcHBpbmciKTsKLQkJc3RvcCA9IHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld0xhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOWMzOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlNlcnZlclByb2ZpbGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuUHJldmlld1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5UcmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJldmlld0xhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVRVUlSRURfQlVORExFX0lEUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyIsCi0JCSJvcmcuYXBhY2hlLmNvbW1vbnMuZWwiLAotCQkiamF2YXguc2VydmxldCIsCi0JCSJqYXZheC5zZXJ2bGV0LmpzcCIsCi0JCSJvcmcuYXBhY2hlLmphc3BlciIsCi0JCSJvcmcubW9ydGJheS5qZXR0eSIsCi0JCSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXciCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0NMQVNTID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5pbnRlcm5hbC5QcmV2aWV3U3RhcnRlciI7Ci0KLQlwdWJsaWMgdm9pZCBsYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUsIElMYXVuY2ggbGF1bmNoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcihjb25maWd1cmF0aW9uKTsKLQkJaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMYXVuY2ggY29uZmlndXJhdGlvbiBjb3VsZCBub3QgZmluZCBzZXJ2ZXIiKTsKLQkJCS8vIHRocm93IENvcmVFeGNlcHRpb24oKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKHNlcnZlci5zaG91bGRQdWJsaXNoKCkgJiYgU2VydmVyQ29yZS5pc0F1dG9QdWJsaXNoaW5nKCkpCi0JCQlzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG1vbml0b3IpOwotCQkKLQkJUHJldmlld1NlcnZlckJlaGF2aW91ciBwcmV2aWV3U2VydmVyID0gKFByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIpIHNlcnZlci5sb2FkQWRhcHRlcihQcmV2aWV3U2VydmVyQmVoYXZpb3VyLmNsYXNzLCBudWxsKTsKLQkJCi0JCWludCBzaXplID0gUkVRVUlSRURfQlVORExFX0lEUy5sZW5ndGg7Ci0JCVN0cmluZ1tdIGphcnMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQnVuZGxlIGIgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUkVRVUlSRURfQlVORExFX0lEU1tpXSk7Ci0JCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJCWlmIChiICE9IG51bGwpCi0JCQkJcGF0aCA9IFByZXZpZXdSdW50aW1lLmdldEphcnJlZFBsdWdpblBhdGgoYik7Ci0JCQlpZiAocGF0aCA9PSBudWxsKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJldmlld1BsdWdpbi5QTFVHSU5fSUQsICJDb3VsZCBub3QgZmluZCByZXF1aXJlZCBidW5kbGUgIiArIFJFUVVJUkVEX0JVTkRMRV9JRFNbaV0pKTsKLQkJCWphcnNbaV0gPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJfQotCQkKLQkJaWYgKG5ldyBGaWxlKGphcnNbNl0gKyAiYmluIikuZXhpc3RzKCkpCi0JCQlqYXJzWzZdID0gamFyc1s2XSArICJiaW4iOwotCQkKLQkJSVZNSW5zdGFsbCB2bSA9IHZlcmlmeVZNSW5zdGFsbChjb25maWd1cmF0aW9uKTsKLQkJCi0JCUlWTVJ1bm5lciBydW5uZXIgPSB2bS5nZXRWTVJ1bm5lcihtb2RlKTsKLQkJaWYgKHJ1bm5lciA9PSBudWxsKQotCQkJcnVubmVyID0gdm0uZ2V0Vk1SdW5uZXIoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotCQkKLQkJRmlsZSB3b3JraW5nRGlyID0gdmVyaWZ5V29ya2luZ0RpcmVjdG9yeShjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIHdvcmtpbmdEaXJOYW1lID0gbnVsbDsKLQkJaWYgKHdvcmtpbmdEaXIgIT0gbnVsbCkKLQkJCXdvcmtpbmdEaXJOYW1lID0gd29ya2luZ0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCi0JCS8vIFByb2dyYW0gJiBWTSBhcmdzCi0JCVN0cmluZyBwZ21BcmdzID0gIlwiIiArIHByZXZpZXdTZXJ2ZXIuZ2V0VGVtcERpcmVjdG9yeSgpLmFwcGVuZCgicHJldmlldy54bWwiKS50b09TU3RyaW5nKCkgKyAiXCIiOyAKLQkJCS8vZ2V0UHJvZ3JhbUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIHZtQXJncyA9IGdldFZNQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmdbXSBlbnZwID0gZ2V0RW52aXJvbm1lbnQoY29uZmlndXJhdGlvbik7Ci0JCQotCQlFeGVjdXRpb25Bcmd1bWVudHMgZXhlY0FyZ3MgPSBuZXcgRXhlY3V0aW9uQXJndW1lbnRzKHZtQXJncywgcGdtQXJncyk7Ci0JCQotCQkvLyBWTS1zcGVjaWZpYyBhdHRyaWJ1dGVzCi0JCU1hcCB2bUF0dHJpYnV0ZXNNYXAgPSBnZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcChjb25maWd1cmF0aW9uKTsKLQkJCi0JCS8vIENsYXNzcGF0aAotCQlTdHJpbmdbXSBjbGFzc3BhdGgyID0gZ2V0Q2xhc3NwYXRoKGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmdbXSBjbGFzc3BhdGggPSBuZXcgU3RyaW5nW2NsYXNzcGF0aDIubGVuZ3RoICsgUkVRVUlSRURfQlVORExFX0lEUy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGphcnMsIDAsIGNsYXNzcGF0aCwgMCwgUkVRVUlSRURfQlVORExFX0lEUy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzcGF0aDIsIDAsIGNsYXNzcGF0aCwgUkVRVUlSRURfQlVORExFX0lEUy5sZW5ndGgsIGNsYXNzcGF0aDIubGVuZ3RoKTsKLQkJCi0JCS8vIENyZWF0ZSBWTSBjb25maWcKLQkJVk1SdW5uZXJDb25maWd1cmF0aW9uIHJ1bkNvbmZpZyA9IG5ldyBWTVJ1bm5lckNvbmZpZ3VyYXRpb24oTUFJTl9DTEFTUywgY2xhc3NwYXRoKTsKLQkJcnVuQ29uZmlnLnNldFByb2dyYW1Bcmd1bWVudHMoZXhlY0FyZ3MuZ2V0UHJvZ3JhbUFyZ3VtZW50c0FycmF5KCkpOwotCQlydW5Db25maWcuc2V0Vk1Bcmd1bWVudHMoZXhlY0FyZ3MuZ2V0Vk1Bcmd1bWVudHNBcnJheSgpKTsKLQkJcnVuQ29uZmlnLnNldFdvcmtpbmdEaXJlY3Rvcnkod29ya2luZ0Rpck5hbWUpOwotCQlydW5Db25maWcuc2V0RW52aXJvbm1lbnQoZW52cCk7Ci0JCXJ1bkNvbmZpZy5zZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcCh2bUF0dHJpYnV0ZXNNYXApOwotCQkKLQkJLy8gQm9vdHBhdGgKLQkJU3RyaW5nW10gYm9vdHBhdGggPSBnZXRCb290cGF0aChjb25maWd1cmF0aW9uKTsKLQkJaWYgKGJvb3RwYXRoICE9IG51bGwgJiYgYm9vdHBhdGgubGVuZ3RoID4gMCkKLQkJCXJ1bkNvbmZpZy5zZXRCb290Q2xhc3NQYXRoKGJvb3RwYXRoKTsKLQkJCi0JCXNldERlZmF1bHRTb3VyY2VMb2NhdG9yKGxhdW5jaCwgY29uZmlndXJhdGlvbik7Ci0JCQotCQkvLyBMYXVuY2ggdGhlIGNvbmZpZ3VyYXRpb24KLQkJcHJldmlld1NlcnZlci5zZXR1cExhdW5jaChsYXVuY2gsIG1vZGUsIG1vbml0b3IpOwotCQkKLQkJaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQlTZXJ2ZXJQcm9maWxlckRlbGVnYXRlLmNvbmZpZ3VyZVByb2ZpbGluZyhsYXVuY2gsIHZtLCBydW5Db25maWcsIG1vbml0b3IpOwotCQkKLQkJdHJ5IHsKLQkJCXJ1bm5lci5ydW4ocnVuQ29uZmlnLCBsYXVuY2gsIG1vbml0b3IpOwotCQkJcHJldmlld1NlcnZlci5hZGRQcm9jZXNzTGlzdGVuZXIobGF1bmNoLmdldFByb2Nlc3NlcygpWzBdKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSAtIHByb2Nlc3MgZmFpbGVkCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDc0ZDhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuSHR0cExhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuV2ViUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBQcmV2aWV3TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSBleHRlbmRzIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgewotCS8qCi0JICogQHNlZSBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlI2dldExhdW5jaGFibGUoSVNlcnZlciwgSU1vZHVsZUFydGlmYWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF1bmNoYWJsZShJU2VydmVyIHNlcnZlciwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCB8fCBtb2R1bGVBcnRpZmFjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlQcmV2aWV3U2VydmVyIHNlcnZlcjIgPSAoUHJldmlld1NlcnZlcikgc2VydmVyLmxvYWRBZGFwdGVyKFByZXZpZXdTZXJ2ZXIuY2xhc3MsIG51bGwpOwotCQlpZiAoc2VydmVyMiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQl0cnkgewotCQkJVVJMIHVybCA9IHNlcnZlcjIuZ2V0TW9kdWxlUm9vdFVSTChtb2R1bGVBcnRpZmFjdC5nZXRNb2R1bGUoKSk7Ci0JCQkKLQkJCWlmIChtb2R1bGVBcnRpZmFjdCBpbnN0YW5jZW9mIFdlYlJlc291cmNlKSB7Ci0JCQkJV2ViUmVzb3VyY2UgcmVzb3VyY2UgPSAoV2ViUmVzb3VyY2UpIG1vZHVsZUFydGlmYWN0OwotCQkJCVN0cmluZyBwYXRoID0gcmVzb3VyY2UuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJCi0JCQkJaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKQotCQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0JCQkJdXJsID0gbmV3IFVSTCh1cmwudG9FeHRlcm5hbEZvcm0oKSArICIvIiArIHBhdGgpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBIdHRwTGF1bmNoYWJsZSh1cmwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgaW4gbGF1bmNoYWJsZSBhZGFwdGVyIiwgZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjM2JmYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklKYXZhUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLlByZXZpZXdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotLyoqCi0gKiBKMkVFIHByZXZpZXcgcnVudGltZS4KLSAqLwotcHVibGljIGNsYXNzIFByZXZpZXdSdW50aW1lIGV4dGVuZHMgUnVudGltZURlbGVnYXRlIGltcGxlbWVudHMgSUphdmFSdW50aW1lV29ya2luZ0NvcHkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVk1fSU5TVEFMTF9UWVBFX0lEID0gInZtLWluc3RhbGwtdHlwZS1pZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX0lEID0gInZtLWluc3RhbGwtaWQiOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHByZXZpZXcgcnVudGltZS4KLQkgKi8KLQlwdWJsaWMgUHJldmlld1J1bnRpbWUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHNwZWNpZmllZCBidW5kbGUuCi0JICogCi0JICogQHJldHVybiBhIHBhdGgKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFBhdGggZ2V0UGx1Z2luUGF0aChCdW5kbGUgYnVuZGxlKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIGxvY2FsVVJMID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKGluc3RhbGxVUkwpOwotCQkJcmV0dXJuIG5ldyBQYXRoKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElQYXRoIGdldEphcnJlZFBsdWdpblBhdGgoQnVuZGxlIGJ1bmRsZSkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gRmlsZUxvY2F0b3IuZ2V0QnVuZGxlRmlsZShidW5kbGUpOwotCQkJcmV0dXJuIG5ldyBQYXRoKGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCByZXR1cm4gbnVsbAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZNSW5zdGFsbFR5cGVJZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgKFN0cmluZyludWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZNSW5zdGFsbElkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgKFN0cmluZyludWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBydW50aW1lIGlzIHVzaW5nIHRoZSBkZWZhdWx0IEpSRS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBydW50aW1lIGlzIHVzaW5nIHRoZSBkZWZhdWx0IEpSRSwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNpbmdEZWZhdWx0SlJFKCkgewotCQlyZXR1cm4gZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgPT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVZNSW5zdGFsbCBnZXRWTUluc3RhbGwoKSB7Ci0JCWlmIChnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsKQotCQkJcmV0dXJuIEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLQkJdHJ5IHsKLQkJCUlWTUluc3RhbGxUeXBlIHZtSW5zdGFsbFR5cGUgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlKGdldFZNSW5zdGFsbFR5cGVJZCgpKTsKLQkJCUlWTUluc3RhbGxbXSB2bUluc3RhbGxzID0gdm1JbnN0YWxsVHlwZS5nZXRWTUluc3RhbGxzKCk7Ci0JCQlTdHJpbmcgaWQgPSBnZXRWTUluc3RhbGxJZCgpOwotCQkJZm9yIChJVk1JbnN0YWxsIHZtSW5zdGFsbCA6IHZtSW5zdGFsbHMpIHsKLQkJCQlpZiAoaWQuZXF1YWxzKHZtSW5zdGFsbC5nZXRJZCgpKSkKLQkJCQkJcmV0dXJuIHZtSW5zdGFsbDsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUnVudGltZURlbGVnYXRlI3ZhbGlkYXRlKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZSgpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkgJiYgc3RhdHVzLmdldE1lc3NhZ2UoKS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gc3RhdHVzOwotCQkKLQkJaWYgKGdldFZNSW5zdGFsbCgpID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JKUkUsIG51bGwpOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Vk1JbnN0YWxsKElWTUluc3RhbGwgdm1JbnN0YWxsKSB7Ci0JCWlmICh2bUluc3RhbGwgPT0gbnVsbCkgewotCQkJc2V0Vk1JbnN0YWxsKG51bGwsIG51bGwpOwotCQl9IGVsc2UKLQkJCXNldFZNSW5zdGFsbCh2bUluc3RhbGwuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCksIHZtSW5zdGFsbC5nZXRJZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWTUluc3RhbGwoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGlkKSB7Ci0JCWlmICh0eXBlSWQgPT0gbnVsbCkKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgKFN0cmluZyludWxsKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9UWVBFX0lELCB0eXBlSWQpOwotCQkKLQkJaWYgKGlkID09IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKW51bGwpOwotCQllbHNlCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCBpZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZWEyMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJldmlld1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlciBleHRlbmRzIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBSRVFVSVJFRF9CVU5ETEVfSURTID0gbmV3IFN0cmluZ1tdIHsKLQkJImphdmF4LnNlcnZsZXQiLAotCQkiamF2YXguc2VydmxldC5qc3AiCi0JfTsKLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSNyZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElQcm9qZWN0LCBJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lKSB7Ci0JCUxpc3Q8SUNsYXNzcGF0aEVudHJ5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7Ci0JCQotCQlpbnQgc2l6ZSA9IFJFUVVJUkVEX0JVTkRMRV9JRFMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQnVuZGxlIGIgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUkVRVUlSRURfQlVORExFX0lEU1tpXSk7Ci0JCQlJUGF0aCBwYXRoID0gUHJldmlld1J1bnRpbWUuZ2V0SmFycmVkUGx1Z2luUGF0aChiKTsKLQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJbGlzdC5hZGQoSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIG51bGwsIG51bGwpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2xpc3Quc2l6ZSgpXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1NlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MTY5Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5QcmV2aWV3UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JVVJMUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLklTdGF0aWNXZWI7Ci0vKioKLSAqIEoyRUUgcHJldmlldyBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3U2VydmVyIGV4dGVuZHMgU2VydmVyRGVsZWdhdGUgaW1wbGVtZW50cyBJVVJMUHJvdmlkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5zZXJ2ZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUE9SVCA9ICJwb3J0IjsKLQotCS8qKgotCSAqIFByZXZpZXdTZXJ2ZXIuCi0JICovCi0JcHVibGljIFByZXZpZXdTZXJ2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBQcmV2aWV3UnVudGltZSBnZXRQcmV2aWV3UnVudGltZSgpIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gKFByZXZpZXdSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoUHJldmlld1J1bnRpbWUuY2xhc3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm9vdCBVUkwgb2YgdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gamF2YS5uZXQuVVJMCi0JICovCi0JcHVibGljIFVSTCBnZXRNb2R1bGVSb290VVJMKElNb2R1bGUgbW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgYmFzZSA9ICJodHRwOi8vbG9jYWxob3N0IjsKLQkJCQotCQkJaW50IHBvcnQgPSBnZXRQb3J0KCk7Ci0JCQlVUkwgdXJsID0gbnVsbDsKLQkJCWlmIChwb3J0ID09IDgwKQotCQkJCXVybCA9IG5ldyBVUkwoYmFzZSArICIvIik7Ci0JCQllbHNlCi0JCQkJdXJsID0gbmV3IFVSTChiYXNlICsgIjoiICsgcG9ydCArICIvIik7Ci0JCQkKLQkJCVN0cmluZyB0eXBlID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpOwotCQkJaWYgKCJ3c3Qud2ViIi5lcXVhbHModHlwZSkpIHsKLQkJCQlJU3RhdGljV2ViIHN0YXRpY1dlYiA9IChJU3RhdGljV2ViKSBtb2R1bGUubG9hZEFkYXB0ZXIoSVN0YXRpY1dlYi5jbGFzcywgbnVsbCk7Ci0JCQkJcmV0dXJuIG5ldyBVUkwodXJsLCBzdGF0aWNXZWIuZ2V0Q29udGV4dFJvb3QoKSk7Ci0JCQl9IGVsc2UgaWYgKCJqc3Qud2ViIi5lcXVhbHModHlwZSkpIHsKLQkJCQlJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChJV2ViTW9kdWxlKSBtb2R1bGUubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQkJcmV0dXJuIG5ldyBVUkwodXJsLCB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdXJsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCByb290IFVSTCIsIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGNoaWxkIG1vZHVsZShzKSBvZiB0aGlzIG1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXJldHVybiBuZXcgSU1vZHVsZVswXTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIHJvb3QgbW9kdWxlKHMpIG9mIHRoaXMgbW9kdWxlLgotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Um9vdE1vZHVsZXMoSU1vZHVsZSBtb2R1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHByb2plY3QgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgc2VydmVyLCBhbmQgZmFsc2UKLQkgKiBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIGFkZCBtb2R1bGVzCi0JICogQHBhcmFtIHJlbW92ZSBtb2R1bGVzCi0JICogQHJldHVybiB0aGUgc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuTW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10gYWRkLCBJTW9kdWxlW10gcmVtb3ZlKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFByZXZpZXdQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5jYW5Nb2RpZnlNb2R1bGVzLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU2VydmVyUG9ydFtdIGdldFNlcnZlclBvcnRzKCkgewotCQlpbnQgcG9ydCA9IGdldFBvcnQoKTsKLQkJU2VydmVyUG9ydFtdIHBvcnRzID0geyBuZXcgU2VydmVyUG9ydCgiaHR0cCIsIE1lc3NhZ2VzLmh0dHBQb3J0LCBwb3J0LCAiaHR0cCIpIH07Ci0JCXJldHVybiBwb3J0czsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUHJldmlld1NlcnZlci5QUk9QRVJUWV9QT1JULCA4MDgwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7Ci0JCXNldEF0dHJpYnV0ZShQcmV2aWV3U2VydmVyLlBST1BFUlRZX1BPUlQsIHBvcnQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBjcmVhdGVQcmV2aWV3U2VydmVyKFN0cmluZyBzZXJ2ZXJOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlOdWxsUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUoUHJldmlld1J1bnRpbWUuSUQpOwotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lQ29weSA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUoUHJldmlld1J1bnRpbWUuSUQsIG1vbml0b3IpOwotCQkJSVJ1bnRpbWUgcnVudGltZSA9IHJ1bnRpbWVDb3B5LnNhdmUodHJ1ZSwgbW9uaXRvcik7Ci0JCQkKLQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKElEKTsKLQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IHNlcnZlclR5cGUuY3JlYXRlU2VydmVyKElELCBudWxsLCBydW50aW1lLCBtb25pdG9yKTsKLQkJCXdvcmtpbmdDb3B5LnNldE5hbWUoc2VydmVyTmFtZSk7Ci0JCQl3b3JraW5nQ29weS5zZXRIb3N0KCJsb2NhbGhvc3QiKTsKLQkJCXJldHVybiB3b3JraW5nQ29weS5zYXZlKHRydWUsIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgc2VydmVyIiwgZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBmaW5kUHJldmlld1NlcnZlcihTdHJpbmcgaWQpIHsKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJZm9yIChJU2VydmVyIHNlcnZlciA6IHNlcnZlcnMpIHsKLQkJCWlmIChzZXJ2ZXIuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0JCQkJcmV0dXJuIHNlcnZlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUHJldmlld1NlcnZlciI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1NlcnZlckJlaGF2aW91ci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyQmVoYXZpb3VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZjIwY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyQmVoYXZpb3VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSURlYnVnRXZlbnRTZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5QcmV2aWV3UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLlByb2dyZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5YTUxNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLklTdGF0aWNXZWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHJvamVjdE1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotLyoqCi0gKiBHZW5lcmljIEh0dHAgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgUHJldmlld1NlcnZlckJlaGF2aW91ciBleHRlbmRzIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIHsKLQkvLyB0aGUgdGhyZWFkIHVzZWQgdG8gcGluZyB0aGUgc2VydmVyIHRvIGNoZWNrIGZvciBzdGFydHVwCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBQaW5nVGhyZWFkIHBpbmcgPSBudWxsOwotCXByb3RlY3RlZCB0cmFuc2llbnQgSURlYnVnRXZlbnRTZXRMaXN0ZW5lciBwcm9jZXNzTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBQcmV2aWV3U2VydmVyLgotCSAqLwotCXB1YmxpYyBQcmV2aWV3U2VydmVyQmVoYXZpb3VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgUHJldmlld1J1bnRpbWUgZ2V0UHJldmlld1J1bnRpbWUoKSB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoUHJldmlld1J1bnRpbWUpIGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5sb2FkQWRhcHRlcihQcmV2aWV3UnVudGltZS5jbGFzcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIFByZXZpZXdTZXJ2ZXIgZ2V0UHJldmlld1NlcnZlcigpIHsKLQkJcmV0dXJuIChQcmV2aWV3U2VydmVyKSBnZXRTZXJ2ZXIoKS5nZXRBZGFwdGVyKFByZXZpZXdTZXJ2ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgYmFzZSBwYXRoIGZvciByZWxhdGl2ZSBwYXRocyBpbiB0aGUgc2VydmVyCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIHBhdGgKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXR1cCBmb3Igc3RhcnRpbmcgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoIElMYXVuY2gKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBTdHJpbmcKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cExhdW5jaChJTGF1bmNoIGxhdW5jaCwgU3RyaW5nIGxhdW5jaE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBjaGVjayB0aGF0IHBvcnRzIGFyZSBmcmVlCi0JCVNlcnZlclBvcnRbXSBwb3J0cyA9IGdldFByZXZpZXdTZXJ2ZXIoKS5nZXRTZXJ2ZXJQb3J0cygpOwotCQlpbnQgcG9ydCA9IHBvcnRzWzBdLmdldFBvcnQoKTsKLQkJCi0JCWlmIChTb2NrZXRVdGlsLmlzUG9ydEluVXNlKHBvcnQsIDUpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQb3J0SW5Vc2UsIG5ldyBTdHJpbmdbXSB7cG9ydCArICIiLCBnZXRTZXJ2ZXIoKS5nZXROYW1lKCl9KSwgbnVsbCkpOwotCQkKLQkJLy8gZ2VuZXJhdGUgcHJldmlldyBjb25maWcgZmlsZQotCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgic2VydmVyIik7Ci0JCW1lbWVudG8ucHV0SW50ZWdlcigicG9ydCIsIHBvcnQpOwotCQkKLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBnZXRTZXJ2ZXIoKS5nZXRNb2R1bGVzKCk7Ci0JCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBtb2R1bGVzKSB7Ci0JCQlJTWVtZW50byBtb2QgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJtb2R1bGUiKTsKLQkJCW1vZC5wdXRTdHJpbmcoIm5hbWUiLCBtb2R1bGUuZ2V0TmFtZSgpKTsKLQkJCVN0cmluZyB0eXBlID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpOwotCQkJaWYgKCJ3c3Qud2ViIi5lcXVhbHModHlwZSkpIHsKLQkJCQlJU3RhdGljV2ViIHN0YXRpY1dlYiA9IChJU3RhdGljV2ViKSBtb2R1bGUubG9hZEFkYXB0ZXIoSVN0YXRpY1dlYi5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKHN0YXRpY1dlYiAhPSBudWxsKQotCQkJCQltb2QucHV0U3RyaW5nKCJjb250ZXh0Iiwgc3RhdGljV2ViLmdldENvbnRleHRSb290KCkpOwotCQkJCW1vZC5wdXRTdHJpbmcoInR5cGUiLCAic3RhdGljIik7Ci0JCQl9IGVsc2UgaWYgKCJqc3Qud2ViIi5lcXVhbHModHlwZSkpIHsKLQkJCQlJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChJV2ViTW9kdWxlKSBtb2R1bGUubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKHdlYk1vZHVsZSAhPSBudWxsKQotCQkJCQltb2QucHV0U3RyaW5nKCJjb250ZXh0Iiwgd2ViTW9kdWxlLmdldENvbnRleHRSb290KCkpOwotCQkJCW1vZC5wdXRTdHJpbmcoInR5cGUiLCAiajJlZSIpOwotCQkJfQotCQkJbW9kLnB1dFN0cmluZygicGF0aCIsIGdldE1vZHVsZVB1Ymxpc2hEaXJlY3RvcnkobW9kdWxlKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQl9Ci0JCXRyeSB7Ci0JCQltZW1lbnRvLnNhdmVUb0ZpbGUoZ2V0VGVtcERpcmVjdG9yeSgpLmFwcGVuZCgicHJldmlldy54bWwiKS50b09TU3RyaW5nKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgd3JpdGUgcHJldmlldyBjb25maWciLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJldmlld1BsdWdpbi5QTFVHSU5fSUQsIDAsICJDb3VsZCBub3Qgd3JpdGUgcHJldmlldyBjb25maWd1cmF0aW9uIiwgbnVsbCkpOwotCQl9Ci0JCQotCQlzZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoZmFsc2UpOwotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUQVJUSU5HKTsKLQkJc2V0TW9kZShsYXVuY2hNb2RlKTsKLQkJCi0JCS8vIHBpbmcgc2VydmVyIHRvIGNoZWNrIGZvciBzdGFydHVwCi0JCXRyeSB7Ci0JCQlTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3QiOwotCQkJaWYgKHBvcnQgIT0gODApCi0JCQkJdXJsICs9ICI6IiArIHBvcnQ7Ci0JCQlwaW5nID0gbmV3IFBpbmdUaHJlYWQoZ2V0U2VydmVyKCksIHVybCwgdGhpcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDYW4ndCBwaW5nIGZvciBUb21jYXQgc3RhcnR1cC4iKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2Nlc3NMaXN0ZW5lcihmaW5hbCBJUHJvY2VzcyBuZXdQcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzTGlzdGVuZXIgIT0gbnVsbCB8fCBuZXdQcm9jZXNzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlwcm9jZXNzTGlzdGVuZXIgPSBuZXcgSURlYnVnRXZlbnRTZXRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnRzKERlYnVnRXZlbnRbXSBldmVudHMpIHsKLQkJCQlpZiAoZXZlbnRzICE9IG51bGwpIHsKLQkJCQkJZm9yIChEZWJ1Z0V2ZW50IGV2ZW50IDogZXZlbnRzKSB7Ci0JCQkJCQlpZiAobmV3UHJvY2VzcyAhPSBudWxsICYmIG5ld1Byb2Nlc3MuZXF1YWxzKGV2ZW50LmdldFNvdXJjZSgpKSAmJiBldmVudC5nZXRLaW5kKCkgPT0gRGVidWdFdmVudC5URVJNSU5BVEUpIHsKLQkJCQkJCQlzdG9wKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYWRkRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VydmVyU3RhcnRlZCgpIHsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVEVEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoU2VydmVyKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLmRvbmUoKTsKLQotCQlzZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotCX0KLQotCS8qCi0JICogUHVibGlzaGVzIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIHNlcnZlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoTW9kdWxlKGludCBraW5kLCBpbnQgZGVsdGFLaW5kLCBJTW9kdWxlW10gbW9kdWxlVHJlZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlNb2R1bGUgbW9kdWxlID0gbW9kdWxlVHJlZVttb2R1bGVUcmVlLmxlbmd0aCAtIDFdOwotCQlpZiAoaXNTaW5nbGVSb290U3RydWN0dXJlKG1vZHVsZSkpCi0JCQlyZXR1cm47Ci0JCQotCQlJUGF0aCB0byA9IGdldE1vZHVsZVB1Ymxpc2hEaXJlY3RvcnkobW9kdWxlKTsKLQkJCi0JCWlmIChraW5kID09IElTZXJ2ZXIuUFVCTElTSF9DTEVBTiB8fCBkZWx0YUtpbmQgPT0gU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuUkVNT1ZFRCkgewotCQkJSVN0YXR1c1tdIHN0YXR1cyA9IFB1Ymxpc2hVdGlsLmRlbGV0ZURpcmVjdG9yeSh0by50b0ZpbGUoKSwgbW9uaXRvcik7Ci0JCQl0aHJvd0V4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0JCQotCQlJTW9kdWxlUmVzb3VyY2VbXSByZXMgPSBnZXRSZXNvdXJjZXMobW9kdWxlVHJlZSk7Ci0JCUlTdGF0dXNbXSBzdGF0dXMgPSBQdWJsaXNoVXRpbC5wdWJsaXNoU21hcnQocmVzLCB0bywgbW9uaXRvcik7Ci0JCXRocm93RXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQotCQlzZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlVHJlZSwgSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHRocm93IGEgQ29yZUV4Y2VwdGlvbiBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgYSBsaXN0IG9mCi0JICogZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMgYSBMaXN0IGNvbnRhaW5pbmcgZXJyb3IgYW5kIHdhcm5pbmcgSVN0YXR1cwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oSVN0YXR1c1tdIHN0YXR1cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHN0YXR1cy5sZW5ndGggPT0gMSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1c1swXSk7Ci0JCQotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVycm9yUHVibGlzaDsKLQkJTXVsdGlTdGF0dXMgc3RhdHVzMiA9IG5ldyBNdWx0aVN0YXR1cyhQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgMCwgc3RhdHVzLCBtZXNzYWdlLCBudWxsKTsKLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdGFydChTdHJpbmcgbGF1bmNoTW9kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQRUQpOwotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUQVJURUQpOwotCX0KLQotCS8qKgotCSAqIENsZWFubHkgc2h1dHMgZG93biBhbmQgdGVybWluYXRlcyB0aGUgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBraWxsIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKGJvb2xlYW4gZm9yY2UpIHsKLQkJaW50IHN0YXRlID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKTsKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybjsKLQkJCi0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpOwotCQkKLQkJaWYgKHBpbmcgIT0gbnVsbCkgewotCQkJcGluZy5zdG9wKCk7Ci0JCQlwaW5nID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHByb2Nlc3NMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0JCQlwcm9jZXNzTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JCQotCQl0cnkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiS2lsbGluZyB0aGUgcHJvY2VzcyIpOwotCQkJSUxhdW5jaCBsYXVuY2ggPSBnZXRTZXJ2ZXIoKS5nZXRMYXVuY2goKTsKLQkJCWlmIChsYXVuY2ggIT0gbnVsbCkKLQkJCQlsYXVuY2gudGVybWluYXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBraWxsaW5nIHRoZSBwcm9jZXNzIiwgZSk7Ci0JCX0KLQkJCi0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQYXRoIGdldFRlbXBEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRUZW1wRGlyZWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbW9kdWxlIGluIHRoZSB3b3Jrc3BhY2UgaGFzIGEgc2luZ2xlCi0JICogcm9vdCBzdHJ1Y3R1cmUgLSBpLmUuIG1hdGNoZXMgdGhlIHNwZWMgZGlzayBsYXlvdXQgLSBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSBpbiB0aGUgd29ya3NwYWNlIGhhcyBhIHNpbmdsZQotCSAqICAgIHJvb3Qgc3RydWN0dXJlIC0gaS5lLiBtYXRjaGVzIHRoZSBzcGVjIGRpc2sgbGF5b3V0IC0gYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU2luZ2xlUm9vdFN0cnVjdHVyZShJTW9kdWxlIG1vZHVsZSkgewotCQlQcm9qZWN0TW9kdWxlIHBtID0gKFByb2plY3RNb2R1bGUpIG1vZHVsZS5sb2FkQWRhcHRlcihQcm9qZWN0TW9kdWxlLmNsYXNzLCBudWxsKTsKLQkJaWYgKHBtID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlyZXR1cm4gcG0uaXNTaW5nbGVSb290U3RydWN0dXJlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlJ3MgcHVibGlzaCBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIHRoZSBwdWJsaXNoIGRpcmVjdG9yeSBmb3IgdGhlIG1vZHVsZQotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBnZXRNb2R1bGVQdWJsaXNoRGlyZWN0b3J5KElNb2R1bGUgbW9kdWxlKSB7Ci0JCWlmIChpc1NpbmdsZVJvb3RTdHJ1Y3R1cmUobW9kdWxlKSkgewotCQkJU3RyaW5nIHR5cGUgPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCk7Ci0JCQlpZiAoIndzdC53ZWIiLmVxdWFscyh0eXBlKSkgewotCQkJCUlTdGF0aWNXZWIgd2ViTW9kdWxlID0gKElTdGF0aWNXZWIpIG1vZHVsZS5sb2FkQWRhcHRlcihJU3RhdGljV2ViLmNsYXNzLCBudWxsKTsKLQkJCQlpZiAod2ViTW9kdWxlICE9IG51bGwpIHsKLQkJCQkJLy9JQ29udGFpbmVyW10gbW9kdWxlRm9sZGVyID0gd2ViTW9kdWxlLmdldFJlc291cmNlRm9sZGVycygpOwotCQkJCQkvL2lmIChtb2R1bGVGb2xkZXIgIT0gbnVsbCAmJiBtb2R1bGVGb2xkZXIubGVuZ3RoID4gMCkKLQkJCQkJLy8JcmV0dXJuIG1vZHVsZUZvbGRlclswXS5nZXRMb2NhdGlvbigpOwkJCQkJCQkKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCJqc3Qud2ViIi5lcXVhbHModHlwZSkpIHsKLQkJCQlJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChJV2ViTW9kdWxlKSBtb2R1bGUubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKHdlYk1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCUlDb250YWluZXJbXSBtb2R1bGVGb2xkZXIgPSB3ZWJNb2R1bGUuZ2V0UmVzb3VyY2VGb2xkZXJzKCk7Ci0JCQkJCWlmIChtb2R1bGVGb2xkZXIgIT0gbnVsbCAmJiBtb2R1bGVGb2xkZXIubGVuZ3RoID4gMCkKLQkJCQkJCXJldHVybiBtb2R1bGVGb2xkZXJbMF0uZ2V0TG9jYXRpb24oKTsJCQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0VGVtcERpcmVjdG9yeSgpLmFwcGVuZChtb2R1bGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBhIHN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUHJldmlld1NlcnZlciI7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1NvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjYxNWQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1NvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLkZvbGRlclNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3U291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSNjb21wdXRlU291cmNlQ29udGFpbmVycyhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVNvdXJjZUNvbnRhaW5lcltdIGNvbXB1dGVTb3VyY2VDb250YWluZXJzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+IGNsYXNzcGF0aHMgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+KCk7Ci0JCWNsYXNzcGF0aHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoSmF2YVJ1bnRpbWUuY29tcHV0ZVVucmVzb2x2ZWRTb3VyY2VMb29rdXBQYXRoKGNvbmZpZ3VyYXRpb24pKSk7Ci0JCUxpc3Q8SVNvdXJjZUNvbnRhaW5lcj4gc291cmNlZm9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8SVNvdXJjZUNvbnRhaW5lcj4oKTsKLQkJCi0JCUlTZXJ2ZXIgc2VydmVyID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXIoY29uZmlndXJhdGlvbik7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJTGlzdDxJSmF2YVByb2plY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElKYXZhUHJvamVjdD4oKTsKLQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKLQkJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBtb2R1bGVzKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IG1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQlJRm9sZGVyIG1vZHVsZUZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKG1vZHVsZS5nZXROYW1lKCkpOwotCQkJCQlpZiAobW9kdWxlRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCQlzb3VyY2Vmb2xkZXJMaXN0LmFkZChuZXcgRm9sZGVyU291cmNlQ29udGFpbmVyKG1vZHVsZUZvbGRlciwgdHJ1ZSkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQl0cnkgewotCQkJCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLQkJCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwcm9qZWN0LmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQkJCQkJCWlmICghbGlzdC5jb250YWlucyhqYXZhUHJvamVjdCkpCi0JCQkJCQkJCWxpc3QuYWRkKGphdmFQcm9qZWN0KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbmV3IElKYXZhUHJvamVjdFtzaXplXTsKLQkJCWxpc3QudG9BcnJheShwcm9qZWN0cyk7Ci0JCQkKLQkJCWZvciAoSUphdmFQcm9qZWN0IHByb2plY3QgOiBwcm9qZWN0cykKLQkJCQljbGFzc3BhdGhzLmFkZEFsbChBcnJheXMuYXNMaXN0KEphdmFSdW50aW1lLmNvbXB1dGVVbnJlc29sdmVkUnVudGltZUNsYXNzcGF0aChwcm9qZWN0KSkpOwotCQl9Ci0KLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBuZXcgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtjbGFzc3BhdGhzLnNpemUoKV07Ci0JCWNsYXNzcGF0aHMudG9BcnJheShlbnRyaWVzKTsKLQotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZWQgPSBKYXZhUnVudGltZS5yZXNvbHZlU291cmNlTG9va3VwUGF0aChlbnRyaWVzLCBjb25maWd1cmF0aW9uKTsKLQkJSVNvdXJjZUNvbnRhaW5lcltdIHNvdXJjZUNvbnRhaW5lcnMgPSBKYXZhUnVudGltZS5nZXRTb3VyY2VDb250YWluZXJzKHJlc29sdmVkKTsKLQkJCi0JCWlmICghc291cmNlZm9sZGVyTGlzdC5pc0VtcHR5KCkpIHsKLQkJCUlTb3VyY2VDb250YWluZXJbXSBjb21iaW5lZFNvdXJjZUNvbnRhaW5lcnMgPSBuZXcgSVNvdXJjZUNvbnRhaW5lcltzb3VyY2VDb250YWluZXJzLmxlbmd0aCArIHNvdXJjZWZvbGRlckxpc3Quc2l6ZSgpXTsKLQkJCXNvdXJjZWZvbGRlckxpc3QudG9BcnJheShjb21iaW5lZFNvdXJjZUNvbnRhaW5lcnMpOwotCQkJU3lzdGVtLmFycmF5Y29weShzb3VyY2VDb250YWluZXJzLCAwLCBjb21iaW5lZFNvdXJjZUNvbnRhaW5lcnMsIHNvdXJjZWZvbGRlckxpc3Quc2l6ZSgpLCBzb3VyY2VDb250YWluZXJzLmxlbmd0aCk7Ci0JCQlzb3VyY2VDb250YWluZXJzID0gY29tYmluZWRTb3VyY2VDb250YWluZXJzOwotCQl9Ci0KLQkJcmV0dXJuIHNvdXJjZUNvbnRhaW5lcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1N0YXJ0dXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1N0YXJ0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3ZjUyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdTdGFydHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSVN0YXJ0dXA7Ci0KLXB1YmxpYyBjbGFzcyBQcmV2aWV3U3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAieHl6IjsgCi0KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCkgewotCQkvLyBjcmVhdGUgcnVudGltZQotCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lcygpOwotCQlJUnVudGltZSBydW50aW1lID0gbnVsbDsKLQkJCi0JCWZvciAoSVJ1bnRpbWUgciA6IHJ1bnRpbWVzKSB7Ci0JCQlpZiAoci5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwgJiYgUHJldmlld1J1bnRpbWUuSUQuZXF1YWxzKHIuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKSkgewotCQkJCWlmIChJRC5lcXVhbHMoci5nZXRJZCgpKSkKLQkJCQkJcnVudGltZSA9IHI7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChydW50aW1lID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUoUHJldmlld1J1bnRpbWUuSUQpOwotCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgd2MgPSBydW50aW1lVHlwZS5jcmVhdGVSdW50aW1lKElELCBudWxsKTsKLQkJCQl3Yy5zZXROYW1lKCJNeSBQcmV2aWV3Iik7Ci0JCQkJd2Muc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJcnVudGltZSA9IHdjLnNhdmUodHJ1ZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBjcmVhdGUgZGVmYXVsdCBwcmV2aWV3IHJ1bnRpbWUiKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gY3JlYXRlIHNlcnZlcgotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQkKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKElTZXJ2ZXIgcyA6IHNlcnZlcnMpIHsKLQkJCWlmIChzLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIFByZXZpZXdTZXJ2ZXIuSUQuZXF1YWxzKHMuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpKSB7Ci0JCQkJaWYgKElELmVxdWFscyhzLmdldElkKCkpKQotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICghZm91bmQpIHsKLQkJCXRyeSB7Ci0JCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoUHJldmlld1NlcnZlci5JRCk7Ci0JCQkJSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gc2VydmVyVHlwZS5jcmVhdGVTZXJ2ZXIoSUQsIG51bGwsIHJ1bnRpbWUsIG51bGwpOwotCQkJCXdjLnNldE5hbWUoIk15IHByZXZpZXciKTsKLQkJCQl3Yy5zZXRIb3N0KCJsb2NhbGhvc3QiKTsKLQkJCQl3Yy5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQl3Yy5zYXZlKHRydWUsIG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgY3JlYXRlIGRlZmF1bHQgcHJldmlldyBzZXJ2ZXIiKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC91aS9QcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC91aS9QcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMzczMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvdWkvUHJldmlld0xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuc291cmNlbG9va3VwLlNvdXJjZUxvb2t1cFRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuSmF2YUFyZ3VtZW50c1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuSmF2YUNsYXNzcGF0aFRhYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLS8qKgotICogQSBkZWJ1ZyB0YWIgZ3JvdXAgZm9yIGxhdW5jaGluZyBUb21jYXQuIAotICovCi1wdWJsaWMgY2xhc3MgUHJldmlld0xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIHsKLQkvKgotCSAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCNjcmVhdGVUYWJzKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nLCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlVGFicyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyBkaWFsb2csIFN0cmluZyBtb2RlKSB7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVGFiW10gdGFicyA9IG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvblRhYls2XTsKLQkJdGFic1swXSA9IG5ldyBTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiKG5ldyBTdHJpbmdbXSB7ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXciIH0pOwotCQl0YWJzWzBdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1sxXSA9IG5ldyBKYXZhQXJndW1lbnRzVGFiKCk7Ci0JCXRhYnNbMV0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzJdID0gbmV3IEphdmFDbGFzc3BhdGhUYWIoKTsKLQkJdGFic1syXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbM10gPSBuZXcgU291cmNlTG9va3VwVGFiKCk7Ci0JCXRhYnNbM10uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzRdID0gbmV3IEVudmlyb25tZW50VGFiKCk7Ci0JCXRhYnNbNF0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzVdID0gbmV3IENvbW1vblRhYigpOwotCQl0YWJzWzVdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJc2V0VGFicyh0YWJzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwY2Y0NWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZV8zLjAuMC5qYXIKLXNqYXZhY29yZS5qYXIKLXRlbXAuZm9sZGVyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGVmMGIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9kZWJ1Zz10cnVlCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZwotb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3B1Ymxpc2hpbmc9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWMzYTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZTQzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgTm92IDEwIDE3OjExOjM1IEhTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhNjllOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucHJldmlldy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jVHVlIEphbiAxNiAxNjo1OToxNSBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGJkZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTg6MDY6MTEgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9dXNlcgotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTYwZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNTYXQgQXByIDIyIDE4OjM2OjE0IEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWI0MTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0b21jYXRjb3JlLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3ZTZhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmVfMy4wLjAuamFyCi10b21jYXRjb3JlLmphcgotdGVtcC5mb2xkZXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlYWU1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWJiZTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmU0MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYzQwMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSNXZWQgSmFuIDE3IDE0OjEyOjAyIEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwqLnRlc3RzdWl0ZSwqLmRlcGxveSwqLmxvY2F0aW9uLCouZXhlY3V0aW9uLCouZGF0YXBvb2wsKi5hcnRpZmFjdCwqLmh0bWwsKi5zdmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODRiZGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jRnJpIE5vdiAxMCAxODowNjoxMSBIU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT11c2VyCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE2MGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1NhdCBBcHIgMjIgMTg6MzY6MTQgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllMmZlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMy5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXIzMjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDQsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAzLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGZmOGY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB2ZXJpZnlJbnN0YWxsLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwLmxvYWRlci5qYXIsXAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41NS5sb2FkZXIuamFyLFwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNjAubG9hZGVyLmphcgotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNvdXJjZS4uID0gdG9tY2F0Y29yZS8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwLmxvYWRlci5qYXIgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MC5sb2FkZXIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTRhNGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwLmxvYWRlci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41NS5sb2FkZXIuamFyIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTUubG9hZGVyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmMDM4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41NS5sb2FkZXIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNjAubG9hZGVyLmphciBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjYwLmxvYWRlci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjE5ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNjAubG9hZGVyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2MDg1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUFwYWNoZSBUb21jYXQgU3VwcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFJ1bnRpbWUgVHlwZXMgLS0tLS0tLS0tLS0tLS0tCi1hcGFjaGU9QXBhY2hlCi1ydW50aW1lVHlwZVRvbWNhdDMyTGFiZWw9QXBhY2hlIFRvbWNhdCB2My4yCi1ydW50aW1lVHlwZVRvbWNhdDMyRGVzY3JpcHRpb249QXBhY2hlIFRvbWNhdCB2My4yIHN1cHBvcnRzIEoyRUUgMS4yIFdlYiBtb2R1bGVzLgotcnVudGltZVR5cGVUb21jYXQ0MExhYmVsPUFwYWNoZSBUb21jYXQgdjQuMAotcnVudGltZVR5cGVUb21jYXQ0MERlc2NyaXB0aW9uPUFwYWNoZSBUb21jYXQgdjQuMCBzdXBwb3J0cyBKMkVFIDEuMiBhbmQgMS4zIFdlYiBtb2R1bGVzLgotcnVudGltZVR5cGVUb21jYXQ0MUxhYmVsPUFwYWNoZSBUb21jYXQgdjQuMQotcnVudGltZVR5cGVUb21jYXQ0MURlc2NyaXB0aW9uPUFwYWNoZSBUb21jYXQgdjQuMSBzdXBwb3J0cyBKMkVFIDEuMiBhbmQgMS4zIFdlYiBtb2R1bGVzLgotcnVudGltZVR5cGVUb21jYXQ1MExhYmVsPUFwYWNoZSBUb21jYXQgdjUuMAotcnVudGltZVR5cGVUb21jYXQ1MERlc2NyaXB0aW9uPUFwYWNoZSBUb21jYXQgdjUuMCBzdXBwb3J0cyBKMkVFIDEuMiwgMS4zLCBhbmQgMS40IFdlYiBtb2R1bGVzLgotcnVudGltZVR5cGVUb21jYXQ1NUxhYmVsPUFwYWNoZSBUb21jYXQgdjUuNQotcnVudGltZVR5cGVUb21jYXQ1NURlc2NyaXB0aW9uPUFwYWNoZSBUb21jYXQgdjUuNSBzdXBwb3J0cyBKMkVFIDEuMiwgMS4zLCBhbmQgMS40IFdlYiBtb2R1bGVzLgotcnVudGltZVR5cGVUb21jYXQ2MExhYmVsPUFwYWNoZSBUb21jYXQgdjYuMAotcnVudGltZVR5cGVUb21jYXQ2MERlc2NyaXB0aW9uPUFwYWNoZSBUb21jYXQgdjYuMCBzdXBwb3J0cyBKMkVFIDEuMiwgMS4zLCAxLjQsIGFuZCBKYXZhIEVFIDUgV2ViIG1vZHVsZXMuCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tCi10b21jYXQzMlNlcnZlclR5cGU9VG9tY2F0IHYzLjIgU2VydmVyCi10b21jYXQzMlNlcnZlckRlc2NyaXB0aW9uPVB1Ymxpc2hlcyBhbmQgcnVucyBKMkVFIFdlYiBwcm9qZWN0cyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zIHRvIGEgbG9jYWwgVG9tY2F0IHNlcnZlci4KLQotdG9tY2F0NDBTZXJ2ZXJUeXBlPVRvbWNhdCB2NC4wIFNlcnZlcgotdG9tY2F0NDBTZXJ2ZXJEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSBXZWIgcHJvamVjdHMgYW5kIHNlcnZlciBjb25maWd1cmF0aW9ucyB0byBhIGxvY2FsIFRvbWNhdCBzZXJ2ZXIuCi0KLXRvbWNhdDQxU2VydmVyVHlwZT1Ub21jYXQgdjQuMSBTZXJ2ZXIKLXRvbWNhdDQxU2VydmVyRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgV2ViIHByb2plY3RzIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbnMgdG8gYSBsb2NhbCBUb21jYXQgc2VydmVyLgotCi10b21jYXQ1MFNlcnZlclR5cGU9VG9tY2F0IHY1LjAgU2VydmVyCi10b21jYXQ1MFNlcnZlckRlc2NyaXB0aW9uPVB1Ymxpc2hlcyBhbmQgcnVucyBKMkVFIFdlYiBwcm9qZWN0cyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zIHRvIGEgbG9jYWwgVG9tY2F0IHNlcnZlci4KLQotdG9tY2F0NTVTZXJ2ZXJUeXBlPVRvbWNhdCB2NS41IFNlcnZlcgotdG9tY2F0NTVTZXJ2ZXJEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSBXZWIgcHJvamVjdHMgYW5kIHNlcnZlciBjb25maWd1cmF0aW9ucyB0byBhIGxvY2FsIFRvbWNhdCBzZXJ2ZXIuCi0KLXRvbWNhdDYwU2VydmVyVHlwZT1Ub21jYXQgdjYuMCBTZXJ2ZXIKLXRvbWNhdDYwU2VydmVyRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgYW5kIEphdmEgRUUgV2ViIHByb2plY3RzIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbnMgdG8gYSBsb2NhbCBUb21jYXQgc2VydmVyLgotCi10b21jYXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZT1BcGFjaGUgVG9tY2F0Ci0KLSMgLS0tLS0tLS0tLS0tLS0tIEdlbmVyYWwgLS0tLS0tLS0tLS0tLS0tCi1jYW5BZGRNb2R1bGU9V2ViIG1vZHVsZSBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlcnZlci4KLWNhbk1vZGlmeU1vZHVsZXM9V2ViIG1vZHVsZXMgY2FuIGJlIG1vZGlmaWVkLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFmNGIyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZVR5cGVzIj4KLSAgICA8cnVudGltZVR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4zMiIKLSAgICAgICBuYW1lPSIlcnVudGltZVR5cGVUb21jYXQzMkxhYmVsIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcnVudGltZVR5cGVUb21jYXQzMkRlc2NyaXB0aW9uIgotICAgICAgIHZlbmRvcj0iJWFwYWNoZSIKLSAgICAgICB2ZXJzaW9uPSIzLjIiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UnVudGltZSI+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbnM9IjIuMiIvPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgPC9ydW50aW1lVHlwZT4KLQotICAgIDxydW50aW1lVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQwIgotICAgICAgIG5hbWU9IiVydW50aW1lVHlwZVRvbWNhdDQwTGFiZWwiCi0gICAgICAgZGVzY3JpcHRpb249IiVydW50aW1lVHlwZVRvbWNhdDQwRGVzY3JpcHRpb24iCi0gICAgICAgdmVuZG9yPSIlYXBhY2hlIgotICAgICAgIHZlcnNpb249IjQuMCIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRSdW50aW1lIj4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9ucz0iMi4yLCAyLjMiLz4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotICAgIDwvcnVudGltZVR5cGU+Ci0KLSAgICA8cnVudGltZVR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MSIKLSAgICAgICBuYW1lPSIlcnVudGltZVR5cGVUb21jYXQ0MUxhYmVsIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcnVudGltZVR5cGVUb21jYXQ0MURlc2NyaXB0aW9uIgotICAgICAgIHZlbmRvcj0iJWFwYWNoZSIKLSAgICAgICB2ZXJzaW9uPSI0LjEiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UnVudGltZSI+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbnM9IjIuMiwgMi4zIi8+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb25zPSIxLjAiLz4KLSAgICA8L3J1bnRpbWVUeXBlPgotCi0gICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiCi0gICAgICAgbmFtZT0iJXJ1bnRpbWVUeXBlVG9tY2F0NTBMYWJlbCIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXJ1bnRpbWVUeXBlVG9tY2F0NTBEZXNjcmlwdGlvbiIKLSAgICAgICB2ZW5kb3I9IiVhcGFjaGUiCi0gICAgICAgdmVyc2lvbj0iNS4wIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFJ1bnRpbWUiPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb25zPSIyLjIsIDIuMywgMi40Ii8+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb25zPSIxLjAiLz4KLSAgICA8L3J1bnRpbWVUeXBlPgotCi0gICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTUiCi0gICAgICAgbmFtZT0iJXJ1bnRpbWVUeXBlVG9tY2F0NTVMYWJlbCIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXJ1bnRpbWVUeXBlVG9tY2F0NTVEZXNjcmlwdGlvbiIKLSAgICAgICB2ZW5kb3I9IiVhcGFjaGUiCi0gICAgICAgdmVyc2lvbj0iNS41IgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFJ1bnRpbWUiPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb25zPSIyLjIsIDIuMywgMi40Ii8+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb25zPSIxLjAiLz4KLSAgICA8L3J1bnRpbWVUeXBlPgotCi0gICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNjAiCi0gICAgICAgbmFtZT0iJXJ1bnRpbWVUeXBlVG9tY2F0NjBMYWJlbCIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXJ1bnRpbWVUeXBlVG9tY2F0NjBEZXNjcmlwdGlvbiIKLSAgICAgICB2ZW5kb3I9IiVhcGFjaGUiCi0gICAgICAgdmVyc2lvbj0iNi4wIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFJ1bnRpbWUiPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb25zPSIyLjIsIDIuMywgMi40LCAyLjUiLz4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotICAgIDwvcnVudGltZVR5cGU+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lTG9jYXRvcnMiPgotICAgIDxydW50aW1lTG9jYXRvcgotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLmxvY2F0b3IiCi0gICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4qIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFJ1bnRpbWVMb2NhdG9yIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzIj4KLSAgICAgPHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZVRhcmdldCIKLSAgICAgICAgcnVudGltZVR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuKiIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyVHlwZXMiPgotICAgICA8c2VydmVyVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4zMiIKLSAgICAgICBuYW1lPSIldG9tY2F0MzJTZXJ2ZXJUeXBlIgotICAgICAgIGRlc2NyaXB0aW9uPSIldG9tY2F0MzJTZXJ2ZXJEZXNjcmlwdGlvbiIKLSAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSIKLSAgICAgICBydW50aW1lPSJ0cnVlIgotICAgICAgIHN0YXJ0VGltZW91dD0iMzAwMDAiCi0gICAgICAgc3RvcFRpbWVvdXQ9IjE1MDAwIgotICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICBoYXNDb25maWd1cmF0aW9uPSJ0cnVlIgotICAgICAgIGxhdW5jaENvbmZpZ0lkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuMzIiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyIgotICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlckJlaGF2aW91ciI+Ci0gICAgIDwvc2VydmVyVHlwZT4KLSAgICAgPHNlcnZlclR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDAiCi0gICAgICAgbmFtZT0iJXRvbWNhdDQwU2VydmVyVHlwZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXRvbWNhdDQwU2VydmVyRGVzY3JpcHRpb24iCi0gICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiCi0gICAgICAgcnVudGltZT0idHJ1ZSIKLSAgICAgICBzdGFydFRpbWVvdXQ9IjMwMDAwIgotICAgICAgIHN0b3BUaW1lb3V0PSIxNTAwMCIKLSAgICAgICBpbml0aWFsU3RhdGU9InN0b3BwZWQiCi0gICAgICAgaGFzQ29uZmlndXJhdGlvbj0idHJ1ZSIKLSAgICAgICBsYXVuY2hDb25maWdJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQwIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlciIKLSAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXJCZWhhdmlvdXIiPgotICAgICA8L3NlcnZlclR5cGU+Ci0gICAgIDxzZXJ2ZXJUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIgotICAgICAgIG5hbWU9IiV0b21jYXQ0MVNlcnZlclR5cGUiCi0gICAgICAgZGVzY3JpcHRpb249IiV0b21jYXQ0MVNlcnZlckRlc2NyaXB0aW9uIgotICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotICAgICAgIHJ1bnRpbWU9InRydWUiCi0gICAgICAgc3RhcnRUaW1lb3V0PSIzMDAwMCIKLSAgICAgICBzdG9wVGltZW91dD0iMTUwMDAiCi0gICAgICAgaW5pdGlhbFN0YXRlPSJzdG9wcGVkIgotICAgICAgIGhhc0NvbmZpZ3VyYXRpb249InRydWUiCi0gICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MSIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXIiCi0gICAgICAgYmVoYXZpb3VyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyQmVoYXZpb3VyIj4KLSAgICAgPC9zZXJ2ZXJUeXBlPgotICAgICA8c2VydmVyVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCIKLSAgICAgICBuYW1lPSIldG9tY2F0NTBTZXJ2ZXJUeXBlIgotICAgICAgIGRlc2NyaXB0aW9uPSIldG9tY2F0NTBTZXJ2ZXJEZXNjcmlwdGlvbiIKLSAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSIKLSAgICAgICBydW50aW1lPSJ0cnVlIgotICAgICAgIHN0YXJ0VGltZW91dD0iNDUwMDAiCi0gICAgICAgc3RvcFRpbWVvdXQ9IjE1MDAwIgotICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICBoYXNDb25maWd1cmF0aW9uPSJ0cnVlIgotICAgICAgIGxhdW5jaENvbmZpZ0lkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyIgotICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlckJlaGF2aW91ciI+Ci0gICAgIDwvc2VydmVyVHlwZT4KLSAgICAgPHNlcnZlclR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTUiCi0gICAgICAgbmFtZT0iJXRvbWNhdDU1U2VydmVyVHlwZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXRvbWNhdDU1U2VydmVyRGVzY3JpcHRpb24iCi0gICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiCi0gICAgICAgcnVudGltZT0idHJ1ZSIKLSAgICAgICBzdGFydFRpbWVvdXQ9IjQ1MDAwIgotICAgICAgIHN0b3BUaW1lb3V0PSIxNTAwMCIKLSAgICAgICBpbml0aWFsU3RhdGU9InN0b3BwZWQiCi0gICAgICAgaGFzQ29uZmlndXJhdGlvbj0idHJ1ZSIKLSAgICAgICBsYXVuY2hDb25maWdJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1IgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlciIKLSAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXJCZWhhdmlvdXIiPgotICAgICA8L3NlcnZlclR5cGU+Ci0gICAgIDxzZXJ2ZXJUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjYwIgotICAgICAgIG5hbWU9IiV0b21jYXQ2MFNlcnZlclR5cGUiCi0gICAgICAgZGVzY3JpcHRpb249IiV0b21jYXQ2MFNlcnZlckRlc2NyaXB0aW9uIgotICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotICAgICAgIHJ1bnRpbWU9InRydWUiCi0gICAgICAgc3RhcnRUaW1lb3V0PSI0NTAwMCIKLSAgICAgICBzdG9wVGltZW91dD0iMTUwMDAiCi0gICAgICAgaW5pdGlhbFN0YXRlPSJzdG9wcGVkIgotICAgICAgIGhhc0NvbmZpZ3VyYXRpb249InRydWUiCi0gICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS42MCIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXIiCi0gICAgICAgYmVoYXZpb3VyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyQmVoYXZpb3VyIj4KLSAgICAgPC9zZXJ2ZXJUeXBlPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyTG9jYXRvcnMiPgotICAgIDxzZXJ2ZXJMb2NhdG9yCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnNlcnZlci5sb2NhdG9yIgotICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LioiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyTG9jYXRvciIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzIj4KLSAgICAgPGxhdW5jaGFibGVBZGFwdGVyCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC53ZWIiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2VQYXRoQ29tcHV0ZXJzIj4KLSAgICAgPHNvdXJjZVBhdGhDb21wdXRlcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5zb3VyY2VQYXRoQ29tcHV0ZXIiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGVzIj4KLSAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICBuYW1lPSIldG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgIGRlbGVnYXRlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSIKLSAgICAgICAgbW9kZXM9InJ1biwgZGVidWcsIHByb2ZpbGUiCi0gICAgICAgIHNvdXJjZUxvY2F0b3JJZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5zb3VyY2VMb2NhdG9yLkphdmFTb3VyY2VMb29rdXBEaXJlY3RvciIKLSAgICAgICAgc291cmNlUGF0aENvbXB1dGVySWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuc291cmNlUGF0aENvbXB1dGVyIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5wdWJsaXNoVGFza3MiPgotICAgICA8cHVibGlzaFRhc2sKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUucHVibGlzaFRhc2siCi0gICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LioiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlB1Ymxpc2hUYXNrIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8cnVudGltZS1jb21wb25lbnQtdHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIvPgotCi0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgICB2ZXJzaW9uPSIzLjIiLz4KLQotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICAgdmVyc2lvbj0iNC4wIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgIHZlcnNpb249IjQuMSIvPgotCi0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgICB2ZXJzaW9uPSI1LjAiLz4KLQotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICAgdmVyc2lvbj0iNS41Ii8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgIHZlcnNpb249IjYuMCIvPgotCi0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIvPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyJEZhY3RvcnkiLz4KLSAgICAgIDx0eXBlCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNsYXNzcGF0aFByb3ZpZGVyIi8+Ci0gICAgPC9hZGFwdGVyPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgICAgdmVyc2lvbj0iMy4yIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgICAgdmVyc2lvbj0iNC4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMyIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N1cHBvcnRlZD4KLQotICAgIDxzdXBwb3J0ZWQ+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgICAgIHZlcnNpb249IjQuMSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb249IjIuMiwyLjMiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICAgICB2ZXJzaW9uPSI1LjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIsMi4zLDIuNCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N1cHBvcnRlZD4KLQotICAgIDxzdXBwb3J0ZWQ+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgICAgIHZlcnNpb249IjUuNSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb249IjIuMiwyLjMsMi40Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgICAgdmVyc2lvbj0iNi4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQsMi41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmRlZmF1bHRGYWNldHMiPgotICAgIDxkZWZhdWx0LWZhY2V0cz4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiLz4KLSAgICAgIDxmYWNldCBpZD0id3N0LmpzZHQud2ViIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L2RlZmF1bHQtZmFjZXRzPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lRmFjZXRNYXBwaW5ncyI+Ci0gICAgPHJ1bnRpbWVGYWNldE1hcHBpbmcKLSAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuMzIiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICB2ZXJzaW9uPSIzLjIiLz4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MCIKLSAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgIHZlcnNpb249IjQuMCIvPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQxIgotICAgICAgcnVudGltZS1jb21wb25lbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgdmVyc2lvbj0iNC4xIi8+Ci0gICAgPHJ1bnRpbWVGYWNldE1hcHBpbmcKLSAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICB2ZXJzaW9uPSI1LjAiLz4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41NSIKLSAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgIHZlcnNpb249IjUuNSIvPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjYwIgotICAgICAgcnVudGltZS1jb21wb25lbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgdmVyc2lvbj0iNi4wIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnN0YWxsYWJsZVJ1bnRpbWVzIj4KLSAgICA8cnVudGltZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuMzIiCi0gICAgICBsaWNlbnNlVXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0xLjEiCi0gICAgICBhcmNoaXZlVXJsPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvdG9tY2F0L3RvbWNhdC0zL2FyY2hpdmUvdjMuMi40L2Jpbi9qYWthcnRhLXRvbWNhdC0zLjIuNC56aXAiCi0gICAgICBhcmNoaXZlUGF0aD0iamFrYXJ0YS10b21jYXQtMy4yLjQiCi0gICAgICBvcz0id2luMzIiLz4KLSAgICA8cnVudGltZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuMzIiCi0gICAgICBsaWNlbnNlVXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0xLjEiCi0gICAgICBhcmNoaXZlVXJsPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvdG9tY2F0L3RvbWNhdC0zL2FyY2hpdmUvdjMuMi40L2Jpbi9qYWthcnRhLXRvbWNhdC0zLjIuNC50YXIuZ3oiCi0gICAgICBhcmNoaXZlUGF0aD0iamFrYXJ0YS10b21jYXQtMy4yLjQiCi0gICAgICBvcz0ibGludXgiLz4KLSAgICA8cnVudGltZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDAiCi0gICAgICBsaWNlbnNlVXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0xLjEiCi0gICAgICBhcmNoaXZlVXJsPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvdG9tY2F0L3RvbWNhdC00L2FyY2hpdmUvdjQuMC42L2Jpbi9qYWthcnRhLXRvbWNhdC00LjAuNi56aXAiCi0gICAgICBhcmNoaXZlUGF0aD0iamFrYXJ0YS10b21jYXQtNC4wLjYiCi0gICAgICBvcz0id2luMzIiLz4KLSAgICA8cnVudGltZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDAiCi0gICAgICBsaWNlbnNlVXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0xLjEiCi0gICAgICBhcmNoaXZlVXJsPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvdG9tY2F0L3RvbWNhdC00L2FyY2hpdmUvdjQuMC42L2Jpbi9qYWthcnRhLXRvbWNhdC00LjAuNi50YXIuZ3oiCi0gICAgICBhcmNoaXZlUGF0aD0iamFrYXJ0YS10b21jYXQtNC4wLjYiCi0gICAgICBvcz0ibGludXgiLz4KLSAgICA8cnVudGltZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDEiCi0gICAgICBsaWNlbnNlVXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0IgotICAgICAgYXJjaGl2ZVVybD0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RvbWNhdC90b21jYXQtNC92NC4xLjM2L2Jpbi9hcGFjaGUtdG9tY2F0LTQuMS4zNi56aXAiCi0gICAgICBhcmNoaXZlUGF0aD0iYXBhY2hlLXRvbWNhdC00LjEuMzYiCi0gICAgICBvcz0id2luMzIiLz4KLSAgICA8cnVudGltZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDEiCi0gICAgICBsaWNlbnNlVXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0IgotICAgICAgYXJjaGl2ZVVybD0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RvbWNhdC90b21jYXQtNC92NC4xLjM2L2Jpbi9hcGFjaGUtdG9tY2F0LTQuMS4zNi50YXIuZ3oiCi0gICAgICBhcmNoaXZlUGF0aD0iYXBhY2hlLXRvbWNhdC00LjEuMzYiCi0gICAgICBvcz0ibGludXgiLz4KLSAgICA8cnVudGltZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiCi0gICAgICBsaWNlbnNlVXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0IgotICAgICAgYXJjaGl2ZVVybD0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RvbWNhdC90b21jYXQtNS92NS4wLjI4L2Jpbi9qYWthcnRhLXRvbWNhdC01LjAuMjguemlwIgotICAgICAgYXJjaGl2ZVBhdGg9Impha2FydGEtdG9tY2F0LTUuMC4yOCIKLSAgICAgIG9zPSJ3aW4zMiIvPgotICAgIDxydW50aW1lCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MCIKLSAgICAgIGxpY2Vuc2VVcmw9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQiCi0gICAgICBhcmNoaXZlVXJsPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvdG9tY2F0L3RvbWNhdC01L3Y1LjAuMjgvYmluL2pha2FydGEtdG9tY2F0LTUuMC4yOC50YXIuZ3oiCi0gICAgICBhcmNoaXZlUGF0aD0iamFrYXJ0YS10b21jYXQtNS4wLjI4IgotICAgICAgb3M9ImxpbnV4Ii8+Ci0gICAgPHJ1bnRpbWUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1IgotICAgICAgbGljZW5zZVVybD0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dCIKLSAgICAgIGFyY2hpdmVVcmw9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC90b21jYXQvdG9tY2F0LTUvdjUuNS4yNS9iaW4vYXBhY2hlLXRvbWNhdC01LjUuMjUuemlwIgotICAgICAgYXJjaGl2ZVBhdGg9ImFwYWNoZS10b21jYXQtNS41LjI1IgotICAgICAgb3M9IndpbjMyIi8+Ci0gICAgPHJ1bnRpbWUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1IgotICAgICAgbGljZW5zZVVybD0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dCIKLSAgICAgIGFyY2hpdmVVcmw9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC90b21jYXQvdG9tY2F0LTUvdjUuNS4yNS9iaW4vYXBhY2hlLXRvbWNhdC01LjUuMjUudGFyLmd6IgotICAgICAgYXJjaGl2ZVBhdGg9ImFwYWNoZS10b21jYXQtNS41LjI1IgotICAgICAgb3M9ImxpbnV4Ii8+Ci0gICAgPHJ1bnRpbWUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjYwIgotICAgICAgbGljZW5zZVVybD0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dCIKLSAgICAgIGFyY2hpdmVVcmw9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC90b21jYXQvdG9tY2F0LTYvdjYuMC4xNC9iaW4vYXBhY2hlLXRvbWNhdC02LjAuMTQuemlwIgotICAgICAgYXJjaGl2ZVBhdGg9ImFwYWNoZS10b21jYXQtNi4wLjE0IgotICAgICAgb3M9IndpbjMyIi8+Ci0gICAgPHJ1bnRpbWUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjYwIgotICAgICAgbGljZW5zZVVybD0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dCIKLSAgICAgIGFyY2hpdmVVcmw9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC90b21jYXQvdG9tY2F0LTYvdjYuMC4xNC9iaW4vYXBhY2hlLXRvbWNhdC02LjAuMTQudGFyLmd6IgotICAgICAgYXJjaGl2ZVBhdGg9ImFwYWNoZS10b21jYXQtNi4wLjE0IgotICAgICAgb3M9ImxpbnV4Ii8+Ci0gIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0NhdGFsaW5hUHJvcGVydGllc1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvQ2F0YWxpbmFQcm9wZXJ0aWVzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODc2NzQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvQ2F0YWxpbmFQcm9wZXJ0aWVzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJZ29yIEZlZG9yZW5rbyAmIEZhYnJpemlvIEdpdXN0aW5hIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzIGZvciBoYW5kbGluZyBsb2FkZXJzIGluIGNhdGFsaW5hLnByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRhbGluYVByb3BlcnRpZXNVdGlsIHsKLQotICAgIC8qKgotICAgICAqIERvbid0IGluc3RhbnRpYXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBDYXRhbGluYVByb3BlcnRpZXNVdGlsKCkgewotICAgICAgICAvLyB1bnVzZWQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbGlzdCBvZiBwYXRoIGVsZW1lbnRzIHRvIGEgc3BlY2lmaWMgbG9hZGVyIGluIGNhdGFsaW5hLnByb3BlcnRpZXMuCi0gICAgICogVGhpcyBtZXRob2QgZG9lc24ndCB1c2UgamF2YS51dGlsLlByb3BlcnRpZXMgaW4gb3JkZXIgdG8ga2VlcCBmaWxlCi0gICAgICogZm9ybWF0dGluZyBpbnRhY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGUgY2F0YWxpbmEucHJvcGVydGllcyBmaWxlCi0gICAgICogQHBhcmFtIGxvYWRlciBsb2FkZXIgbmFtZQotICAgICAqIEBwYXJhbSBlbGVtZW50cyBMaXN0IG9mIGNsYXNzcGF0aCBlbGVtZW50cwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkR2xvYmFsQ2xhc3NwYXRoKEZpbGUgZmlsZSwgU3RyaW5nIGxvYWRlciwKLSAgICAgICAgICAgIFN0cmluZ1tdIGVsZW1lbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBsb2FkZXIgKyAiLmxvYWRlciI7Ci0KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gYnIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgocHJvcGVydHlOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBhZGRFbGVtZW50cyhsaW5lLCBlbGVtZW50cyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgIGxpbmUgPSBici5yZWFkTGluZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGJyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBici5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghYWRkZWQpIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4gd2l0aCBhbiBvcmlnaW5hbCBjYXRhbGluYS5wcm9wZXJ0aWVzLAotICAgICAgICAgICAgLy8gYnV0IGJldHRlciBoYW5kbGUgYWxzbyBmaWxlcyBtb2RpZmllZCBieSB1c2VycwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPSIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZWxlbWVudHNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eUZpbGUgPSBidWZmZXIudG9TdHJpbmcoKTsKLQotICAgICAgICBCdWZmZXJlZFdyaXRlciBidyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlKSk7Ci0gICAgICAgICAgICBidy53cml0ZShwcm9wZXJ0eUZpbGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGJyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidy5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kIGEgbGlzdCBvZiBwYXRoIHRvIHRoZSBwcm9wZXJ0eSBhdCB0aGUgZ2l2ZW4gbGluZSBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiBtb2RpZmllZCBuYW1lLgotICAgICAqIEBwYXJhbSBsaW5lIGxpbmUgKHByb3BlcnR5PXZhbHVlKQotICAgICAqIEBwYXJhbSBlbGVtZW50cyBjbGFzc3BhdGggZWxlbWVudHMgdG8gYWRkLgotICAgICAqIEByZXR1cm4gbW9kaWZpZWQgbGluZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRFbGVtZW50cyhTdHJpbmcgbGluZSwgU3RyaW5nW10gZWxlbWVudHMpIHsKLSAgICAgICAgU3RyaW5nW10gcHJvcEFuZFZhbHVlID0gbGluZS5zcGxpdCgiPSIpOwotICAgICAgICBTdHJpbmcgbG9hZGVyUHJvcGVydHkgPSAiIjsKLQotICAgICAgICBpZiAocHJvcEFuZFZhbHVlLmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgIGxvYWRlclByb3BlcnR5ID0gcHJvcEFuZFZhbHVlWzFdOwotICAgICAgICB9Ci0KLSAgICAgICAgU2V0IGNsYXNzcGF0aCA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihsb2FkZXJQcm9wZXJ0eSwgIiwiKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgY2xhc3NwYXRoLmFkZChzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGguYWRkKGVsZW1lbnRzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKHByb3BBbmRWYWx1ZVswXSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiPSIpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY2xhc3NwYXRoLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChpdC5uZXh0KCkpOwotICAgICAgICAgICAgaWYgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9DbGFzc0RldGVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0NsYXNzRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmODczNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0NsYXNzRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhIGNsYXNzIGdpdmVuIGFzIGFuCi0gKiBhcmd1bWVudC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc0RldGVjdG9yIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggIT0gMSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogQ2xhc3NEZXRlY3RvciBbY2xhc3NOYW1lXSIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0cnkgewotCQkJQ2xhc3MuZm9yTmFtZShhcmdzWzBdKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigidHJ1ZSIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJmYWxzZSIpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvRmlsZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvRmlsZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzMDFlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0ZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoSGVscGVyOwotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggYW4gYXNzb3J0bWVudCBvZiB1c2VmdWwgZmlsZSBtZXRob2RzLgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWwgewotCS8vIHNpemUgb2YgdGhlIGJ1ZmZlcgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVIgPSAxMDI0MDsKLQotCS8vIHRoZSBidWZmZXIKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYnVmID0gbmV3IGJ5dGVbQlVGRkVSXTsKLQotCS8qKgotCSAqIEZpbGVVdGlsIGNhbm5vdCBiZSBjcmVhdGVkLiBVc2Ugc3RhdGljIG1ldGhvZHMuCi0JICovCi0JcHJpdmF0ZSBGaWxlVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5cyBhIGRpcmVjdG9yeSBmcm9tIGEgdG8gYi4KLQkgKgotCSAqIEBwYXJhbSBmcm9tIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdG8gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcmVjdG9yeShTdHJpbmcgZnJvbSwgU3RyaW5nIHRvLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgZnJvbURpciA9IG5ldyBGaWxlKGZyb20pOwotCQkJRmlsZSB0b0RpciA9IG5ldyBGaWxlKHRvKTsKLQkKLQkJCUZpbGVbXSBmaWxlcyA9IGZyb21EaXIubGlzdEZpbGVzKCk7Ci0JCi0JCQl0b0Rpci5ta2RpcigpOwotCQotCQkJLy8gY3ljbGUgdGhyb3VnaCBmaWxlcwotCQkJaW50IHNpemUgPSBmaWxlcy5sZW5ndGg7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhOTFMuYmluZChNZXNzYWdlcy5jb3B5aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtmcm9tLCB0b30pLCBzaXplICogNTApOwotCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlGaWxlIGN1cnJlbnQgPSBmaWxlc1tpXTsKLQkJCQlTdHJpbmcgZnJvbUZpbGUgPSBjdXJyZW50LmdldEFic29sdXRlUGF0aCgpOwotCQkJCVN0cmluZyB0b0ZpbGUgPSB0bzsKLQkJCQlpZiAoIXRvRmlsZS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQkJCXRvRmlsZSArPSBGaWxlLnNlcGFyYXRvcjsKLQkJCQl0b0ZpbGUgKz0gY3VycmVudC5nZXROYW1lKCk7Ci0JCQkJaWYgKGN1cnJlbnQuaXNGaWxlKCkpIHsKLQkJCQkJY29weUZpbGUoZnJvbUZpbGUsIHRvRmlsZSk7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDUwKTsKLQkJCQl9IGVsc2UgaWYgKGN1cnJlbnQuaXNEaXJlY3RvcnkoKSkgewotCQkJCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuY29weWluZ1Rhc2ssIG5ldyBTdHJpbmdbXSB7ZnJvbUZpbGUsIHRvRmlsZX0pKTsKLQkJCQkJY29weURpcmVjdG9yeShmcm9tRmlsZSwgdG9GaWxlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCA1MCkpOwotCQkJCX0KLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY29weWluZyBkaXJlY3RvcnkiLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgYSBmaWxlIGZyb20gYSB0byBiLiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbSBhZnRlciB1c2UuCi0JICoKLQkgKiBAcGFyYW0gaW4gamF2YS5pby5JbnB1dFN0cmVhbQotCSAqIEBwYXJhbSB0byBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBhIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjb3B5RmlsZShJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIHRvKSB7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQotCQl0cnkgewotCQkJb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG8pOwotCQotCQkJaW50IGF2YWlsID0gaW4ucmVhZChidWYpOwotCQkJd2hpbGUgKGF2YWlsID4gMCkgewotCQkJCW91dC53cml0ZShidWYsIDAsIGF2YWlsKTsKLQkJCQlhdmFpbCA9IGluLnJlYWQoYnVmKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY29weWluZyBmaWxlIiwgZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvcHlpbmdGaWxlLCBuZXcgU3RyaW5nW10ge3RvLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhIGZpbGUgZnJvbSBhIHRvIGIuCi0JICoKLQkgKiBAcGFyYW0gZnJvbSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHRvIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIGEgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNvcHlGaWxlKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb3B5RmlsZShuZXcgRmlsZUlucHV0U3RyZWFtKGZyb20pLCB0byk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjb3B5aW5nIGZpbGUiLCBlKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ29weWluZ0ZpbGUsIG5ldyBTdHJpbmdbXSB7dG8sIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhIGZpbGUgZnJvbSBhIHRvIGIuCi0JICoKLQkgKiBAcGFyYW0gZnJvbSBqYXZhLm5ldC5VUkwKLQkgKiBAcGFyYW0gdG8gamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gYSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY29weUZpbGUoVVJMIGZyb20sIFN0cmluZyB0bykgewotCQl0cnkgewotCQkJcmV0dXJuIGNvcHlGaWxlKGZyb20ub3BlblN0cmVhbSgpLCB0byk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjb3B5aW5nIGZpbGUiLCBlKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ29weWluZ0ZpbGUsIG5ldyBTdHJpbmdbXSB7dG8sIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weXMgYSBkaXJlY3RvcnkgZnJvbSBhIHRvIGIsIG9ubHkgbW9kaWZ5aW5nIGFzIG5lZWRlZAotCSAqIGFuZCBkZWxldGluZyBvbGQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgotCSAqCi0JICogQHBhcmFtIGZyb20gYSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gdG8gYSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAZGVwcmVjYXRlZCB3aWxsIGJlIHJlbW92ZWQgaW4gbmV4dCByZWxlYXNlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNtYXJ0Q29weURpcmVjdG9yeShTdHJpbmcgZnJvbSwgU3RyaW5nIHRvLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgZnJvbURpciA9IG5ldyBGaWxlKGZyb20pOwotCQkJRmlsZSB0b0RpciA9IG5ldyBGaWxlKHRvKTsKLQkKLQkJCUZpbGVbXSBmcm9tRmlsZXMgPSBmcm9tRGlyLmxpc3RGaWxlcygpOwotCQkJaW50IGZyb21TaXplID0gZnJvbUZpbGVzLmxlbmd0aDsKLQkKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmNvcHlpbmdUYXNrLCBuZXcgU3RyaW5nW10ge2Zyb20sIHRvfSksIDU1MCk7Ci0JCi0JCQlGaWxlW10gdG9GaWxlcyA9IG51bGw7Ci0JCi0JCQkvLyBkZWxldGUgb2xkIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBmcm9tIHRoaXMgZGlyZWN0b3J5Ci0JCQlpZiAodG9EaXIuZXhpc3RzKCkgJiYgdG9EaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCXRvRmlsZXMgPSB0b0Rpci5saXN0RmlsZXMoKTsKLQkJCQlpbnQgdG9TaXplID0gdG9GaWxlcy5sZW5ndGg7Ci0JCi0JCQkJLy8gY2hlY2sgaWYgdGhpcyBleGFjdCBmaWxlIGV4aXN0cyBpbiB0aGUgbmV3IGRpcmVjdG9yeQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9TaXplOyBpKyspIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSB0b0ZpbGVzW2ldLmdldE5hbWUoKTsKLQkJCQkJYm9vbGVhbiBpc0RpciA9IHRvRmlsZXNbaV0uaXNEaXJlY3RvcnkoKTsKLQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZyb21TaXplOyBqKyspIHsKLQkJCQkJCWlmIChuYW1lLmVxdWFscyhmcm9tRmlsZXNbal0uZ2V0TmFtZSgpKSAmJiBpc0RpciA9PSBmcm9tRmlsZXNbal0uaXNEaXJlY3RvcnkoKSkKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gZGVsZXRlIGZpbGUgaWYgaXQgY2FuJ3QgYmUgZm91bmQgb3IgaXNuJ3QgdGhlIGNvcnJlY3QgdHlwZQotCQkJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJCQlpZiAoaXNEaXIpCi0JCQkJCQkJUHVibGlzaEhlbHBlci5kZWxldGVEaXJlY3RvcnkodG9GaWxlc1tpXSwgbnVsbCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJdG9GaWxlc1tpXS5kZWxldGUoKTsKLQkJCQkJfQotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAodG9EaXIuaXNGaWxlKCkpCi0JCQkJCXRvRGlyLmRlbGV0ZSgpOwotCQkJCXRvRGlyLm1rZGlyKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCg1MCk7Ci0JCi0JCQkvLyBjeWNsZSB0aHJvdWdoIGZpbGVzIGFuZCBvbmx5IGNvcHkgd2hlbiBpdCBkb2Vzbid0IGV4aXN0Ci0JCQkvLyBvciBpcyBuZXdlcgotCQkJdG9GaWxlcyA9IHRvRGlyLmxpc3RGaWxlcygpOwotCQkJaW50IHRvU2l6ZSA9IHRvRmlsZXMubGVuZ3RoOwotCQkJaW50IGR3ID0gMDsKLQkJCWlmICh0b1NpemUgPiAwKQotCQkJCWR3ID0gNTAwIC8gdG9TaXplOwotCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcm9tU2l6ZTsgaSsrKSB7Ci0JCQkJRmlsZSBjdXJyZW50ID0gZnJvbUZpbGVzW2ldOwotCQotCQkJCS8vIGNoZWNrIGlmIHRoaXMgaXMgYSBuZXcgb3IgbmV3ZXIgZmlsZQotCQkJCWJvb2xlYW4gY29weSA9IHRydWU7Ci0JCQkJaWYgKCFjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBjdXJyZW50LmdldE5hbWUoKTsKLQkJCQkJbG9uZyBtb2QgPSBjdXJyZW50Lmxhc3RNb2RpZmllZCgpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRvU2l6ZTsgaisrKSB7Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHModG9GaWxlc1tqXS5nZXROYW1lKCkpICYmIG1vZCA8PSB0b0ZpbGVzW2pdLmxhc3RNb2RpZmllZCgpKQotCQkJCQkJCWNvcHkgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkKLQkJCQlpZiAoY29weSkgewotCQkJCQlTdHJpbmcgZnJvbUZpbGUgPSBjdXJyZW50LmdldEFic29sdXRlUGF0aCgpOwotCQkJCQlTdHJpbmcgdG9GaWxlID0gdG87Ci0JCQkJCWlmICghdG9GaWxlLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCQkJCXRvRmlsZSArPSBGaWxlLnNlcGFyYXRvcjsKLQkJCQkJdG9GaWxlICs9IGN1cnJlbnQuZ2V0TmFtZSgpOwotCQkJCQlpZiAoY3VycmVudC5pc0ZpbGUoKSkgewotCQkJCQkJY29weUZpbGUoZnJvbUZpbGUsIHRvRmlsZSk7Ci0JCQkJCQltb25pdG9yLndvcmtlZChkdyk7Ci0JCQkJCX0gZWxzZSBpZiAoY3VycmVudC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuY29weWluZ1Rhc2ssIG5ldyBTdHJpbmdbXSB7ZnJvbUZpbGUsIHRvRmlsZX0pKTsKLQkJCQkJCXNtYXJ0Q29weURpcmVjdG9yeShmcm9tRmlsZSwgdG9GaWxlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCBkdykpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoNTAwIC0gZHcgKiB0b1NpemUpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzbWFydCBjb3B5aW5nIGRpcmVjdG9yeSAiICsgZnJvbSArICIgLSAiICsgdG8sIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JTWltZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSU1pbWVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNTk0NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JTWltZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1pbWVNYXBwaW5nIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBleHRlbnNpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pbWUgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtaW1lIHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0Q29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWJhZGExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVG9tY2F0Q29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbWltZSBtYXBwaW5ncy4KLQkgKiAKLQkgKiBAcmV0dXJuIG1pbWUgbWFwcGluZ3MKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNaW1lTWFwcGluZ3MoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBTZXJ2ZXJQb3J0cyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiB1c2VzLgotCSAqCi0JICogQHJldHVybiB0aGUgc2VydmVyIHBvcnRzCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmVyUG9ydHMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdlYiBtb2R1bGVzIGluIHRoaXMgc2VydmVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdlYiBtb2R1bGVzCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViTW9kdWxlcygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMGQ3N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBleHRlbmRzIElUb21jYXRDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBBZGQgYSB3ZWIgbW9kdWxlLgotCSAqCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqIEBwYXJhbSBtb2R1bGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuV2ViTW9kdWxlCi0JICovCi0JcHVibGljIHZvaWQgYWRkV2ViTW9kdWxlKGludCBpbmRleCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpOwotCQotCS8qKgotCSAqIENoYW5nZSBhIHdlYiBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqIEBwYXJhbSBkb2NCYXNlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGF0aCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJlbG9hZGFibGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVdlYk1vZHVsZShpbnQgaW5kZXgsIFN0cmluZyBkb2NCYXNlLCBTdHJpbmcgcGF0aCwgYm9vbGVhbiByZWxvYWRhYmxlKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIHdlYiBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVdlYk1vZHVsZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQWRkcyBhIG1pbWUgbWFwcGluZy4KLQkgKgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKiBAcGFyYW0gbWFwIE1pbWVNYXBwaW5nCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKTsKLQotCS8qKgotCSAqIENoYW5nZSBhIG1pbWUgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICogQHBhcmFtIG1hcCBNaW1lTWFwcGluZwotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeU1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCk7Ci0KLQkvKioKLQkgKiBNb2RpZnkgdGhlIHBvcnQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwb3J0IGludAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVNlcnZlclBvcnQoU3RyaW5nIGlkLCBpbnQgcG9ydCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBtaW1lIG1hcHBpbmcuCi0JICogCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKGludCBpbmRleCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0UnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0UnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTBjMDI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklKYXZhUnVudGltZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRvbWNhdFJ1bnRpbWUgZXh0ZW5kcyBJSmF2YVJ1bnRpbWUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgY2xhc3NwYXRoIHRoYXQgaXMgdXNlZCBieSB0aGlzIHJ1bnRpbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSBjbGFzc3BhdGgKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSdW50aW1lQ2xhc3NwYXRoKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRSdW50aW1lV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlOTM5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRSdW50aW1lV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JSmF2YVJ1bnRpbWVXb3JraW5nQ29weTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weSBleHRlbmRzIElUb21jYXRSdW50aW1lLCBJSmF2YVJ1bnRpbWVXb3JraW5nQ29weSB7Ci0JLy8gbm8gbmV3IG1ldGhvZHMKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRTZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDUzMWE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JVVJMUHJvdmlkZXI7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRvbWNhdFNlcnZlciBleHRlbmRzIElVUkxQcm92aWRlciB7Ci0JLyoqCi0JICogUHJvcGVydHkgd2hpY2ggc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgY29uZmlndXJlZAotCSAqIGZvciB0ZXN0aW5nIGVudmlyb25tZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1RFU1RfRU5WSVJPTk1FTlQgPSAidGVzdEVudmlyb25tZW50IjsKLQkKLQkvKioKLQkgKiBQcm9wZXJ0eSB3aGljaCBzcGVjaWZpZXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgc2VydmVyIGluc3RhbmNlCi0JICogZXhpc3RzLiAgSWYgbm90IHNwZWNpZmllZCwgaW5zdGFuY2UgZGlyZWN0b3J5IGlzIGRlcml2ZWQKLQkgKiBmcm9tIHRoZSB0ZXh0RW52aXJvbm1lbnQgc2V0dGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9JTlNUQU5DRV9ESVIgPSAiaW5zdGFuY2VEaXIiOwotCS8qKgotCSAqIFByb3BlcnR5IHdoaWNoIHNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHdlYiBhcHBsaWNhdGlvbnMKLQkgKiBhcmUgcHVibGlzaGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFUExPWV9ESVIgPSAiZGVwbG95RGlyIjsKLQotCS8qKgotCSAqIFByb3BlcnR5IHdoaWNoIHNwZWNpZmllcyBpZiBtb2R1bGVzIHNob3VsZCBiZSBzZXJ2ZWQgd2l0aG91dAotCSAqIHB1Ymxpc2hpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU0VSVkVfTU9EVUxFU19XSVRIT1VUX1BVQkxJU0ggPSAic2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2giOwotCQotCS8qKgotCSAqIFByb3BlcnR5IHdoaWNoIHNwZWNpZmllcyBjb250ZXh0cyBpbiB0aGUgc2VydmVyLnhtbCBmaWxlIHNob3VsZAotCSAqIGJlIHNhdmVkIHRvIHNlcGFyYXRlIGNvbnRleHQgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU0FWRV9TRVBBUkFURV9DT05URVhUX0ZJTEVTID0gInNhdmVTZXBhcmF0ZUNvbnRleHRGaWxlcyI7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHRlc3QgKHB1Ymxpc2ggYW5kIHJ1biBjb2RlIG91dCBvZiB0aGUKLQkgKiB3b3JrYmVuY2gpIGVudmlyb25tZW50IHNlcnZlci4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGVzdEVudmlyb25tZW50KCk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgZXhpc3RzLiAgSWYgbm90IHNldCwKLQkgKiB0aGUgaW5zdGFuY2UgZGlyZWN0b3J5IGlzIGRlcml2ZWQgZnJvbSB0aGUgdGVzdEVudmlyb25tZW50IHNldHRpbmcuICAKLQkgKiAKLQkgKiBAcmV0dXJuIGRpcmVjdG9yeSB3aGVyZSB0aGUgc2VydmVyIGluc3RhbmNlIGV4aXN0cy4gUmV0dXJucyBudWxsCi0JICogaWYgbm90IHNldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbmNlRGlyZWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXJlY3RvcnkgdG8gd2hpY2ggd2ViIGFwcGxpY2F0aW9ucyBhcmUgdG8gYmUgZGVwbG95ZWQuCi0JICogSWYgcmVsYXRpdmUsIGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBydW50aW1lIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUKLQkgKiBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiBkaXJlY3Rvcnkgd2hlcmUgd2ViIGFwcGxpY2F0aW9ucyBhcmUgZGVwbG95ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlcGxveURpcmVjdG9yeSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBtb2R1bGVzIHNob3VsZCBiZSBzZXJ2ZWQgZGlyZWN0bHkgZnJvbSB0aGUgcHJvamVjdAotCSAqIGZvbGRlcnMgd2l0aG91dCBwdWJsaXNoaW5nLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBtb2R1bGVzIHNob3VsZCBub3QgYmUgcHVibGlzaGVkIGJ1dCBzZXJ2ZWQgZGlyZWN0bHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGNvbnRleHRzIHNob3VsZCBiZSBzYXZlZCB0byBzZXBhcmF0ZSBjb250ZXh0Ci0JICogZmlsZXMgaW5zdGVhZCBvZiBiZWluZyBrZXB0IHdpdGhpbiBzZXJ2ZXIueG1sIHdoZW4gdGhlIHNlcnZlcgotCSAqIGlzIHB1Ymxpc2hlZC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgY29udGV4dHMgc2hvdWxkIGJlIHNhdmVkIHRvIHNlcGFyYXRlIGZpbGVzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFNlcnZlckJlaGF2aW91ci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyQmVoYXZpb3VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYTU3M2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyQmVoYXZpb3VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUb21jYXRTZXJ2ZXJCZWhhdmlvdXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIG1haW4gY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGxhdW5jaCB0aGUgVG9tY2F0IHNlcnZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYWluIHJ1bnRpbWUgY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVDbGFzcygpOwotCi0JLyoqCi0JICogU2V0dXAgZm9yIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIGxhdW5jaCBJTGF1bmNoCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgU3RyaW5nCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXBMYXVuY2goSUxhdW5jaCBsYXVuY2gsIFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRTZXJ2ZXJXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjVlZmE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkgZXh0ZW5kcyBJVG9tY2F0U2VydmVyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBkZXBsb3ltZW50IGRpcmVjdG9yeS4gIEF2b2lkICJ3ZWJhcHBzIiBkdWUgdG8KLQkgKiBzaWRlIGVmZmVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ERVBMT1lESVIgPSAid3Rwd2ViYXBwcyI7Ci0KLQkvKioKLQkgKiBUaGUgZGVwbG95bWVudCBkaXJlY3RvcnkgdXNlZCBieSBkZWZhdWx0IGluIHByaW9yIHZlcnNpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9ERVBMT1lESVIgPSAid2ViYXBwcyI7Ci0KLQkvKioKLQkgKiBTZXRzIHRoaXMgc2VydmVyIHRvIHRlc3QgZW52aXJvbm1lbnQgbW9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gYiBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVzdEVudmlyb25tZW50KGJvb2xlYW4gYik7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgaW5zdGFuY2UgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyLiBJZiBzZXQgdG8KLQkgKiBudWxsLCB0aGUgaW5zdGFuY2UgZGlyZWN0b3J5IGlzIGRlcml2ZWQgZnJvbSB0aGUKLQkgKiB0ZXN0RW52aXJvbm1lbnQgc2V0dGluZy4nCi0JICogCi0JICogQHBhcmFtIGluc3RhbmNlRGlyIGFic29sdWxlIHBhdGggdG8gdGhlIGluc3RhbmNlIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YW5jZURpcmVjdG9yeShTdHJpbmcgaW5zdGFuY2VEaXIpOwotCi0JLyoqCi0JICogU2V0IHRoZSBkZXBsb3ltZW50IGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlci4gIE1heSBiZSBhYnNvbHV0ZQotCSAqIG9yIHJlbGF0aXZlIHRvIHJ1bnRpbWUgYmFzZSBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGRlcGxveURpciBkZXBsb3ltZW50IGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGxveURpcmVjdG9yeShTdHJpbmcgZGVwbG95RGlyKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhpcyBzZXJ2ZXIgdG8gc2VydmUgbW9kdWxlcyB3aXRob3V0IHB1Ymxpc2hpbmcuCi0JICogCi0JICogQHBhcmFtIGIgdHJ1ZSBpZiBtb2R1bGVzIHNob3VsZCBiZSBzZXJ2ZWQgd2l0aG91dCBwdWJsaXNoaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goYm9vbGVhbiBiKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhpcyBzZXJ2ZXIgdG8gc2F2ZSBjb250ZXh0cyB0byBzZXBhcmF0ZSBjb250ZXh0Ci0JICogZmlsZXMgd2hlbiBwdWJsaXNoaW5nIHRoZSBzZXJ2ZXIuCi0JICogQHBhcmFtIGIgdHJ1ZSBpZiBjb250ZXh0cyBzaG91bGQgYmUgc2F2ZWQgdG8gc2VwYXJhdGUgZmlsZXMKLQkgKiB3aGVuIHB1Ymxpc2hpbmcgdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhdmVTZXBhcmF0ZUNvbnRleHRGaWxlcyhib29sZWFuIGIpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0VmVyc2lvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFZlcnNpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NmM0Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0VmVyc2lvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgewotCS8qKgotCSAqIFZlcmlmaWVzIGlmIHRoZSBzcGVjaWZpZWQgcGF0aCBwb2ludHMgdG8gYSBhIFRvbWNhdAotCSAqIGluc3RhbGxhdGlvbiBvZiB0aGlzIHZlcnNpb24uCi0JICogCi0JICogQHBhcmFtIGluc3RhbGxQYXRoIGFuIGluc3RhbGxhdGlvbiBwYXRoIAotCSAqIEByZXR1cm4gT0sgc3RhdHVzIGlmIGEgdmFsaWQgaW5zdGFsbGF0aW9uCi0JICogZXhpc3RzIGF0IHRoZSBsb2NhdGlvbi4gIElmIG5vdCB2YWxpZCwgdGhlIElTdGF0dXMKLQkgKiBjb250YWlucyBhbiBpbmRpY2F0aW9uIG9mIHdoeS4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2ZXJpZnlJbnN0YWxsUGF0aChJUGF0aCBpbnN0YWxsUGF0aCk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgc3RhcnR1cCBjbGFzcyBmb3IgdGhlIFRvbWNhdCBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiBzZXJ2ZXIgc3RhcnR1cCBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgc3RhcnR1cCBjbGFzc3BhdGggZm9yIHRoZSBUb21jYXQgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YWxsUGF0aCBhbiBpbnN0YWxsYXRpb24gcGF0aAotCSAqIEByZXR1cm4gbGlzdCBvZiBjbGFzc3BhdGggZW50cmllcyByZXF1aXJlZCB0bwotCSAqIHN0YXJ0IHRoZSBUb21jYXQgc2VydmVyLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGggaW5zdGFsbFBhdGgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbSdzIHJ1bnRpbWUgYXJndW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdQYXRoIGEgY29uZmlnIHBhdGgKLQkgKiBAcGFyYW0gZGVidWcgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZGVidWcgbW9kZSBpcyBvbgotCSAqIEBwYXJhbSBzdGFydGluZyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHN0YXJ0aW5nCi0JICogQHJldHVybiBhIHN0cmluZyBhcnJheSBvZiBwcm9ncmFtIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhJUGF0aCBjb25maWdQYXRoLCBib29sZWFuIGRlYnVnLCBib29sZWFuIHN0YXJ0aW5nKTsKLQotCS8qKgotCSAqIEFyZ3VtZW50cyB0aGF0IHNob3VsZCBub3QgYXBwZWFyIGluIHRoZSBydW50aW1lIGFyZ3VtZW50cyBiYXNlZCBvbgotCSAqIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVidWcgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZGVidWcgbW9kZSBpcyBvbgotCSAqIEBwYXJhbSBzdGFydGluZyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHN0YXJ0aW5nCi0JICogQHJldHVybiBhcnJheSBvZiBleGNsdWRlZCBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuIGRlYnVnLCBib29sZWFuIHN0YXJ0aW5nKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBzdGFydHVwIFZNIGFyZ3VtZW50cyBmb3IgdGhlIFRvbWNhdCBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIGluc3RhbGxQYXRoIGluc3RhbGxhdGlvbiBwYXRoIGZvciB0aGUgc2VydmVyCi0JICogQHBhcmFtIGNvbmZpZ1BhdGggY29uZmlndXJhdGlvbiBwYXRoIGZvciB0aGUgc2VydmVyCi0JICogQHBhcmFtIGRlcGxveVBhdGggZGVwbG95IHBhdGggZm9yIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gaXNUZXN0RW52IHRlc3QgZW52aXJvbm1lbnQgZmxhZwotCSAqIEByZXR1cm4gYXJyYXkgb2YgVk0gYXJndW1lbnRzIGZvciBzdGFydGluZyB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVWTUFyZ3VtZW50cyhJUGF0aCBpbnN0YWxsUGF0aCwgSVBhdGggY29uZmlnUGF0aCwgSVBhdGggZGVwbG95UGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudHMgb2YgdGhlIEphdmEgcG9saWN5IGZpbGUgZm9yIHRoZSBUb21jYXQgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdQYXRoIHBhdGggdG8gY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gY29udGVudHMgb2YgSmF2YSBwb2xpY3kgZmlsZSBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZVBvbGljeUZpbGUoSVBhdGggY29uZmlnUGF0aCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHByb2plY3QgaXMgc3VwcG9ydGVkIGJ5IHRoaXMKLQkgKiBzZXJ2ZXIsIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0JICoKLQkgKiBAcGFyYW0gbW9kdWxlIGEgd2ViIG1vZHVsZQotCSAqIEByZXR1cm4gdGhlIHN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbkFkZE1vZHVsZShJTW9kdWxlIG1vZHVsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGJhc2UgcGF0aCBmb3IgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIHNlcnZlcgotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBUb21jYXRTZXJ2ZXIgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBkZXRlcm1pbmUKLQkgKiB0aGUgYmFzZSBwYXRoLgotCSAqIEByZXR1cm4gcGF0aCB0byBUb21jYXQgaW5zdGFuY2UgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KFRvbWNhdFNlcnZlciBzZXJ2ZXIpOwotCi0JLyoqCi0JICogUHJlcGFyZSBzZXJ2ZXIgcnVudGltZSBkaXJlY3RvcnkuIENyZWF0ZSBjYXRhbGluYSBpbnN0YW5jZSBzZXQgb2YKLQkgKiBkaXJlY3Rvcmllcy4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBUb21jYXQgaW5zdGFuY2UgZGlyZWN0b3J5IHRvIHByZXBhcmUKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiBjcmVhdGlvbiBvcGVyYXRpb24gCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlcGFyZVJ1bnRpbWVEaXJlY3RvcnkoSVBhdGggYmFzZURpcik7Ci0JCi0JLyoqCi0JICogUHJlcGFyZXMgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYnkgbWFraW5nIHN1cmUgaXQgZXhpc3RzIGFuZCBpcwotCSAqIGluaXRpYWxpemVkIGFwcHJvcHJpYXRlbHkuCi0JICogCi0JICogQHBhcmFtIGRlcGxveVBhdGggcGF0aCB0byB0aGUgZGVwbG95bWVudCBkaXJlY3RvcnkKLQkgKiAgYmVpbmcgcHJlcGFyZWQKLQkgKiBAcmV0dXJuIHN0YXR1cyByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByZXBhcmVEZXBsb3lEaXJlY3RvcnkoSVBhdGggZGVwbG95UGF0aCk7Ci0JCi0JLyoqCi0JICogUHJlcGFyZSBkaXJlY3RvcnkgZm9yIHNlcnZpbmcgY29udGV4dHMgZGlyZWN0bHkgaWYgZW5hYmxlZC4KLQkgKiBJZiBub3QgZW5hYmxlZCwgcmVzdG9yZSBkaXJlY3RvcnkgaWYgbmVjZXNzYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIHBhdGggdG8gVG9tY2F0IGluc3RhbmNlIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBzZXJ2ZXIgVG9tY2F0U2VydmVyIGluc3RhbmNlIGZyb20gd2hpY2ggdG8gZGV0ZXJtaW5lCi0JICogaWYgc2VydmluZyBkaXJlY3RseSBpcyBlbmFibGVkCi0JICogQHJldHVybiBzdGF0dXMgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcmVwYXJlRm9yU2VydmluZ0RpcmVjdGx5KElQYXRoIGJhc2VEaXIsIFRvbWNhdFNlcnZlciBzZXJ2ZXIpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWUgb2YgdGhlICJzaGFyZWQiIGxvYWRlciB0byB1c2Ugd2l0aCBzZXJ2aW5nCi0JICogbW9kdWxlcyB3aXRob3V0IHB1Ymxpc2hpbmcuICBSZXR1cm5zIG51bGwgaWYgc2VydmluZyBtb2R1bGVzCi0JICogd2l0aG91dCBwdWJsaXNoaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBUb21jYXQgaW5zdGFuY2UgZGlyZWN0b3J5Ci0JICogQHJldHVybiBuYW1lIG9mIHNoYXJlZCBsb2FkZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXJlZExvYWRlcihJUGF0aCBiYXNlRGlyKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXJ2ZXIgc3VwcG9ydHMgc2VydmluZyBtb2R1bGVzIHdpdGhvdXQKLQkgKiBwdWJsaXNoaW5nLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzZXJ2aW5nIG1vZHVsZXMgd2l0aG91dCBwdWJsaXNoaW5nIGlzIHN1cHBvcnRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXJ2ZXIgc3VwcG9ydHMgYSBkZWJ1ZyBhcmd1bWVudC4gVGhpcwotCSAqIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGFmZmVjdCB0aGUgbGV2ZWwgb2YgbG9nZ2luZy4gIE5ld2VyCi0JICogdmVyc2lvbnMgb2YgVG9tY2F0IHVzZSBkaWZmZXJlbnQgbWVhbnMgb2YgY29udHJvbGxpbmcgbG9nZ2luZwotCSAqIGFuZCBpZ25vcmUgdGhpcyBhcmd1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZGVidWcgYXJndW1lbnQgaXMgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEZWJ1Z0FyZ3VtZW50KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2VydmVyIHN1cHBvcnRzIHNlcGFyYXRlIGNvbnRleHQgZmlsZXMuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgc2VydmVyIHN1cHBvcnRzIHNlcGFyYXRlIGNvbnRleHQgZmlsZXMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcGFyYXRlQ29udGV4dEZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmRvcnNlZCBkaXJlY3RvcmllcyBkZXJpdmVkIHVzaW5nIHRoZQotCSAqIHNwZWNpZmllZCBpbnN0YWxsIHBhdGguCi0JICogCi0JICogQHBhcmFtIGluc3RhbGxQYXRoIGluc3RhbGxhdGlvbiBwYXRoIGZvciB0aGUgc2VydmVyCi0JICogQHJldHVybiBUaGUgZW5kb3JzZWQgZGlyZWN0b3JpZXMgZm9yIHRoaXMgc2VydmVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kb3JzZWREaXJlY3RvcmllcyhJUGF0aCBpbnN0YWxsUGF0aCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRXZWJNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFdlYk1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2I4OGI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFdlYk1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotLyoqCi0gKiBBIFdlYiBtb2R1bGUgZGVwbG95ZWQgb24gVG9tY2F0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUb21jYXRXZWJNb2R1bGUgewotCS8qKgotCSAqIEdldCB0aGUgZG9jdW1lbnQgYmFzZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRCYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhdGguIChjb250ZXh0IHJvb3QpCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVtZW50by4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVtZW50bygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHdlYiBtb2R1bGUgaXMgYXV0by1yZWxvYWRhYmxlLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWxvYWRhYmxlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDg0ZGRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvcHlpbmdGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclZlcnNpb25FbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclVua25vd25WZXJzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW5zdGFsbERpckVtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW5zdGFsbERpcldyb25nVmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckluc3RhbGxEaXJEb2VzTm90RXhpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnN0YWxsRGlyTWlzc2luZ0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnN0YWxsRGlyTWlzc2luZ0ZpbGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW5zdGFsbERpck1pc3NpbmdGaWxlMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckluc3RhbGxEaXJUcmFpbGluZ1NsYXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySlJFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySlJFVG9tY2F0NjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2FybmluZ0pSRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3YXJuaW5nQ2FudFJlYWRDb25maWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFyZ2V0MzJydW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhcmdldDQwcnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXJnZXQ0MXJ1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFyZ2V0NTBydW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhcmdldDU1cnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwb3J0VW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkaW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZGF0aW5nQ29uZmlndXJhdGlvblRhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FuQWRkTW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3BlYzMyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3BlYzQwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3BlYzQxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3BlYzUwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3BlYzU1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3BlYzYwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBvcnRTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZURpclByZXBhcmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWd1cmF0aW9uVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQ29udGV4dENvbmZpZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nQ29udGV4dENvbmZpZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tpbmdDb250ZXh0VGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJQb3N0UHJvY2Vzc2luZ0NvbXBsZXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaENvbmZpZ3VyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoU2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFudXBTZXJ2ZXJUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRldGVjdGluZ1JlbW92ZWRQcm9qZWN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGluZ0NvbnRleHRGaWxlc1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRpbmdDb250ZXh0RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVkQ29udGV4dEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdERlbGV0ZUNvbnRleHRGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ2xlYW51cFNlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoZXJQdWJsaXNoVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vQ29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcldlYk1vZHVsZXNPbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm9SdW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hTZXJ2ZXJUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUG9ydEludmFsaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQb3J0SW5Vc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQb3J0c0luVXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRHVwbGljYXRlQ29udGV4dFJvb3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdExvYWRDb250ZXh0WG1sOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yWE1MU2VydmljZU5vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yWE1MTm9TZXJ2aWNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yWE1MRW5naW5lTm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JYTUxIb3N0Tm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JYTUxDb250ZXh0Tm90Rm91bmRQYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yWE1MQ29udGV4dE1hbmdlck5vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yWE1MQ29udGV4dE5vdEZvdW5kUGF0aDMyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yWE1MTnVsbENvbnRleHRBcmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1B1Ymxpc2hOb3RTdXBwb3J0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoQ29udGV4dE5vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaENvdWxkTm90UmVtb3ZlTW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaExvYWRlckphck5vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaFVSTENvbnZlcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoQ2FudERlbGV0ZUxvYWRlckphcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hDYXRhbGluYVByb3BzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaFBhdGhEdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoUGF0aENvbmZsaWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaFBhdGhNaXNzaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeVBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeU1pbWVNYXBwaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25BZGRNaW1lTWFwcGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uQWRkV2ViTW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25Nb2RpZnlXZWJNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFjdGlvblJlbW92ZU1pbWVNYXBwaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25SZW1vdmVXZWJNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbkVkaXRXZWJNb2R1bGVQYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvckFjdGlvblNldERlYnVnTW9kZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JBY3Rpb25TZXRTZWN1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yQWN0aW9uU2V0U2VydmVyRGlyZWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvckFjdGlvblNldERlcGxveURpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JBY3Rpb25TZXRTZXJ2ZVdpdGhvdXRQdWJsaXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVpZHRvckFjdGlvblNldFNlcGFyYXRlQ29udGV4dEZpbGVzOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhUb21jYXRQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjEwOTlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgcnVudGltZSB0YXJnZXQKLXRhcmdldDMycnVudGltZT1Ub21jYXQgdjMuMiBydW50aW1lCi10YXJnZXQ0MHJ1bnRpbWU9VG9tY2F0IHY0LjAgcnVudGltZQotdGFyZ2V0NDFydW50aW1lPVRvbWNhdCB2NC4xIHJ1bnRpbWUKLXRhcmdldDUwcnVudGltZT1Ub21jYXQgdjUuMCBydW50aW1lCi10YXJnZXQ1NXJ1bnRpbWU9VG9tY2F0IHY1LjUgcnVudGltZQotCi0jIC0tLS0tLS0tLS0tLS0tLSBUYXNrcyAocHJvZ3Jlc3MgbW9uaXRvcnMpIC0tLS0tLS0tLS0tLS0tLQotc2F2aW5nVGFzaz1TYXZpbmcuLi4KLWxvYWRpbmdUYXNrPUxvYWRpbmcuLi4KLXVwZGF0aW5nQ29uZmlndXJhdGlvblRhc2s9VXBkYXRpbmcgcnVuLXRpbWUgY29uZmlndXJhdGlvbi4uLgotcHVibGlzaFNlcnZlclRhc2s9UHVibGlzaGluZyB0byBzZXJ2ZXIuLi4KLXB1Ymxpc2hDb25maWd1cmF0aW9uVGFzaz1QdWJsaXNoaW5nIHRoZSBjb25maWd1cmF0aW9uLi4uCi1wdWJsaXNoZXJQdWJsaXNoVGFzaz1QdWJsaXNoaW5nIHswfS4uLgotCi1wdWJsaXNoQ29udGV4dENvbmZpZ1Rhc2s9UHVibGlzaGluZyBNRVRBLUlORi9jb250ZXh0LnhtbCBjb25maWd1cmF0aW9ucy4uLgotY2hlY2tpbmdDb250ZXh0VGFzaz1DaGVja2luZyBDb250ZXh0IHswfSBmb3IgY29udGV4dC54bWwuLi4KLXNhdmluZ0NvbnRleHRDb25maWdUYXNrPVNhdmluZyBjb250ZXh0IGNvbmZpZ3VyYXRpb24gdXBkYXRlcy4uLgotc2VydmVyUG9zdFByb2Nlc3NpbmdDb21wbGV0ZT1Db250ZXh0IGNvbmZpZ3VyYXRpb25zIGFkZGVkLgotCi1jbGVhbnVwU2VydmVyVGFzaz1SZW1vdmluZyBvYnNvbGV0ZSBmaWxlcyBmcm9tIHNlcnZlci4uLgotZGV0ZWN0aW5nUmVtb3ZlZFByb2plY3RzPVByZXBhcmluZyBsaXN0IG9mIHJlbW92ZWQgcHJvamVjdHMuLi4KLWRlbGV0aW5nQ29udGV4dEZpbGVzVGFzaz1EZWxldGluZyBvYnNvbGV0ZSBjb250ZXh0IGZpbGVzIGZyb20gc2VydmVyLi4uCi1kZWxldGluZ0NvbnRleHRGaWxlPURlbGV0aW5nIG9ic29sZXRlIGNvbnRleHQgZmlsZSB7MH0uLi4KLWRlbGV0ZWRDb250ZXh0RmlsZT1Db250ZXh0IGZpbGUgezB9IHJlbW92ZWQKLXJ1bnRpbWVEaXJQcmVwYXJlZD1SdW50aW1lIGRpcmVjdG9yeSBwcmVwYXJlZAotY29weWluZ1Rhc2s9Q29weWluZyBmcm9tIHswfSB0byB7MX0KLWRlbGV0aW5nVGFzaz1EZWxldGluZyB7MH0KLWVycm9yQ29weWluZ0ZpbGU9RXJyb3IgY29weWluZyBmaWxlIHRvIHswfTogezF9Ci1lcnJvclB1Ymxpc2g9UHVibGlzaGluZyBmYWlsZWQgd2l0aCBtdWx0aXBsZSBlcnJvcnMKLQotIyBFZGl0b3IgY29tbWFuZHMgKHVzZWQgaW4gdW5kby9yZWRvIG1lbnVzKQotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbkFkZE1pbWVNYXBwaW5nPU1JTUUgTWFwcGluZyBBZGRpdGlvbgotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeU1pbWVNYXBwaW5nPU1JTUUgTWFwcGluZyBDaGFuZ2UKLWNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25SZW1vdmVNaW1lTWFwcGluZz1NSU1FIE1hcHBpbmcgUmVtb3ZhbAotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbkFkZFdlYk1vZHVsZT1XZWIgTW9kdWxlIEFkZGl0aW9uCi1jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5V2ViTW9kdWxlPVdlYiBNb2R1bGUgQ2hhbmdlCi1jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uUmVtb3ZlV2ViTW9kdWxlPVdlYiBNb2R1bGUgUmVtb3ZhbAotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeVBvcnQ9UG9ydCBOdW1iZXIgQ2hhbmdlCi1jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uRWRpdFdlYk1vZHVsZVBhdGg9V2ViIE1vZHVsZSBQYXRoIENoYW5nZQotCi0jIC0tLS0tLS0tLS0tLS0tLSBHZW5lcmFsIC0tLS0tLS0tLS0tLS0tLQotY2FuQWRkTW9kdWxlPVdlYiBtb2R1bGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXJ2ZXIuCi1wb3J0U2VydmVyPVRvbWNhdCBhZG1pbiBwb3J0Ci1wb3J0VW5rbm93bj11bmtub3duIHBvcnQKLQotIyAtLS0tLS0tLS0tLS0tLS0gRXJyb3JzIGFuZCBJbmZvIC0tLS0tLS0tLS0tLS0tLQotZXJyb3JWZXJzaW9uRW1wdHk9VGhlIFRvbWNhdCB2ZXJzaW9uIG11c3QgYmUgc3BlY2lmaWVkLgotZXJyb3JVbmtub3duVmVyc2lvbj1Vbmtub3duIHZlcnNpb24gb2YgVG9tY2F0IHdhcyBzcGVjaWZpZWQuCi1lcnJvckluc3RhbGxEaXJFbXB0eT1UaGUgVG9tY2F0IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgbWF5IG5vdCBiZSBlbXB0eS4KLWVycm9ySW5zdGFsbERpcldyb25nVmVyc2lvbj1UaGUgbmFtZSBvZiB0aGUgVG9tY2F0IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgaW5kaWNhdGVzIGl0IGlzIGZvciBkaWZmZXJlbnQgdmVyc2lvbiBvZiBUb21jYXQuCi1lcnJvckluc3RhbGxEaXJEb2VzTm90RXhpc3Q9VGhlIHNwZWNpZmllZCBUb21jYXQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4KLWVycm9ySW5zdGFsbERpck1pc3NpbmdGaWxlPVRoZSBUb21jYXQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpcyBub3QgdmFsaWQuIEl0IGlzIG1pc3NpbmcgZXhwZWN0ZWQgZmlsZSBvciBmb2xkZXIgezB9LgotZXJyb3JJbnN0YWxsRGlyTWlzc2luZ0ZpbGUyPVRoZSBUb21jYXQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpcyBub3QgdmFsaWQuIEl0IGlzIG1pc3NpbmcgZXhwZWN0ZWQgZmlsZSBvciBmb2xkZXIgezB9IChhbHRlcm5hdGUgbmFtZSB7MX0pLgotZXJyb3JJbnN0YWxsRGlyTWlzc2luZ0ZpbGUzPVRoZSBUb21jYXQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpcyBub3QgdmFsaWQuIEl0IGlzIG1pc3NpbmcgZXhwZWN0ZWQgZmlsZSBvciBmb2xkZXIgezB9IChhbHRlcm5hdGUgbmFtZXMgezF9KS4KLWVycm9ySW5zdGFsbERpclRyYWlsaW5nU2xhc2g9VGhlIFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHNob3VsZCBub3QgaGF2ZSBhIHRyYWlsaW5nIHNsYXNoLgotZXJyb3JKUkU9VGhlIEpSRSBjb3VsZCBub3QgYmUgZm91bmQuIEVkaXQgdGhlIHNlcnZlciBhbmQgY2hhbmdlIHRoZSBKUkUgbG9jYXRpb24uCi1lcnJvckpSRVRvbWNhdDYwPVRvbWNhdCB2ZXJzaW9uIDYuMCByZXF1aXJlcyBKMlNFIDUuMCBvciBsYXRlci4gIENoYW5nZSB0aGUgSlJFIHRvIG9uZSB0aGF0IG1lZXRzIHRoaXMgcmVxdWlyZW1lbnQuCi1lcnJvclBvcnRJbnZhbGlkPVRoZSBzZXJ2ZXIgY2Fubm90IGJlIHN0YXJ0ZWQgYmVjYXVzZSBvbmUgb3IgbW9yZSBvZiB0aGUgcG9ydHMgYXJlIGludmFsaWQuIE9wZW4gdGhlIHNlcnZlciBlZGl0b3IgYW5kIGNvcnJlY3QgdGhlIGludmFsaWQgcG9ydHMuCi1lcnJvclBvcnRJblVzZT1Qb3J0IHswfSByZXF1aXJlZCBieSB7MX0gaXMgYWxyZWFkeSBpbiB1c2UuIFRoZSBzZXJ2ZXIgbWF5IGFscmVhZHkgYmUgcnVubmluZyBpbiBhbm90aGVyIHByb2Nlc3MsIG9yIGEgc3lzdGVtIHByb2Nlc3MgbWF5IGJlIHVzaW5nIHRoZSBwb3J0LiBcCi0gIFRvIHN0YXJ0IHRoaXMgc2VydmVyIHlvdSB3aWxsIG5lZWQgdG8gc3RvcCB0aGUgb3RoZXIgcHJvY2VzcyBvciBjaGFuZ2UgdGhlIHBvcnQgbnVtYmVyKHMpLgotZXJyb3JQb3J0c0luVXNlPVNldmVyYWwgcG9ydHMgKHswfSkgcmVxdWlyZWQgYnkgezF9IGFyZSBhbHJlYWR5IGluIHVzZS4gVGhlIHNlcnZlciBtYXkgYWxyZWFkeSBiZSBydW5uaW5nIGluIGFub3RoZXIgcHJvY2Vzcywgb3IgYSBzeXN0ZW0gcHJvY2VzcyBtYXkgYmUgdXNpbmcgdGhlIHBvcnQuIFwKLSAgVG8gc3RhcnQgdGhpcyBzZXJ2ZXIgeW91IHdpbGwgbmVlZCB0byBzdG9wIHRoZSBvdGhlciBwcm9jZXNzIG9yIGNoYW5nZSB0aGUgcG9ydCBudW1iZXIocykuCi0jIHRoZSB7MH0gaW4gdGhlIGZvbGxvd2luZyB0d28gbGluZXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGEgbG9jYXRpb24gKHBhdGgpIG9mIHRoZSBtaXNzaW5nIG9yIGNvcnJ1cHQgc2VydmVyIGNvbmZpZ3VyYXRpb24KLWVycm9yTm9Db25maWd1cmF0aW9uPVRoZSBUb21jYXQgc2VydmVyIGNvbmZpZ3VyYXRpb24gYXQgezB9IGlzIG1pc3NpbmcuIENoZWNrIHRoZSBzZXJ2ZXIgZm9yIGVycm9ycy4KLWVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbj1Db3VsZCBub3QgbG9hZCB0aGUgVG9tY2F0IHNlcnZlciBjb25maWd1cmF0aW9uIGF0IHswfS4gVGhlIGNvbmZpZ3VyYXRpb24gbWF5IGJlIGNvcnJ1cHQgb3IgaW5jb21wbGV0ZS4KLWVycm9yQ291bGROb3RTYXZlQ29uZmlndXJhdGlvbj1Db3VsZCBub3Qgc2F2ZSB0aGUgVG9tY2F0IHNlcnZlciBjb25maWd1cmF0aW9uOiB7MH0uCi1lcnJvclB1Ymxpc2hDb25maWd1cmF0aW9uPUNvdWxkIG5vdCBwdWJsaXNoIHNlcnZlciBjb25maWd1cmF0aW9uOiB7MH0uCi1lcnJvclB1Ymxpc2hTZXJ2ZXI9Q291bGQgbm90IHB1Ymxpc2ggc2VydmVyIGNvbmZpZ3VyYXRpb24gZm9yIHswfS4KLWVycm9yQ291bGROb3REZWxldGVDb250ZXh0RmlsZT1Db3VsZCBub3QgZGVsZXRlIG9ic29sZXRlIGNvbnRleHQgZmlsZTogezB9Ci1lcnJvckNsZWFudXBTZXJ2ZXI9Q291bGQgbm90IGNsZWFuIHNlcnZlciBvZiBvYnNvbGV0ZSBmaWxlczogezB9Ci1lcnJvcldlYk1vZHVsZXNPbmx5PVRvbWNhdCBvbmx5IHN1cHBvcnRzIHJ1bm5pbmcgSjJFRSBXZWIgbW9kdWxlcy4KLWVycm9yTm9SdW50aW1lPUNhbm5vdCBhZGQgbW9kdWxlcyBiZWNhdXNlIHRoZXJlIGlzIG5vIHJ1bnRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2ZXIuCi1lcnJvclNwZWMzMj1Ub21jYXQgdmVyc2lvbiAzLjIgb25seSBzdXBwb3J0cyBKMkVFIDEuMiBXZWIgbW9kdWxlcwotZXJyb3JTcGVjNDA9VG9tY2F0IHZlcnNpb24gNC4wIG9ubHkgc3VwcG9ydHMgSjJFRSAxLjIgYW5kIDEuMyBXZWIgbW9kdWxlcwotZXJyb3JTcGVjNDE9VG9tY2F0IHZlcnNpb24gNC4xIG9ubHkgc3VwcG9ydHMgSjJFRSAxLjIgYW5kIDEuMyBXZWIgbW9kdWxlcwotZXJyb3JTcGVjNTA9VG9tY2F0IHZlcnNpb24gNS4wIG9ubHkgc3VwcG9ydHMgSjJFRSAxLjIsIDEuMywgYW5kIDEuNCBXZWIgbW9kdWxlcwotZXJyb3JTcGVjNTU9VG9tY2F0IHZlcnNpb24gNS41IG9ubHkgc3VwcG9ydHMgSjJFRSAxLjIsIDEuMywgYW5kIDEuNCBXZWIgbW9kdWxlcwotZXJyb3JTcGVjNjA9VG9tY2F0IHZlcnNpb24gNi4wIG9ubHkgc3VwcG9ydHMgSjJFRSAxLjIsIDEuMywgMS40LCBhbmQgSmF2YSBFRSA1IFdlYiBtb2R1bGVzCi1lcnJvckR1cGxpY2F0ZUNvbnRleHRSb290PVR3byBvciBtb3JlIFdlYiBtb2R1bGVzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaGF2ZSB0aGUgc2FtZSBjb250ZXh0IHJvb3QgKHswfSkuIFwKLSAgVG8gc3RhcnQgdGhpcyBzZXJ2ZXIgeW91IHdpbGwgbmVlZCB0byByZW1vdmUgdGhlIGR1cGxpY2F0ZShzKS4KLWVycm9yQ291bGROb3RMb2FkQ29udGV4dFhtbD1Db3VsZCBub3QgbG9hZCB0aGUgY29udGV4dCBjb25maWd1cmF0aW9uIGZvciB0aGUgezB9IGNvbnRleHQgZHVlIHRvIGEgc3ludGF4IGVycm9yIG9yIG90aGVyIGV4Y2VwdGlvbi4KLWVycm9yWE1MU2VydmljZU5vdEZvdW5kPVNlcnZpY2UgXCJ7MH1cIiB3YXMgbm90IGZvdW5kLgotZXJyb3JYTUxOb1NlcnZpY2U9Tm8gU2VydmljZSB3YXMgZm91bmQuCi1lcnJvclhNTEVuZ2luZU5vdEZvdW5kPUVuZ2luZSBlbGVtZW50IG5vdCBmb3VuZCB1bmRlciBTZXJ2aWNlIFwiezB9XCIuCi1lcnJvclhNTEhvc3ROb3RGb3VuZD1Ib3N0IFwiezB9XCIgd2FzIG5vdCBmb3VuZCB1bmRlciBFbmdpbmUgXCJ7MX1cIiBhbmQgU2VydmljZSBcInsyfVwiLgotZXJyb3JYTUxDb250ZXh0Tm90Rm91bmRQYXRoPUNvbnRleHQgd2l0aCBwYXRoIFwiezB9XCIgd2FzIG5vdCBmb3VuZCB1bmRlciBTZXJ2aWNlIFwiezF9XCIsIEVuZ2luZSBcInsyfVwiLCBhbmQgSG9zdCBcInszfVwiLgotZXJyb3JYTUxDb250ZXh0TWFuZ2VyTm90Rm91bmQ9Q29udGV4dE1hbmFnZXIgZWxlbWVudCB3YXMgbm90IGZvdW5kLgotZXJyb3JYTUxDb250ZXh0Tm90Rm91bmRQYXRoMzI9Q29udGV4dCB3aXRoIHBhdGggXCJ7MH1cIiB3YXMgbm90IGZvdW5kIHVuZGVyIENvbnRleHRNYW5hZ2VyLgotZXJyb3JYTUxOdWxsQ29udGV4dEFyZz1Db250ZXh0IGFyZ3VtZW50IG1heSBub3QgYmUgbnVsbC4KLWVycm9yTm9QdWJsaXNoTm90U3VwcG9ydGVkPVNlcnZpbmcgbW9kdWxlcyB3aXRob3V0IHB1Ymxpc2hpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHNlcnZlci4KLWVycm9yUHVibGlzaENvbnRleHROb3RGb3VuZD1Db250ZXh0IG5vdCBmb3VuZCBmb3IgbW9kdWxlIHswfS4KLWVycm9yUHVibGlzaENvdWxkTm90UmVtb3ZlTW9kdWxlPUNvdWxkIG5vdCByZW1vdmUgbW9kdWxlIHswfS4KLWVycm9yUHVibGlzaExvYWRlckphck5vdEZvdW5kPUxvYWRlciBqYXIgbm90IGZvdW5kIGZvciBzZXJ2ZXIgSUQ6IHswfS4KLWVycm9yUHVibGlzaFVSTENvbnZlcnQ9RXhjZXB0aW9uIG9jY3VycmVkIGNvbnZlcnRpbmcgVVJMIHswfTogezF9LgotZXJyb3JQdWJsaXNoQ2FudERlbGV0ZUxvYWRlckphcj1VbmFibGUgdG8gZGVsZXRlIHRoZSBjdXN0b20gbG9hZGVyIGphciB7MH0gZnJvbSBUb21jYXQgc2VydmVyLgotZXJyb3JQdWJsaXNoQ2F0YWxpbmFQcm9wcz1FeGNlcHRpb24gb2NjdXJyZWQgbW9kaWZ5aW5nIGNhdGFsaW5hLnByb3BlcnRpZXM6IHswfS4KLWVycm9yUHVibGlzaFBhdGhEdXA9TXVsdGlwbGUgQ29udGV4dHMgaGF2ZSBhIHBhdGggb2YgInswfSIuCi1lcnJvclB1Ymxpc2hQYXRoQ29uZmxpY3Q9Q29udGV4dCB3aXRoIHBhdGggInswfSIgY29uZmxpY3RzIHdpdGggYW5vdGhlciBDb250ZXh0IHdpdGggcGF0aCAiezF9Ii4KLWVycm9yUHVibGlzaFBhdGhNaXNzaW5nPUEgQ29udGV4dCB3YXMgZm91bmQgd2l0aCBubyBwYXRoLgotCi13YXJuaW5nSlJFPVRvbWNhdCByZXF1aXJlcyBhIEphdmEgU0RLIGluIG9yZGVyIHRvIGNvbXBpbGUgSlNQIGZpbGVzLiBFbnN1cmUgdGhhdCB0aGUgSlJFIHByZWZlcmVuY2Ugc2V0dGluZ3MgcG9pbnQgdG8gYW4gU0RLIGluc3RhbGwgbG9jYXRpb24uCi13YXJuaW5nQ2FudFJlYWRDb25maWc9Q2Fubm90IHJlYWQgdGhlIFRvbWNhdCBjb25maWd1cmF0aW9uLgotCi0jIEFjdGlvbnMgKHVzZWQgaW4gdW5kby9yZWRvIG1lbnVzKQotc2VydmVyRWRpdG9yQWN0aW9uU2V0U2VjdXJlPVRvbWNhdCBTZWN1cml0eSBPcHRpb24gQ2hhbmdlCi1zZXJ2ZXJFZGl0b3JBY3Rpb25TZXREZWJ1Z01vZGU9VG9tY2F0IERlYnVnIExvZ2dpbmcgT3B0aW9uIENoYW5nZQotc2VydmVyRWRpdG9yQWN0aW9uU2V0U2VydmVyRGlyZWN0b3J5PVRvbWNhdCBTZXJ2ZXIgUGF0aCBDaGFuZ2UKLXNlcnZlckVkaXRvckFjdGlvblNldERlcGxveURpcmVjdG9yeT1Ub21jYXQgRGVwbG95IFBhdGggQ2hhbmdlCi1zZXJ2ZXJFZGl0b3JBY3Rpb25TZXRTZXJ2ZVdpdGhvdXRQdWJsaXNoPVNlcnZlIE1vZHVsZXMgV2l0aG91dCBQdWJsaXNoIE9wdGlvbiBDaGFuZ2UKLXNlcnZlckVpZHRvckFjdGlvblNldFNlcGFyYXRlQ29udGV4dEZpbGVzPVB1Ymxpc2ggQ29udGV4dHMgVG8gU2VwYXJhdGUgRmlsZXMgT3B0aW9uIENoYW5nZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9NaW1lTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9NaW1lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDNmYjJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvTWltZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotLyoqCi0gKiBBIG1pbWUgbWFwcGluZy4KLSAqLwotcHVibGljIGNsYXNzIE1pbWVNYXBwaW5nIGltcGxlbWVudHMgSU1pbWVNYXBwaW5nIHsKLQlwcml2YXRlIFN0cmluZyBleHRlbnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbWltZVR5cGU7Ci0KLQkvKioKLQkgKiBNaW1lTWFwcGluZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb24gYW4gZXh0ZW5zaW9uCi0JICogQHBhcmFtIG1pbWVUeXBlIGEgbWltZSB0eXBlCi0JICovCi0JcHVibGljIE1pbWVNYXBwaW5nKFN0cmluZyBleHRlbnNpb24sIFN0cmluZyBtaW1lVHlwZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmV4dGVuc2lvbiA9IGV4dGVuc2lvbjsKLQkJdGhpcy5taW1lVHlwZSA9IG1pbWVUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4dGVuc2lvbi4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtaW1lIHR5cGUuCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLQkJcmV0dXJuIG1pbWVUeXBlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1BpbmdUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvUGluZ1RocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDMzMmUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvUGluZ1RocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogVGhyZWFkIHVzZWQgdG8gcGluZyBzZXJ2ZXIgdG8gdGVzdCB3aGVuIGl0IGlzIHN0YXJ0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQaW5nVGhyZWFkIHsKLQkvLyBkZWxheSBiZWZvcmUgcGluZ2luZyBzdGFydHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19ERUxBWSA9IDIwMDA7Ci0KLQkvLyBkZWxheSBiZXR3ZWVuIHBpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJTkdfSU5URVJWQUwgPSAyNTA7Ci0KLQkvLyBtYXhpbXVtIG51bWJlciBvZiBwaW5ncyBiZWZvcmUgZ2l2aW5nIHVwCi0JcHJpdmF0ZSBpbnQgbWF4UGluZ3M7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3RvcCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQlwcml2YXRlIElTZXJ2ZXIgc2VydmVyOwotCXByaXZhdGUgVG9tY2F0U2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBQaW5nVGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gdXJsCi0JICogQHBhcmFtIG1heFBpbmdzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0byB0cnkgcGluZ2luZywgb3IgLTEgdG8gY29udGludWUgZm9yZXZlcgotCSAqIEBwYXJhbSBiZWhhdmlvdXIKLQkgKi8KLQlwdWJsaWMgUGluZ1RocmVhZChJU2VydmVyIHNlcnZlciwgU3RyaW5nIHVybCwgaW50IG1heFBpbmdzLCBUb21jYXRTZXJ2ZXJCZWhhdmlvdXIgYmVoYXZpb3VyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLnVybCA9IHVybDsKLQkJdGhpcy5tYXhQaW5ncyA9IG1heFBpbmdzOwotCQl0aGlzLmJlaGF2aW91ciA9IGJlaGF2aW91cjsKLQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCJUb21jYXQgUGluZyBUaHJlYWQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcGluZygpOwotCQkJfQotCQl9OwotCQl0LnNldERhZW1vbih0cnVlKTsKLQkJdC5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqIFBpbmcgdGhlIHNlcnZlciB1bnRpbCBpdCBpcyBzdGFydGVkLiBUaGVuIHNldCB0aGUgc2VydmVyCi0JICogc3RhdGUgdG8gU1RBVEVfU1RBUlRFRC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwaW5nKCkgewotCQlpbnQgY291bnQgPSAwOwotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKFBJTkdfREVMQVkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJd2hpbGUgKCFzdG9wKSB7Ci0JCQl0cnkgewotCQkJCWlmIChjb3VudCA9PSBtYXhQaW5ncykgewotCQkJCQl0cnkgewotCQkJCQkJc2VydmVyLnN0b3AoZmFsc2UpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogY291bGQgbm90IHN0b3Agc2VydmVyIik7Ci0JCQkJCX0KLQkJCQkJc3RvcCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljb3VudCsrOwotCQkJCQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHBpbmdpbmcgIiArIGNvdW50KTsKLQkJCQlVUkwgcGluZ1VybCA9IG5ldyBVUkwodXJsKTsKLQkJCQlVUkxDb25uZWN0aW9uIGNvbm4gPSBwaW5nVXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJKChIdHRwVVJMQ29ubmVjdGlvbiljb25uKS5nZXRSZXNwb25zZUNvZGUoKTsKLQkKLQkJCQkvLyBwaW5nIHdvcmtlZCAtIHNlcnZlciBpcyB1cAotCQkJCWlmICghc3RvcCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBzdWNjZXNzIik7Ci0JCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJCQliZWhhdmlvdXIuc2V0U2VydmVyU3RhcnRlZCgpOwotCQkJCX0KLQkJCQlzdG9wID0gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmZSkgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQliZWhhdmlvdXIuc2V0U2VydmVyU3RhcnRlZCgpOwotCQkJCXN0b3AgPSB0cnVlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBmYWlsZWQiKTsKLQkJCQkvLyBwaW5naW5nIGZhaWxlZAotCQkJCWlmICghc3RvcCkgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKFBJTkdfSU5URVJWQUwpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMikgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZWxsIHRoZSBwaW5naW5nIHRvIHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogc3RvcHBpbmciKTsKLQkJc3RvcCA9IHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZGFkZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBQcm9ncmVzcyBNb25pdG9yIHV0aWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ncmVzc1V0aWwgewotCS8qKgotCSAqIFByb2dyZXNzVXRpbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgUHJvZ3Jlc3NVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZhbGlkIHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgaW50Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgYSBudW1iZXIgb2YgdGlja3MKLQkgKiBAcGFyYW0gc3R5bGUgYSBzdHlsZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcywgaW50IHN0eWxlKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzLCBzdHlsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvUHVibGlzaE9wZXJhdGlvbjIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvUHVibGlzaE9wZXJhdGlvbjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1NjdkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1B1Ymxpc2hPcGVyYXRpb24yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hIZWxwZXI7Ci0vKioKLSAqIFRvbWNhdCBwdWJsaXNoIGhlbHBlci4KLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hPcGVyYXRpb24yIGV4dGVuZHMgUHVibGlzaE9wZXJhdGlvbiB7Ci0JcHJvdGVjdGVkIFRvbWNhdFNlcnZlckJlaGF2aW91ciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElNb2R1bGVbXSBtb2R1bGU7Ci0JcHJvdGVjdGVkIGludCBraW5kOwotCXByb3RlY3RlZCBpbnQgZGVsdGFLaW5kOwotCXByaXZhdGUgUHVibGlzaEhlbHBlciBoZWxwZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgdGhlIG9wZXJhdGlvbiBvYmplY3QgdG8gcHVibGlzaCB0aGUgc3BlY2lmaWVkIG1vZHVsZQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgc2VydmVyIHRvIHdoaWNoIHRoZSBtb2R1bGUgd2lsbCBiZSBwdWJsaXNoZWQKLQkgKiBAcGFyYW0ga2luZCBraW5kIG9mIHB1Ymxpc2gKLQkgKiBAcGFyYW0gbW9kdWxlIG1vZHVsZSB0byBwdWJsaXNoCi0JICogQHBhcmFtIGRlbHRhS2luZCBraW5kIG9mIGNoYW5nZQotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uMihUb21jYXRTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyLCBpbnQga2luZCwgSU1vZHVsZVtdIG1vZHVsZSwgaW50IGRlbHRhS2luZCkgewotCQlzdXBlcigiUHVibGlzaCB0byBzZXJ2ZXIiLCAiUHVibGlzaCBXZWIgbW9kdWxlIHRvIFRvbWNhdCBzZXJ2ZXIiKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCQl0aGlzLmtpbmQgPSBraW5kOwotCQl0aGlzLmRlbHRhS2luZCA9IGRlbHRhS2luZDsKLQkJSVBhdGggYmFzZSA9IHNlcnZlci5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQloZWxwZXIgPSBuZXcgUHVibGlzaEhlbHBlcihiYXNlLmFwcGVuZCgidGVtcCIpLnRvRmlsZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFdlIGFyZSBkb29tZWQgd2l0aG91dCBhIGJhc2UgZGlyZWN0b3J5LiAgSG93ZXZlciwgYWxsb3cgdGhlIGNhdGFzdHJvcGhlCi0JCQkvLyB0byBvY2N1ciBlbHNld2hlcmUgYW5kIGhvcGUgZm9yIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UuCi0JCQloZWxwZXIgPSBuZXcgUHVibGlzaEhlbHBlcihudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUHVibGlzaE9wZXJhdGlvbiNnZXRPcmRlcigpCi0JICovCi0JcHVibGljIGludCBnZXRPcmRlcigpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQdWJsaXNoT3BlcmF0aW9uI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIFJFUVVJUkVEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUHVibGlzaE9wZXJhdGlvbiNleGVjdXRlKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKG1vZHVsZS5sZW5ndGggPT0gMSkgeyAvLyB3ZWIgbW9kdWxlCi0JCQlwdWJsaXNoRGlyKG1vZHVsZVswXSwgc3RhdHVzLCBtb25pdG9yKTsKLQkJfSBlbHNlIHsgLy8gdXRpbGl0eSBtb2R1bGUKLQkJCXB1Ymxpc2hKYXIoc3RhdHVzLCBtb25pdG9yKTsKLQkJfQotCQl0aHJvd0V4Y2VwdGlvbihzdGF0dXMpOwotCQlzZXJ2ZXIuc2V0TW9kdWxlUHVibGlzaFN0YXRlMihtb2R1bGUsIElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHVibGlzaERpcihJTW9kdWxlIG1vZHVsZTIsIExpc3Qgc3RhdHVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IHNlcnZlci5nZXRNb2R1bGVEZXBsb3lEaXJlY3RvcnkobW9kdWxlMik7Ci0JCQotCQkvLyBSZW1vdmUgaWYgcmVxdWVzdGVkIG9yIGlmIHByZXZpb3VzbHkgcHVibGlzaGVkIGFuZCBhcmUgbm93IHNlcnZpbmcgd2l0aG91dCBwdWJsaXNoaW5nCi0JCWlmIChraW5kID09IElTZXJ2ZXIuUFVCTElTSF9DTEVBTiB8fCBkZWx0YUtpbmQgPT0gU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuUkVNT1ZFRAotCQkJCXx8IHNlcnZlci5nZXRUb21jYXRTZXJ2ZXIoKS5pc1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkpIHsKLQkJCUZpbGUgZiA9IHBhdGgudG9GaWxlKCk7Ci0JCQlpZiAoZi5leGlzdHMoKSkgewotCQkJCUlTdGF0dXNbXSBzdGF0ID0gUHVibGlzaEhlbHBlci5kZWxldGVEaXJlY3RvcnkoZiwgbW9uaXRvcik7Ci0JCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJCX0KLQkJCQotCQkJaWYgKGRlbHRhS2luZCA9PSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5SRU1PVkVECi0JCQkJCXx8IHNlcnZlci5nZXRUb21jYXRTZXJ2ZXIoKS5pc1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoa2luZCA9PSBJU2VydmVyLlBVQkxJU0hfQ0xFQU4gfHwga2luZCA9PSBJU2VydmVyLlBVQkxJU0hfRlVMTCkgewotCQkJSU1vZHVsZVJlc291cmNlW10gbXIgPSBzZXJ2ZXIuZ2V0UmVzb3VyY2VzKG1vZHVsZSk7Ci0JCQlJU3RhdHVzW10gc3RhdCA9IGhlbHBlci5wdWJsaXNoRnVsbChtciwgcGF0aCwgbW9uaXRvcik7Ci0JCQlhZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGRlbHRhID0gc2VydmVyLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEobW9kdWxlKTsKLQkJCi0JCWludCBzaXplID0gZGVsdGEubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVN0YXR1c1tdIHN0YXQgPSBoZWxwZXIucHVibGlzaERlbHRhKGRlbHRhW2ldLCBwYXRoLCBtb25pdG9yKTsKLQkJCWFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHVibGlzaEphcihMaXN0IHN0YXR1cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHBhdGggPSBzZXJ2ZXIuZ2V0TW9kdWxlRGVwbG95RGlyZWN0b3J5KG1vZHVsZVswXSk7Ci0JCXBhdGggPSBwYXRoLmFwcGVuZCgiV0VCLUlORiIpLmFwcGVuZCgibGliIik7Ci0JCUlQYXRoIGphclBhdGggPSBwYXRoLmFwcGVuZChtb2R1bGVbMV0uZ2V0TmFtZSgpICsgIi5qYXIiKTsKLQkJCi0JCS8vIFJlbW92ZSBpZiByZXF1ZXN0ZWQgb3IgaWYgcHJldmlvdXNseSBwdWJsaXNoZWQgYW5kIGFyZSBub3cgc2VydmluZyB3aXRob3V0IHB1Ymxpc2hpbmcKLQkJaWYgKGtpbmQgPT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOIHx8IGRlbHRhS2luZCA9PSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5SRU1PVkVECi0JCQkJfHwgc2VydmVyLmdldFRvbWNhdFNlcnZlcigpLmlzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKSkgewotCQkJaWYgKGphclBhdGgudG9GaWxlKCkuZXhpc3RzKCkpCi0JCQkJamFyUGF0aC50b0ZpbGUoKS5kZWxldGUoKTsKLQkJCQotCQkJaWYgKGRlbHRhS2luZCA9PSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5SRU1PVkVECi0JCQkJCXx8IHNlcnZlci5nZXRUb21jYXRTZXJ2ZXIoKS5pc1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChraW5kICE9IElTZXJ2ZXIuUFVCTElTSF9DTEVBTiAmJiBraW5kICE9IElTZXJ2ZXIuUFVCTElTSF9GVUxMKSB7Ci0JCQkvLyBhdm9pZCBjaGFuZ2VzIGlmIG5vIGNoYW5nZXMgdG8gbW9kdWxlIHNpbmNlIGxhc3QgcHVibGlzaAotCQkJSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSA9IHNlcnZlci5nZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSk7Ci0JCQlpZiAoZGVsdGEgPT0gbnVsbCB8fCBkZWx0YS5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIG1ha2UgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QKLQkJaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpKQotCQkJcGF0aC50b0ZpbGUoKS5ta2RpcnMoKTsKLQkJCi0JCUlNb2R1bGVSZXNvdXJjZVtdIG1yID0gc2VydmVyLmdldFJlc291cmNlcyhtb2R1bGUpOwotCQlJU3RhdHVzW10gc3RhdCA9IGhlbHBlci5wdWJsaXNoWmlwKG1yLCBqYXJQYXRoLCBtb25pdG9yKTsKLQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byB0aHJvdyBhIENvcmVFeGNlcHRpb24gYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIGEgbGlzdCBvZgotCSAqIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzIGEgTGlzdCBjb250YWluaW5nIGVycm9yIGFuZCB3YXJuaW5nIElTdGF0dXMKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oTGlzdCBzdGF0dXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChzdGF0dXMuc2l6ZSgpID09IDEpIHsKLQkJCUlTdGF0dXMgc3RhdHVzMiA9IChJU3RhdHVzKSBzdGF0dXMuZ2V0KDApOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzMik7Ci0JCX0KLQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07Ci0JCXN0YXR1cy50b0FycmF5KGNoaWxkcmVuKTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lcnJvclB1Ymxpc2g7Ci0JCU11bHRpU3RhdHVzIHN0YXR1czIgPSBuZXcgTXVsdGlTdGF0dXMoVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgY2hpbGRyZW4sIG1lc3NhZ2UsIG51bGwpOwotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkQXJyYXlUb0xpc3QoTGlzdCBsaXN0LCBJU3RhdHVzW10gYSkgewotCQlpZiAobGlzdCA9PSBudWxsIHx8IGEgPT0gbnVsbCB8fCBhLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJaW50IHNpemUgPSBhLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQlsaXN0LmFkZChhW2ldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1B1Ymxpc2hUYXNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1B1Ymxpc2hUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiM2Q1NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9QdWJsaXNoVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaFRhc2tEZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIFB1Ymxpc2hUYXNrIGV4dGVuZHMgUHVibGlzaFRhc2tEZWxlZ2F0ZSB7Ci0JcHVibGljIFB1Ymxpc2hPcGVyYXRpb25bXSBnZXRUYXNrcyhJU2VydmVyIHNlcnZlciwgaW50IGtpbmQsIExpc3QgbW9kdWxlcywgTGlzdCBraW5kTGlzdCkgewotCQlpZiAobW9kdWxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlUb21jYXRTZXJ2ZXJCZWhhdmlvdXIgdG9tY2F0U2VydmVyID0gKFRvbWNhdFNlcnZlckJlaGF2aW91cikgc2VydmVyLmxvYWRBZGFwdGVyKFRvbWNhdFNlcnZlckJlaGF2aW91ci5jbGFzcywgbnVsbCk7Ci0JCWlmICghdG9tY2F0U2VydmVyLmdldFRvbWNhdFNlcnZlcigpLmlzVGVzdEVudmlyb25tZW50KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUxpc3QgdGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBzaXplID0gbW9kdWxlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJTW9kdWxlW10gbW9kdWxlID0gKElNb2R1bGVbXSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGtpbmRMaXN0LmdldChpKTsKLQkJCXRhc2tzLmFkZChuZXcgUHVibGlzaE9wZXJhdGlvbjIodG9tY2F0U2VydmVyLCBraW5kLCBtb2R1bGUsIGluLmludFZhbHVlKCkpKTsKLQkJfQotCQkKLQkJcmV0dXJuIChQdWJsaXNoT3BlcmF0aW9uW10pIHRhc2tzLnRvQXJyYXkobmV3IFB1Ymxpc2hPcGVyYXRpb25bdGFza3Muc2l6ZSgpXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0MzJDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDMyQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTA1MTA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0MzJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaEhlbHBlcjsKLS8qKgotICogVG9tY2F0IHYzLjIgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXQzMkNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBUb21jYXRDb25maWd1cmF0aW9uIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0hBTkRMRVIgPSAib3JnLmFwYWNoZS50b21jYXQuc2VydmljZS5odHRwLkh0dHBDb25uZWN0aW9uSGFuZGxlciI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBBQ0hFX0hBTkRMRVIgPSAib3JnLmFwYWNoZS50b21jYXQuc2VydmljZS5jb25uZWN0b3IuQWpwMTJDb25uZWN0aW9uSGFuZGxlciI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NMX1NPQ0tFVF9GQUNUT1JZID0gIm9yZy5hcGFjaGUudG9tY2F0Lm5ldC5TU0xTb2NrZXRGYWN0b3J5IjsKLQotCXByb3RlY3RlZCBTZXJ2ZXIgc2VydmVyOwotCXByb3RlY3RlZCBTZXJ2ZXJJbnN0YW5jZSBzZXJ2ZXJJbnN0YW5jZTsKLQlwcm90ZWN0ZWQgRmFjdG9yeSBzZXJ2ZXJGYWN0b3J5OwotCXByb3RlY3RlZCBib29sZWFuIGlzU2VydmVyRGlydHk7Ci0KLQlwcm90ZWN0ZWQgV2ViQXBwRG9jdW1lbnQgd2ViQXBwRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgdG9tY2F0VXNlcnNEb2N1bWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgcG9saWN5RmlsZTsKLQotCS8qKgotCSAqIFRvbWNhdDMyQ29uZmlndXJhdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKi8KLQlwdWJsaWMgVG9tY2F0MzJDb25maWd1cmF0aW9uKElGb2xkZXIgcGF0aCkgewotCQlzdXBlcihwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYWluIHNlcnZlciBwb3J0LgotCSAqIEByZXR1cm4gVG9tY2F0U2VydmVyUG9ydAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQb3J0IGdldE1haW5Qb3J0KCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlcnZlclBvcnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUG9ydCBwb3J0ID0gKFNlcnZlclBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChwb3J0LmdldE5hbWUoKS5lcXVhbHMoIkhUVFAgQ29ubmVjdG9yIikpCi0JCQkJcmV0dXJuIHBvcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlZml4IHRoYXQgaXMgdXNlZCBpbiBmcm9udCBvZiB0aGUKLQkgKiB3ZWIgbW9kdWxlIHBhdGggcHJvcGVydHkuIChlLmcuICJ3ZWJhcHBzIikKLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jQmFzZVByZWZpeCgpIHsKLQkJcmV0dXJuICJ3ZWJhcHBzLyI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWltZSBtYXBwaW5ncy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TWltZU1hcHBpbmdzKCkgewotCQlpZiAod2ViQXBwRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCQkKLQkJcmV0dXJuIHdlYkFwcERvY3VtZW50LmdldE1pbWVNYXBwaW5ncygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciBvYmplY3QgKHJvb3Qgb2Ygc2VydmVyLnhtbCkuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5pbnRlcm5hbC54bWwuc2VydmVyMzIuU2VydmVyCi0JICovCi0JcHVibGljIFNlcnZlciBnZXRTZXJ2ZXIoKSB7Ci0JCXJldHVybiBzZXJ2ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgU2VydmVyUG9ydHMgdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gdXNlcy4KLQkgKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2ZXJQb3J0cygpIHsKLQkJTGlzdCBwb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJdHJ5IHsKLQkJCUNvbm5lY3RvciBbXSBjb25uZWN0b3JzID0gc2VydmVySW5zdGFuY2UuZ2V0Q29ubmVjdG9ycygpOwotCQkJaWYgKGNvbm5lY3RvcnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29ubmVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gY29ubmVjdG9yc1tpXTsKLQkJCQkJaW50IHBhcmFtQ291bnQgPSBjb25uZWN0b3IuZ2V0UGFyYW1ldGVyQ291bnQoKTsKLQkJCQkJU3RyaW5nIGhhbmRsZXIgPSBudWxsOwotCQkJCQlTdHJpbmcgbmFtZSA9IE1lc3NhZ2VzLnBvcnRVbmtub3duOwotCQkJCQlTdHJpbmcgc29ja2V0RmFjdG9yeSA9IG51bGw7Ci0JCQkJCVN0cmluZyBwcm90b2NvbCA9ICJUQ1BJUCI7Ci0JCQkJCWJvb2xlYW4gYWR2YW5jZWQgPSB0cnVlOwotCQkJCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBudWxsOwotCQkJCQlpbnQgcG9ydCA9IC0xOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtQ291bnQ7IGorKykgewotCQkJCQkJUGFyYW1ldGVyIHAgPSBjb25uZWN0b3IuZ2V0UGFyYW1ldGVyKGopOwotCQkJCQkJaWYgKCJwb3J0Ii5lcXVhbHMocC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcG9ydCA9IEludGVnZXIucGFyc2VJbnQocC5nZXRWYWx1ZSgpKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKCJoYW5kbGVyIi5lcXVhbHMocC5nZXROYW1lKCkpKQotCQkJCQkJCWhhbmRsZXIgPSBwLmdldFZhbHVlKCk7Ci0JCQkJCQllbHNlIGlmICgic29ja2V0RmFjdG9yeSIuZXF1YWxzKHAuZ2V0TmFtZSgpKSkKLQkJCQkJCQlzb2NrZXRGYWN0b3J5ID0gcC5nZXRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChIVFRQX0hBTkRMRVIuZXF1YWxzKGhhbmRsZXIpKSB7Ci0JCQkJCQlwcm90b2NvbCA9ICJIVFRQIjsKLQkJCQkJCWNvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7ICJ3ZWIiLCAid2Vic2VydmljZXMiIH07Ci0JCQkJCQlpZiAoU1NMX1NPQ0tFVF9GQUNUT1JZLmVxdWFscyhzb2NrZXRGYWN0b3J5KSkgewotCQkJCQkJCXByb3RvY29sID0gIlNTTCI7Ci0JCQkJCQkJbmFtZSA9ICJTU0wgQ29ubmVjdG9yIjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbmFtZSA9ICJIVFRQIENvbm5lY3RvciI7Ci0JCQkJCQkJYWR2YW5jZWQgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChBUEFDSEVfSEFORExFUi5lcXVhbHMoaGFuZGxlcikpCi0JCQkJCQluYW1lID0gIkFwYWNoZSBDb25uZWN0b3IiOwotCQkJCQlpZiAoaGFuZGxlciAhPSBudWxsKQotCQkJCQkJcG9ydHMuYWRkKG5ldyBTZXJ2ZXJQb3J0KGkgKyAiIiwgbmFtZSwgcG9ydCwgcHJvdG9jb2wsIGNvbnRlbnRUeXBlcywgYWR2YW5jZWQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIHNlcnZlciBwb3J0cyIsIGUpOwotCQl9Ci0JCi0JCXJldHVybiBwb3J0czsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9tY2F0LXVzZXJzLnhtbCBkb2N1bWVudC4KLQkgKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0VG9tY2F0VXNlcnNEb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRvbWNhdFVzZXJzRG9jdW1lbnQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdlYiBtb2R1bGVzIGluIHRoaXMgc2VydmVyLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJNb2R1bGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCXRyeSB7Ci0JCQlDb250ZXh0IFtdIGNvbnRleHRzID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dHMoKTsKLQkJCWlmIChjb250ZXh0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJCQlDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0c1tpXTsKLQkJCQkJU3RyaW5nIHJlbG9hZCA9IGNvbnRleHQuZ2V0UmVsb2FkYWJsZSgpOwotCQkJCQlpZiAocmVsb2FkID09IG51bGwpCi0JCQkJCQlyZWxvYWQgPSAiZmFsc2UiOwotCQkJCQlXZWJNb2R1bGUgbW9kdWxlID0gbmV3IFdlYk1vZHVsZShjb250ZXh0LmdldFBhdGgoKSwgCi0JCQkJCQljb250ZXh0LmdldERvY0Jhc2UoKSwgY29udGV4dC5nZXRTb3VyY2UoKSwKLQkJCQkJCXJlbG9hZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgPyB0cnVlIDogZmFsc2UpOwotCQkJCQlsaXN0LmFkZChtb2R1bGUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgcHJvamVjdCByZWZzIiwgZSk7Ci0JCX0KLQkKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNnZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KElQYXRoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KElQYXRoIGJhc2VQYXRoKSB7Ci0JCXJldHVybiBzZXJ2ZXJJbnN0YW5jZS5nZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KGJhc2VQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoSVBhdGgsIElUb21jYXRXZWJNb2R1bGUpCi0JICovCi0JcHVibGljIElQYXRoIGdldENvbnRleHRXb3JrRGlyZWN0b3J5KElQYXRoIGJhc2VQYXRoLCBJVG9tY2F0V2ViTW9kdWxlIG1vZHVsZSkgewotCQlDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0KG1vZHVsZS5nZXRQYXRoKCkpOwotCQlpZiAoY29udGV4dCAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlckluc3RhbmNlLmdldENvbnRleHRXb3JrRGlyZWN0b3J5KGJhc2VQYXRoLCBjb250ZXh0KTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2FkKElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5sb2FkaW5nVGFzaywgNSk7Ci0JCi0JCQkvLyBjaGVjayBmb3IgdG9tY2F0LnBvbGljeSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgdjMuMiBjb25maWcKLQkJCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgidG9tY2F0LnBvbGljeSIpLnRvRmlsZSgpKTsKLQkJCWluLnJlYWQoKTsKLQkJCWluLmNsb3NlKCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJLy8gY3JlYXRlIHNlcnZlci54bWwKLQkJCXNlcnZlckZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJc2VydmVyRmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyMzIiKTsKLQkJCXNlcnZlciA9IChTZXJ2ZXIpIHNlcnZlckZhY3RvcnkubG9hZERvY3VtZW50KG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b0ZpbGUoKSkpOwotCQkJc2VydmVySW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2Uoc2VydmVyKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJd2ViQXBwRG9jdW1lbnQgPSBuZXcgV2ViQXBwRG9jdW1lbnQocGF0aC5hcHBlbmQoIndlYi54bWwiKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJdG9tY2F0VXNlcnNEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInRvbWNhdC11c2Vycy54bWwiKS50b0ZpbGUoKSkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJLy8gbG9hZCBwb2xpY3kgZmlsZQotCQkJcG9saWN5RmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInRvbWNhdC5wb2xpY3kiKS50b0ZpbGUoKSkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbG9hZCBUb21jYXQgdjMuMiBjb25maWd1cmF0aW9uIGZyb20gIiArIHBhdGgudG9PU1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBwYXRoLnRvT1NTdHJpbmcoKSksIGUpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jaW1wb3J0RnJvbVBhdGgoSVBhdGgsIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0RnJvbVBhdGgoSVBhdGggcGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlsb2FkKHBhdGgsIG1vbml0b3IpOwotCQkKLQkJLy8gZm9yIHRlc3QgZW52aXJvbm1lbnQsIHJlbW92ZSBleGlzdGluZyBjb250ZXh0cyBzaW5jZSBhbiBpbnN0YW5jZQotCQkvLyBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gc2VydmVyLnhtbCB3aWxsIGJlIHVzZWQKLQkJaWYgKGlzVGVzdEVudikgewotCQkJd2hpbGUgKHNlcnZlckluc3RhbmNlLnJlbW92ZUNvbnRleHQoMCkpIHsKLQkJCQkvLyBuby1vcAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvYWQoSUZvbGRlciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmxvYWRpbmdUYXNrLCA4MDApOwotCQotCQkJLy8gY2hlY2sgZm9yIHRvbWNhdC5wb2xpY3kgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBhIHYzLjIgY29uZmlnCi0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoInRvbWNhdC5wb2xpY3kiKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBudWxsKSk7Ci0JCi0JCQkvLyBsb2FkIHNlcnZlci54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCXNlcnZlckZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjMyIik7Ci0JCQlzZXJ2ZXIgPSAoU2VydmVyKSBzZXJ2ZXJGYWN0b3J5LmxvYWREb2N1bWVudChpbik7Ci0JCQlzZXJ2ZXJJbnN0YW5jZSA9IG5ldyBTZXJ2ZXJJbnN0YW5jZShzZXJ2ZXIpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgd2ViLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIik7Ci0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChmaWxlKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIHRvbWNhdC11c2Vycy54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkKLQkJCXRvbWNhdFVzZXJzRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgdG9tY2F0LnBvbGljeQotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ0b21jYXQucG9saWN5Iik7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXBvbGljeUZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhpbik7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNhbmNlbGxlZCIpOwotCQotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbG9hZCBUb21jYXQgdjMuMiBjb25maWd1cmF0aW9uIGZyb206ICIgKyBmb2xkZXIuZ2V0RnVsbFBhdGgoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgdGhlIGluZm9ybWF0aW9uIGhlbGQgYnkgdGhpcyBvYmplY3QgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKiBAcGFyYW0gZm9yY2VEaXJ0eSBpZiB0cnVlLCB0aGUgZmlsZXMgd2lsbCBiZSBzYXZlZCwgcmVnYXJkbGVzcwotCSAqICBvZiB3aGV0aGVyIHRoZXkgaGF2ZSBiZWVuIG1vZGlmaWVkCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShJUGF0aCBwYXRoLCBib29sZWFuIGZvcmNlRGlydHksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuc2F2aW5nVGFzaywgNSk7Ci0JCQkKLQkJCS8vIG1ha2Ugc3VyZSBkaXJlY3RvcnkgZXhpc3RzCi0JCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQlmb3JjZURpcnR5ID0gdHJ1ZTsKLQkJCQlwYXRoLnRvRmlsZSgpLm1rZGlyKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJLy8gc2F2ZSBmaWxlcwotCQkJaWYgKGZvcmNlRGlydHkgfHwgaXNTZXJ2ZXJEaXJ0eSkKLQkJCQlzZXJ2ZXJGYWN0b3J5LnNhdmUocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b09TU3RyaW5nKCkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCXdlYkFwcERvY3VtZW50LnNhdmUocGF0aC5hcHBlbmQoIndlYi54bWwiKS50b09TU3RyaW5nKCksIGZvcmNlRGlydHkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChmb3JjZURpcnR5KQotCQkJCVhNTFV0aWwuc2F2ZShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvT1NTdHJpbmcoKSwgdG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKGZvcmNlRGlydHkpIHsKLQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihwYXRoLmFwcGVuZCgidG9tY2F0LnBvbGljeSIpLnRvRmlsZSgpKSk7Ci0JCQkJYncud3JpdGUocG9saWN5RmlsZSk7Ci0JCQkJYncuY2xvc2UoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJaXNTZXJ2ZXJEaXJ0eSA9IGZhbHNlOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjMuMiBjb25maWd1cmF0aW9uIHRvICIgKyBwYXRoLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIGluZm9ybWF0aW9uIGhlbGQgYnkgdGhpcyBvYmplY3QgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiBBbGwgZmlsZXMgYXJlIGZvcmNlZCB0byBiZSBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBkZXNpbmF0aW9uIHBhdGggZm9yIHRoZSBmaWxlcwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNhdmUocGF0aCwgdHJ1ZSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgaW5mb3JtYXRpb24gaGVsZCBieSB0aGlzIG9iamVjdCB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBmb2xkZXIgYSBmb2xkZXIKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIDkwMCk7Ci0JCQkKLQkJCWlmICghZm9sZGVyLmV4aXN0cygpKQotCQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwKSk7Ci0JCQllbHNlCi0JCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCQotCQkJLy8gc2F2ZSBzZXJ2ZXIueG1sCi0JCQlieXRlW10gZGF0YSA9IHNlcnZlckZhY3RvcnkuZ2V0Q29udGVudHMoKTsKLQkJCUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOwotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJzZXJ2ZXIueG1sIik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCWlmIChpc1NlcnZlckRpcnR5KQotCQkJCQlmaWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQllbHNlCi0JCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQl9IGVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gZmFsc2U7Ci0JCQkKLQkJCS8vIHNhdmUgd2ViLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIik7Ci0JCQl3ZWJBcHBEb2N1bWVudC5zYXZlKGZpbGUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCi0JCQkvLyBzYXZlIHRvbWNhdC11c2Vycy54bWwKLQkJCWRhdGEgPSBYTUxVdGlsLmdldENvbnRlbnRzKHRvbWNhdFVzZXJzRG9jdW1lbnQpOwotCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInRvbWNhdC11c2Vycy54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgdG9tY2F0LnBvbGljeQotCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocG9saWN5RmlsZS5nZXRCeXRlcygpKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LnBvbGljeSIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgVG9tY2F0IHYzLjIgY29uZmlndXJhdGlvbiB0byAiICsgZm9sZGVyLmdldEZ1bGxQYXRoKCksIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZUNvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I2FkZE1pbWVNYXBwaW5nKGludCwgSU1pbWVNYXBwaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewotCQl3ZWJBcHBEb2N1bWVudC5hZGRNaW1lTWFwcGluZyhpbmRleCwgbWFwKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoQUREX01BUFBJTkdfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkV2ViTW9kdWxlKGludCwgSVRvbWNhdFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRXZWJNb2R1bGUoaW50IGluZGV4LCBJVG9tY2F0V2ViTW9kdWxlIG1vZHVsZSkgewotCQl0cnkgewotCQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuY3JlYXRlQ29udGV4dChpbmRleCk7Ci0KLQkJCWNvbnRleHQuc2V0UGF0aChtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJCWNvbnRleHQuc2V0RG9jQmFzZShtb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCkpOwotCQkJY29udGV4dC5zZXRSZWxvYWRhYmxlKG1vZHVsZS5pc1JlbG9hZGFibGUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJaWYgKG1vZHVsZS5nZXRNZW1lbnRvKCkgIT0gbnVsbCAmJiBtb2R1bGUuZ2V0TWVtZW50bygpLmxlbmd0aCgpID4gMCkKLQkJCQljb250ZXh0LnNldFNvdXJjZShtb2R1bGUuZ2V0TWVtZW50bygpKTsKLQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoQUREX1dFQl9NT0RVTEVfUFJPUEVSVFksIG51bGwsIG1vZHVsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBhZGRpbmcgd2ViIG1vZHVsZSIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9jYWxpemUgdGhlIHdlYiBwcm9qZWN0cyBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gYmFzZURpciBydW50aW1lIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyCi0JICogQHBhcmFtIGRlcGxveURpciBkZXBsb3ltZW50IGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBzZXJ2ZXIyIGEgc2VydmVyIHR5cGUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBsb2NhbGl6ZUNvbmZpZ3VyYXRpb24oSVBhdGggYmFzZURpciwgSVBhdGggZGVwbG95RGlyLCBUb21jYXRTZXJ2ZXIgc2VydmVyMiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy51cGRhdGluZ0NvbmZpZ3VyYXRpb25UYXNrLCAxMDApOwotCQkJSVBhdGggY29uZkRpciA9IGJhc2VEaXIuYXBwZW5kKCJjb25mIik7Ci0JCQkKLQkJCVRvbWNhdDMyQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgVG9tY2F0MzJDb25maWd1cmF0aW9uKG51bGwpOwotCQkJY29uZmlnLmxvYWQoY29uZkRpciwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMzAwKSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkKLQkJCWlmIChzZXJ2ZXIyLmlzVGVzdEVudmlyb25tZW50KCkpIHsKLQkJCQljb25maWcuc2VydmVyLmdldENvbnRleHRNYW5hZ2VyKCkuc2V0SG9tZShiYXNlRGlyLnRvT1NTdHJpbmcoKSk7Ci0JCQkJY29uZmlnLmlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJfQotCi0JCQkvLyBPbmx5IGFkZCByb290IG1vZHVsZSBpZiBydW5uaW5nIGluIGEgdGVzdCBlbnYgKGkuZS4gbm90IG9uIHRoZSBpbnN0YWxsYXRpb24pCi0JCQlib29sZWFuIGFkZFJvb3RXZWJhcHAgPSBzZXJ2ZXIyLmlzVGVzdEVudmlyb25tZW50KCk7Ci0JCQkKLQkJCS8vIElmIG5vdCBkZXBsb3lpbmcgdG8gIndlYmFwcHMiLCBjb250ZXh0IGRvY0Jhc2UgYXR0cmlidXRlcyBuZWVkIHVwZGF0aW5nCi0JCQlib29sZWFuIGRlcGxveWluZ1RvV2ViYXBwcyA9ICJ3ZWJhcHBzIi5lcXVhbHMoc2VydmVyMi5nZXREZXBsb3lEaXJlY3RvcnkoKSk7Ci0JCQkKLQkJCU1hcCBwYXRoTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQotCQkJTXVsdGlTdGF0dXMgbXMgPSBuZXcgTXVsdGlTdGF0dXMoVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgCi0JCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaFNlcnZlciwgc2VydmVyMi5nZXRTZXJ2ZXIoKS5nZXROYW1lKCkpLCBudWxsKTsKLQkJCUNvbnRleHQgW10gY29udGV4dHMgPSBjb25maWcuc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dHMoKTsKLQkJCWlmIChjb250ZXh0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJCQlDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0c1tpXTsKLQotCQkJCQkvLyBOb3JtYWxpemUgcGF0aCBhbmQgY2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJCQkJU3RyaW5nIHBhdGggPSBjb250ZXh0LmdldFBhdGgoKTsKLQkJCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQkJLy8gU2F2ZSBhIGNvcHkgb2Ygb3JpZ2luYWwgaW4gY2FzZSBpdCdzICIvIgotCQkJCQkJU3RyaW5nIG9yaWdQYXRoID0gcGF0aDsKLQkJCQkJCS8vIE5vcm1hbGl6ZSAiLyIgdG8gIiIKLQkJCQkJCWlmICgiLyIuZXF1YWxzKHBhdGgpKSB7Ci0JCQkJCQkJaWYgKFRyYWNlLmlzVHJhY2VFbmFibGVkKCkpCi0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQ29udGV4dCBwYXRoIGlzIGJlaW5nIGNoYW5nZWQgZnJvbSBcIi9cIiB0byBcIlwiLiIpOwotCQkJCQkJCXBhdGggPSAiIjsKLQkJCQkJCQljb250ZXh0LnNldFBhdGgocGF0aCk7Ci0JCQkJCQkJY29uZmlnLmlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCQkJfQotCi0JCQkJCQkvLyBDb250ZXh0IHBhdGhzIHRoYXQgYXJlIHRoZSBzYW1lIG9yIGRpZmZlciBvbmx5IGluIGNhc2UgYXJlIG5vdCBhbGxvd2VkCi0JCQkJCQlTdHJpbmcgbGNQYXRoID0gcGF0aC50b0xvd2VyQ2FzZSgpOwotCQkJCQkJaWYgKCFwYXRoTWFwLmNvbnRhaW5zS2V5KGxjUGF0aCkpIHsKLQkJCQkJCQlwYXRoTWFwLnB1dChsY1BhdGgsIG9yaWdQYXRoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCVN0cmluZyBvdGhlclBhdGggPSAoU3RyaW5nKXBhdGhNYXAuZ2V0KGxjUGF0aCk7Ci0JCQkJCQkJSVN0YXR1cyBzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQkJb3JpZ1BhdGguZXF1YWxzKG90aGVyUGF0aCkgPyBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hQYXRoRHVwLCBvcmlnUGF0aCkgCi0JCQkJCQkJCQkJCTogTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoUGF0aENvbmZsaWN0LCBvcmlnUGF0aCwgb3RoZXJQYXRoKSk7Ci0JCQkJCQkJbXMuYWRkKHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSVN0YXR1cyBzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQlNZXNzYWdlcy5lcnJvclB1Ymxpc2hQYXRoTWlzc2luZyk7Ci0JCQkJCQltcy5hZGQocyk7Ci0JCQkJCX0KLQotCQkJCQkvLyBJZiBkZWZhdWx0IHdlYmFwcCBoYXMgbm90IGJlZW4gZm91bmQsIGNoZWNrIHRoaXMgb25lCi0JCQkJCS8vIFRPRE8gTmVlZCB0byBhZGQgYSByb290IGNvbnRleHQgaWYgZGVwbG95aW5nIHRvIHdlYmFwcHMgYnV0IHdpdGggYXV0by1kZXBsb3kgb2ZmCi0JCQkJCWlmIChhZGRSb290V2ViYXBwICYmICIiLmVxdWFscyhjb250ZXh0LmdldFBhdGgoKSkpIHsKLQkJCQkJCS8vIEEgZGVmYXVsdCB3ZWJhcHAgaXMgYmVpbmcgZGVwbG95ZWQsIGRvbid0IGFkZCBvbmUKLQkJCQkJCWFkZFJvb3RXZWJhcHAgPSBmYWxzZTsKLQkJCQkJfQotCi0JCQkJCS8vIElmIG5vdCBkZXBsb3lpbmcgdG8gIndlYmFwcHMiLCBjb252ZXJ0IHRvIGFic29sdXRlIHBhdGggdW5kZXIgZGVwbG95IGRpcgotCQkJCQlpZiAoIWRlcGxveWluZ1RvV2ViYXBwcykgewotCQkJCQkJU3RyaW5nIHNvdXJjZSA9IGNvbnRleHQuZ2V0U291cmNlKCk7Ci0JCQkJCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCApCXsKLQkJCQkJCQlTdHJpbmcgbmFtZSA9IGNvbnRleHQuZ2V0RG9jQmFzZSgpOwotCQkJCQkJCS8vIFVwZGF0ZSBkb2NCYXNlIG9ubHkgaWYgbmFtZSBiZWdpbnMgd2l0aCB0aGUgZXhwZWN0ZWQgcHJlZml4Ci0JCQkJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChnZXREb2NCYXNlUHJlZml4KCkpKSB7Ci0JCQkJCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZyhnZXREb2NCYXNlUHJlZml4KCkubGVuZ3RoKCkpOwotCQkJCQkJCQljb250ZXh0LnNldERvY0Jhc2UoZGVwbG95RGlyLmFwcGVuZChuYW1lKS50b09TU3RyaW5nKCkpOwotCQkJCQkJCQljb25maWcuaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gSWYgZXJyb3JzIGFyZSBwcmVzZW50LCByZXR1cm4gc3RhdHVzCi0JCQlpZiAoIW1zLmlzT0soKSkKLQkJCQlyZXR1cm4gbXM7Ci0KLQkJCWlmIChhZGRSb290V2ViYXBwKSB7Ci0JCQkJLy8gQWRkIGEgY29udGV4dCBmb3IgdGhlIGRlZmF1bHQgd2ViYXBwCi0JCQkJQ29udGV4dCByb290Q29udGV4dCA9IGNvbmZpZy5zZXJ2ZXJJbnN0YW5jZS5jcmVhdGVDb250ZXh0KDApOwotCQkJCXJvb3RDb250ZXh0LnNldFBhdGgoIiIpOwotCQkJCXJvb3RDb250ZXh0LnNldERvY0Jhc2UoZGVwbG95RGlyLmFwcGVuZCgiUk9PVCIpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJcm9vdENvbnRleHQuc2V0UmVsb2FkYWJsZSgiZmFsc2UiKTsKLQkJCQljb25maWcuaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCi0JCQljb25maWcuc2F2ZShjb25mRGlyLCBmYWxzZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMzApKTsKLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGxvY2FsaXppbmcgY29uZmlndXJhdGlvbiIsIGUpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIENoYW5nZSB0aGUgZXh0ZW5zaW9uIG9mIGEgbWltZSBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBtYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQubW9kaWZ5TWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCQotCS8qKgotCSAqIE1vZGlmeSB0aGUgcG9ydCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBvcnQgaW50Ci0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5U2VydmVyUG9ydChTdHJpbmcgaWQsIGludCBwb3J0KSB7Ci0JCXRyeSB7Ci0JCQlpbnQgY29uID0gSW50ZWdlci5wYXJzZUludChpZCk7Ci0JCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmVySW5zdGFuY2UuZ2V0Q29ubmVjdG9yKGNvbik7Ci0JCi0JCQlpbnQgc2l6ZSA9IGNvbm5lY3Rvci5nZXRQYXJhbWV0ZXJDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlQYXJhbWV0ZXIgcCA9IGNvbm5lY3Rvci5nZXRQYXJhbWV0ZXIoaSk7Ci0JCQkJaWYgKCJwb3J0Ii5lcXVhbHMocC5nZXROYW1lKCkpKSB7Ci0JCQkJCXAuc2V0VmFsdWUocG9ydCArICIiKTsKLQkJCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbW9kaWZ5aW5nIHNlcnZlciBwb3J0ICIgKyBpZCwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hhbmdlIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICogQHBhcmFtIGRvY0Jhc2UgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXRoIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmVsb2FkYWJsZSBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5V2ViTW9kdWxlKGludCBpbmRleCwgU3RyaW5nIGRvY0Jhc2UsIFN0cmluZyBwYXRoLCBib29sZWFuIHJlbG9hZGFibGUpIHsKLQkJdHJ5IHsKLQkJCUNvbnRleHQgY29udGV4dCA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHQoaW5kZXgpOwotCQkJY29udGV4dC5zZXRQYXRoKHBhdGgpOwotCQkJY29udGV4dC5zZXREb2NCYXNlKGRvY0Jhc2UpOwotCQkJY29udGV4dC5zZXRSZWxvYWRhYmxlKHJlbG9hZGFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUocGF0aCwgZG9jQmFzZSwgbnVsbCwgcmVsb2FkYWJsZSk7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfV0VCX01PRFVMRV9QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtb2R1bGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbW9kaWZ5aW5nIHdlYiBtb2R1bGUgIiArIGluZGV4LCBlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIGEgbWltZSBtYXBwaW5nLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNaW1lTWFwcGluZyhpbnQgaW5kZXgpIHsKLQkJd2ViQXBwRG9jdW1lbnQucmVtb3ZlTWltZU1hcHBpbmcoaW5kZXgpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChSRU1PVkVfTUFQUElOR19QUk9QRVJUWSwgbnVsbCwgbmV3IEludGVnZXIoaW5kZXgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyBhIHdlYiBtb2R1bGUuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVdlYk1vZHVsZShpbnQgaW5kZXgpIHsKLQkJdHJ5IHsKLQkJCXNlcnZlckluc3RhbmNlLnJlbW92ZUNvbnRleHQoaW5kZXgpOwotCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChSRU1PVkVfV0VCX01PRFVMRV9QUk9QRVJUWSwgbnVsbCwgbmV3IEludGVnZXIoaW5kZXgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlbW92aW5nIHdlYiBtb2R1bGUgIiArIGluZGV4LCBlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGNsZWFudXBTZXJ2ZXIoSVBhdGggY29uZkRpciwgSVBhdGggaW5zdGFsbERpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCU11bHRpU3RhdHVzIG1zID0gbmV3IE11bHRpU3RhdHVzKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmNsZWFudXBTZXJ2ZXJUYXNrLCBudWxsKTsKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5jbGVhbnVwU2VydmVyVGFzaywgMjAwKTsKLQotCQl0cnkgewotCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmRldGVjdGluZ1JlbW92ZWRQcm9qZWN0cyk7Ci0KLQkJCS8vIFRyeSB0byByZWFkIG9sZCBzZXJ2ZXIgY29uZmlndXJhdGlvbgotCQkJRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCWZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjMyIik7Ci0JCQlGaWxlIHNlcnZlckZpbGUgPSBjb25mRGlyLmFwcGVuZCgiY29uZiIpLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvRmlsZSgpOwotCQkJaWYgKHNlcnZlckZpbGUuZXhpc3RzKCkpIHsKLQkJCQlTZXJ2ZXIgb2xkU2VydmVyID0gKFNlcnZlcikgZmFjdG9yeS5sb2FkRG9jdW1lbnQobmV3IEZpbGVJbnB1dFN0cmVhbShzZXJ2ZXJGaWxlKSk7Ci0JCQkJU2VydmVySW5zdGFuY2Ugb2xkSW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2Uob2xkU2VydmVyKTsKLQkJCQkKLQkJCQkvLyBDb2xsZWN0IHBhdGhzIG9mIG9sZCB3ZWIgbW9kdWxlcyBtYW5hZ2VkIGJ5IFdUUAotCQkJCVNldCBvbGRQYXRocyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJQ29udGV4dCBbXSBjb250ZXh0cyA9IG9sZEluc3RhbmNlLmdldENvbnRleHRzKCk7Ci0JCQkJaWYgKGNvbnRleHRzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJU3RyaW5nIHNvdXJjZSA9IGNvbnRleHRzW2ldLmdldFNvdXJjZSgpOwotCQkJCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5sZW5ndGgoKSA+IDAgKQl7Ci0JCQkJCQkJb2xkUGF0aHMuYWRkKGNvbnRleHRzW2ldLmdldFBhdGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBSZW1vdmUgcGF0aHMgZm9yIHdlYiBtb2R1bGVzIHRoYXQgYXJlIHN0YXlpbmcgYXJvdW5kCi0JCQkJTGlzdCBtb2R1bGVzID0gZ2V0V2ViTW9kdWxlcygpOwotCQkJCWludCBzaXplID0gbW9kdWxlcy5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJV2ViTW9kdWxlIG1vZHVsZSA9IChXZWJNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJCQlvbGRQYXRocy5yZW1vdmUobW9kdWxlLmdldFBhdGgoKSk7Ci0JCQkJfQotCQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0KLQkJCQkvLyBEZWxldGUgd29yayBkaXJlY3RvcmllcyBmb3IgbWFuYWdlZCB3ZWIgbW9kdWxlcyB0aGF0IGhhdmUgZ29uZSBhd2F5Ci0JCQkJaWYgKG9sZFBhdGhzLnNpemUoKSA+IDAgKSB7Ci0JCQkJCUlQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMCk7Ci0JCQkJCXN1Yk1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmRlbGV0aW5nQ29udGV4dEZpbGVzVGFzaywgb2xkUGF0aHMuc2l6ZSgpICogMTAwKTsKLQkJCQkJCi0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBvbGRQYXRocy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCVN0cmluZyBvbGRQYXRoID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJCQkJCQotCQkJCQkJLy8gRGVsZXRlIHdvcmsgZGlyZWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVtb3ZlZCBjb250ZXh0IGlmIGl0IGlzIHdpdGhpbiBjb25mRGlyLgotCQkJCQkJLy8gSWYgaXQgaXMgb3V0c2lkZSBvZiBjb25mRGlyLCBhc3N1bWUgdXNlciBpcyBnb2luZyB0byBtYW5hZ2UgaXQuCi0JCQkJCQlDb250ZXh0IGN0eCA9IG9sZEluc3RhbmNlLmdldENvbnRleHQob2xkUGF0aCk7Ci0JCQkJCQlJUGF0aCBjdHhXb3JrUGF0aCA9IG9sZEluc3RhbmNlLmdldENvbnRleHRXb3JrRGlyZWN0b3J5KGNvbmZEaXIsIGN0eCk7Ci0JCQkJCQlpZiAoY29uZkRpci5pc1ByZWZpeE9mKGN0eFdvcmtQYXRoKSkgewotCQkJCQkJCUZpbGUgY3R4V29ya0RpciA9IGN0eFdvcmtQYXRoLnRvRmlsZSgpOwotCQkJCQkJCWlmIChjdHhXb3JrRGlyLmV4aXN0cygpICYmIGN0eFdvcmtEaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJCQlJU3RhdHVzIFtdIHJlc3VsdHMgPSBQdWJsaXNoSGVscGVyLmRlbGV0ZURpcmVjdG9yeShjdHhXb3JrRGlyLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDApKTsKLQkJCQkJCQkJaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkgewotCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGRlbGV0ZSB3b3JrIGRpcmVjdG9yeSAiICsgY3R4V29ya0Rpci5nZXRQYXRoKCkgKyAiIGZvciByZW1vdmVkIGNvbnRleHQgIiArIG9sZFBhdGgpOwotCQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJbXMuYWRkKHJlc3VsdHNbaV0pOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQltb25pdG9yLndvcmtlZCgxMDApOwotCQkJCQl9Ci0JCQkJCXN1Yk1vbml0b3IuZG9uZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gRWxzZSBubyBzZXJ2ZXIueG1sLiAgQXNzdW1lIGZpcnN0IHB1Ymxpc2ggdG8gbmV3IHRlbXAgZGlyZWN0b3J5Ci0JCQllbHNlIHsKLQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJfQotCQkJaWYgKFRyYWNlLmlzVHJhY2VFbmFibGVkKCkpCi0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJTZXJ2ZXIgY2xlYW5lZCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNsZWFudXAgc2VydmVyIGF0ICIgKyBjb25mRGlyLnRvT1NTdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQltcy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckNsZWFudXBTZXJ2ZXIsIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQl9Ci0JCQotCQltb25pdG9yLmRvbmUoKTsKLQkJcmV0dXJuIG1zOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0MzJIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDMySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmY3NDlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0MzJIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLS8qKgotICogVG9tY2F0IDMyIGhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXQzMkhhbmRsZXIgaW1wbGVtZW50cyBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgewotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ZlcmlmeUluc3RhbGxQYXRoKElQYXRoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZlcmlmeUluc3RhbGxQYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCXJldHVybiBUb21jYXRQbHVnaW4udmVyaWZ5SW5zdGFsbFBhdGgoaW5zdGFsbFBhdGgsIFRvbWNhdFBsdWdpbi5UT01DQVRfMzIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5hcGFjaGUudG9tY2F0LnN0YXJ0dXAuVG9tY2F0IjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJTGlzdCBjcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gYWRkIGFsbCBqYXJzIGZyb20gdGhlIFRvbWNhdCBsaWIgZGlyZWN0b3J5Ci0JCUZpbGUgbGliRGlyID0gaW5zdGFsbFBhdGguYXBwZW5kKCJsaWIiKS50b0ZpbGUoKTsKLQkJaWYgKGxpYkRpci5leGlzdHMoKSkgewotCQkJU3RyaW5nW10gbGlicyA9IGxpYkRpci5saXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobGlic1tpXS5lbmRzV2l0aCgiamFyIikpIHsKLQkJCQkJSVBhdGggcGF0aCA9IGluc3RhbGxQYXRoLmFwcGVuZCgibGliIikuYXBwZW5kKGxpYnNbaV0pOwotCQkJCQljcC5hZGQoSmF2YVJ1bnRpbWUubmV3QXJjaGl2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShwYXRoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElQYXRoLCBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhJUGF0aCBjb25maWdQYXRoLCBib29sZWFuIGRlYnVnLCBib29sZWFuIHN0YXJ0aW5nKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGNvbmZpZ1BhdGggIT0gbnVsbCkgewotCQkJbGlzdC5hZGQoIi1mIFwiIiArIGNvbmZpZ1BhdGguYXBwZW5kKCJjb25mIikuYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCX0KLQkJCi0JCWlmICghc3RhcnRpbmcpCi0JCQlsaXN0LmFkZCgiLXN0b3AiKTsKLQkJCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoYm9vbGVhbiBkZWJ1ZywgYm9vbGVhbiBzdGFydGluZykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVZNQXJndW1lbnRzKElQYXRoLCBJUGF0aCwgSVBhdGgsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVWTUFyZ3VtZW50cyhJUGF0aCBpbnN0YWxsUGF0aCwgSVBhdGggY29uZmlnUGF0aCwgSVBhdGggZGVwbG95UGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZCgiLUR0b21jYXQuaG9tZT1cIiIgKyBpbnN0YWxsUGF0aC50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJLy8gSW5jbHVkZSBhIHN5c3RlbSBwcm9wZXJ0eSBmb3IgdGhlIGNvbmZpZ3VyYWJsZSBkZXBsb3kgbG9jYXRpb24KLQkJbGlzdC5hZGQoIi1Ed3RwLmRlcGxveT1cIiIgKyBkZXBsb3lQYXRoLnRvT1NTdHJpbmcoKSArICJcIiIpOwotCQkKLQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocyk7Ci0JCXJldHVybiBzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVQb2xpY3lGaWxlKElQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZVBvbGljeUZpbGUoSVBhdGggY29uZmlnUGF0aCkgewotCQlyZXR1cm4gY29uZmlnUGF0aC5hcHBlbmQoImNvbmYiKS5hcHBlbmQoInRvbWNhdC5wb2xpY3kiKS50b09TU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjY2FuQWRkTW9kdWxlKElNb2R1bGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuQWRkTW9kdWxlKElNb2R1bGUgbW9kdWxlKSB7Ci0JCWlmICgiMi4yIi5lcXVhbHMobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRWZXJzaW9uKCkpKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclNwZWMzMiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeShUb21jYXRTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmdldFN0YW5kYXJkQmFzZURpcmVjdG9yeShzZXJ2ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVSdW50aW1lRGlyZWN0b3J5KElQYXRoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByZXBhcmVSdW50aW1lRGlyZWN0b3J5KElQYXRoIGNvbmZEaXIpIHsKLQkJaWYgKFRyYWNlLmlzVHJhY2VFbmFibGVkKCkpCi0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIlByZXBhcmluZyBydW50aW1lIGRpcmVjdG9yeSIpOwotCQkvLyBQcmVwYXJlIGluc3RhbmNlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGhhdCBpcyByZWxhdGl2ZSB0byBzZXJ2ZXIueG1sCi0JCUZpbGUgdGVtcCA9IGNvbmZEaXIuYXBwZW5kKCJjb25mIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0JCXRlbXAgPSBjb25mRGlyLmFwcGVuZCgid2ViYXBwcyIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCQl0ZW1wID0gY29uZkRpci5hcHBlbmQoIndvcmsiKS50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJdGVtcC5ta2RpcnMoKTsKLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsJCQotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVEZXBsb3lEaXJlY3RvcnkoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlcGFyZURlcGxveURpcmVjdG9yeShJUGF0aCBkZXBsb3lQYXRoKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmNyZWF0ZURlcGxveW1lbnREaXJlY3RvcnkoZGVwbG95UGF0aCwKLQkJCQlUb21jYXRWZXJzaW9uSGVscGVyLkRFRkFVTFRfV0VCWE1MX1NFUlZMRVQyMik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVGb3JTZXJ2aW5nRGlyZWN0bHkoSVBhdGgsIFRvbWNhdFNlcnZlcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcmVwYXJlRm9yU2VydmluZ0RpcmVjdGx5KElQYXRoIGJhc2VEaXIsIFRvbWNhdFNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlci5pc1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck5vUHVibGlzaE5vdFN1cHBvcnRlZCwgbnVsbCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRTaGFyZWRMb2FkZXIoSVBhdGgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaGFyZWRMb2FkZXIoSVBhdGggYmFzZURpcikgewotCQkvLyBOb3Qgc3VwcG9ydGVkCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGZhbHNlIHNpbmNlIFRvbWNhdCAzLjIgZG9lc24ndCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGZhbHNlIHNpbmNlIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNzdXBwb3J0c0RlYnVnQXJndW1lbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRGVidWdBcmd1bWVudCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjc3VwcG9ydHNTZXBhcmF0ZUNvbnRleHRGaWxlcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXBhcmF0ZUNvbnRleHRGaWxlcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRFbmRvcnNlZERpcmVjdG9yaWVzKElQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kb3JzZWREaXJlY3RvcmllcyhJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MENvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NDBDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MDA5ZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLlNlcnZlckluc3RhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotLyoqCi0gKiBUb21jYXQgdjQuMCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDQwQ29uZmlndXJhdGlvbiBleHRlbmRzIFRvbWNhdENvbmZpZ3VyYXRpb24gewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRSA9ICJUb21jYXQtU3RhbmRhbG9uZSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9DT05ORUNUT1IgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuaHR0cC5IdHRwQ29ubmVjdG9yIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTU0xfU09DS0VUX0ZBQ1RPUlkgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5uZXQuU1NMU2VydmVyU29ja2V0RmFjdG9yeSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DT05ORUNUT1IgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IudGVzdC5IdHRwQ29ubmVjdG9yIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBSlBfQ09OTkVDVE9SID0gIm9yZy5hcGFjaGUuYWpwLnRvbWNhdDQuQWpwMTNDb25uZWN0b3IiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUlBfQ09OTkVDVE9SID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLndhcnAuV2FycENvbm5lY3RvciI7Ci0KLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgU2VydmVySW5zdGFuY2Ugc2VydmVySW5zdGFuY2U7Ci0JcHJvdGVjdGVkIEZhY3Rvcnkgc2VydmVyRmFjdG9yeTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZlckRpcnR5OwotCi0JcHJvdGVjdGVkIFdlYkFwcERvY3VtZW50IHdlYkFwcERvY3VtZW50OwotCi0JcHJvdGVjdGVkIERvY3VtZW50IHRvbWNhdFVzZXJzRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvbGljeUZpbGU7Ci0KLQkvKioKLQkgKiBUb21jYXQ0MENvbmZpZ3VyYXRpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICovCi0JcHVibGljIFRvbWNhdDQwQ29uZmlndXJhdGlvbihJRm9sZGVyIHBhdGgpIHsKLQkJc3VwZXIocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwb3J0IG51bWJlci4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQb3J0IGdldE1haW5Qb3J0KCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlcnZlclBvcnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUG9ydCBwb3J0ID0gKFNlcnZlclBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIFJldHVybiBvbmx5IGFuIEhUVFAgcG9ydCBmcm9tIHRoZSBzZWxlY3RlZCBTZXJ2aWNlCi0JCQlpZiAocG9ydC5nZXROYW1lKCkuZXF1YWxzKCJIVFRQIENvbm5lY3RvciIpICYmIHBvcnQuZ2V0SWQoKS5pbmRleE9mKCcvJykgPCAwKQotCQkJCXJldHVybiBwb3J0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtaW1lIG1hcHBpbmdzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNaW1lTWFwcGluZ3MoKSB7Ci0JCXJldHVybiB3ZWJBcHBEb2N1bWVudC5nZXRNaW1lTWFwcGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBTZXJ2ZXJQb3J0cyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiB1c2VzLgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZlclBvcnRzKCkgewotCQlMaXN0IHBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQkvLyBmaXJzdCBhZGQgc2VydmVyIHBvcnQKLQkJdHJ5IHsKLQkJCWludCBwb3J0ID0gSW50ZWdlci5wYXJzZUludChzZXJ2ZXIuZ2V0UG9ydCgpKTsKLQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydCgic2VydmVyIiwgTWVzc2FnZXMucG9ydFNlcnZlciwgcG9ydCwgIlRDUElQIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkKLQkJLy8gYWRkIGNvbm5lY3RvcnMKLQkJdHJ5IHsKLQkJCVN0cmluZyBpbnN0YW5jZVNlcnZpY2VOYW1lID0gc2VydmVySW5zdGFuY2UuZ2V0U2VydmljZSgpLmdldE5hbWUoKTsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpbnQgc2l6ZTIgPSBzZXJ2aWNlLmdldENvbm5lY3RvckNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2aWNlLmdldENvbm5lY3RvcihqKTsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbm5lY3Rvci5nZXRDbGFzc05hbWUoKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBNZXNzYWdlcy5wb3J0VW5rbm93bjsKLQkJCQkJU3RyaW5nIHByb3RvY29sID0gIlRDUElQIjsKLQkJCQkJYm9vbGVhbiBhZHZhbmNlZCA9IHRydWU7Ci0JCQkJCVN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JCQkJCWludCBwb3J0ID0gLTE7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwb3J0ID0gSW50ZWdlci5wYXJzZUludChjb25uZWN0b3IuZ2V0UG9ydCgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJCWlmIChIVFRQX0NPTk5FQ1RPUi5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCQkJbmFtZSA9ICJIVFRQIENvbm5lY3RvciI7Ci0JCQkJCQlwcm90b2NvbCA9ICJIVFRQIjsKLQkJCQkJCWNvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7ICJ3ZWIiLCAid2Vic2VydmljZXMiIH07Ci0JCQkJCQkvLyBjaGVjayBmb3IgU1NMIGNvbm5lY3RvcgotCQkJCQkJdHJ5IHsKLQkJCQkJCQlFbGVtZW50IGVsZW1lbnQgPSBjb25uZWN0b3IuZ2V0U3ViRWxlbWVudCgiRmFjdG9yeSIpOwotCQkJCQkJCWlmIChTU0xfU09DS0VUX0ZBQ1RPUlkuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKSkpIHsKLQkJCQkJCQkJbmFtZSA9ICJTU0wgQ29ubmVjdG9yIjsKLQkJCQkJCQkJcHJvdG9jb2wgPSAiU1NMIjsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQkJaWYgKCJIVFRQIi5lcXVhbHMocHJvdG9jb2wpKQotCQkJCQkJCWFkdmFuY2VkID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSBpZiAoQUpQX0NPTk5FQ1RPUi5lcXVhbHMoY2xhc3NOYW1lKSkKLQkJCQkJCW5hbWUgPSAiQUpQIENvbm5lY3RvciI7Ci0JCQkJCWVsc2UgaWYgKFdBUlBfQ09OTkVDVE9SLmVxdWFscyhjbGFzc05hbWUpKQotCQkJCQkJbmFtZSA9ICJXYXJwIENvbm5lY3RvciI7Ci0JCQkJCVN0cmluZyBwb3J0SWQ7Ci0JCQkJCWlmIChpbnN0YW5jZVNlcnZpY2VOYW1lICE9IG51bGwgJiYgaW5zdGFuY2VTZXJ2aWNlTmFtZS5lcXVhbHMoc2VydmljZS5nZXROYW1lKCkpKQotCQkJCQkJcG9ydElkID0gSW50ZWdlci50b1N0cmluZyhqKTsKLQkJCQkJZWxzZQotCQkJCQkJcG9ydElkID0gaSArIi8iICsgajsKLQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS5sZW5ndGgoKSA+IDApCi0JCQkJCQlwb3J0cy5hZGQobmV3IFNlcnZlclBvcnQocG9ydElkLCBuYW1lLCBwb3J0LCBwcm90b2NvbCwgY29udGVudFR5cGVzLCBhZHZhbmNlZCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgc2VydmVyIHBvcnRzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIHBvcnRzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3ZWIgbW9kdWxlcyBpbiB0aGlzIHNlcnZlci4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViTW9kdWxlcygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQl0cnkgewotCQkJQ29udGV4dCBbXSBjb250ZXh0cyA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHRzKCk7Ci0JCQlpZiAoY29udGV4dHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJQ29udGV4dCBjb250ZXh0ID0gY29udGV4dHNbaV07Ci0JCQkJCVN0cmluZyByZWxvYWQgPSBjb250ZXh0LmdldFJlbG9hZGFibGUoKTsKLQkJCQkJaWYgKHJlbG9hZCA9PSBudWxsKQotCQkJCQkJcmVsb2FkID0gImZhbHNlIjsKLQkJCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUoY29udGV4dC5nZXRQYXRoKCksIAotCQkJCQkJY29udGV4dC5nZXREb2NCYXNlKCksIGNvbnRleHQuZ2V0U291cmNlKCksCi0JCQkJCQlyZWxvYWQuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpID8gdHJ1ZSA6IGZhbHNlKTsKLQkJCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIG1vZHVsZXMiLCBlKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2dldFNlcnZlcldvcmtEaXJlY3RvcnkoSVBhdGgpCi0JICovCi0JcHVibGljIElQYXRoIGdldFNlcnZlcldvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgpIHsKLQkJcmV0dXJuIHNlcnZlckluc3RhbmNlLmdldEhvc3RXb3JrRGlyZWN0b3J5KGJhc2VQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoSVBhdGgsIElUb21jYXRXZWJNb2R1bGUpCi0JICovCi0JcHVibGljIElQYXRoIGdldENvbnRleHRXb3JrRGlyZWN0b3J5KElQYXRoIGJhc2VQYXRoLCBJVG9tY2F0V2ViTW9kdWxlIG1vZHVsZSkgewotCQlDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0KG1vZHVsZS5nZXRQYXRoKCkpOwotCQlpZiAoY29udGV4dCAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlckluc3RhbmNlLmdldENvbnRleHRXb3JrRGlyZWN0b3J5KGJhc2VQYXRoLCBjb250ZXh0KTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNpbXBvcnRGcm9tUGF0aChJUGF0aCwgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRGcm9tUGF0aChJUGF0aCBwYXRoLCBib29sZWFuIGlzVGVzdEVudiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxvYWQocGF0aCwgbW9uaXRvcik7Ci0JCQotCQkvLyBmb3IgdGVzdCBlbnZpcm9ubWVudCwgcmVtb3ZlIGV4aXN0aW5nIGNvbnRleHRzIHNpbmNlIGEgc2VwYXJhdGUKLQkJLy8gY2F0YWxpbmEuYmFzZSB3aWxsIGJlIHVzZWQKLQkJaWYgKGlzVGVzdEVudikgewotCQkJd2hpbGUgKHNlcnZlckluc3RhbmNlLnJlbW92ZUNvbnRleHQoMCkpIHsKLQkJCQkvLyBuby1vcAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvYWQoSVBhdGgsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmxvYWRpbmdUYXNrLCA1KTsKLQkJCQotCQkJLy8gY2hlY2sgZm9yIGNhdGFsaW5hLnBvbGljeSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgdjQuMCBjb25maWcKLQkJCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpOwotCQkJaW4ucmVhZCgpOwotCQkJaW4uY2xvc2UoKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJc2VydmVyRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJc2VydmVyID0gKFNlcnZlcikgc2VydmVyRmFjdG9yeS5sb2FkRG9jdW1lbnQobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvRmlsZSgpKSk7Ci0JCQlzZXJ2ZXJJbnN0YW5jZSA9IG5ldyBTZXJ2ZXJJbnN0YW5jZShzZXJ2ZXIsIG51bGwsIG51bGwpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCXdlYkFwcERvY3VtZW50ID0gbmV3IFdlYkFwcERvY3VtZW50KHBhdGguYXBwZW5kKCJ3ZWIueG1sIikpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCi0JCQl0b21jYXRVc2Vyc0RvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvRmlsZSgpKSkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQotCQkJLy8gbG9hZCBwb2xpY3kgZmlsZQotCQkJcG9saWN5RmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvRmlsZSgpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBUb21jYXQgdjQuMCBjb25maWd1cmF0aW9uIGZyb20gIiArIHBhdGgudG9PU1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBwYXRoLnRvT1NTdHJpbmcoKSksIGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2FkKElGb2xkZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5sb2FkaW5nVGFzaywgODAwKTsKLQkKLQkJCS8vIGNoZWNrIGZvciBjYXRhbGluYS5wb2xpY3kgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBhIHY0LjAgY29uZmlnCi0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnBvbGljeSIpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIGZvbGRlci5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSksIG51bGwpKTsKLQkKLQkJCS8vIGxvYWQgc2VydmVyLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJzZXJ2ZXIueG1sIik7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXNlcnZlckZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJc2VydmVyRmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCXNlcnZlciA9IChTZXJ2ZXIpIHNlcnZlckZhY3RvcnkubG9hZERvY3VtZW50KGluKTsKLQkJCXNlcnZlckluc3RhbmNlID0gbmV3IFNlcnZlckluc3RhbmNlKHNlcnZlciwgbnVsbCwgbnVsbCk7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJLy8gbG9hZCB3ZWIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoIndlYi54bWwiKTsKLQkJCXdlYkFwcERvY3VtZW50ID0gbmV3IFdlYkFwcERvY3VtZW50KGZpbGUpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgdG9tY2F0LXVzZXJzLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ0b21jYXQtdXNlcnMueG1sIik7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQotCQkJdG9tY2F0VXNlcnNEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkKLQkJCS8vIGxvYWQgY2F0YWxpbmEucG9saWN5Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnBvbGljeSIpOwotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlwb2xpY3lGaWxlID0gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRGaWxlQ29udGVudHMoaW4pOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDYW5jZWxsZWQiKTsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCByZWxvYWQgVG9tY2F0IHY0LjAgY29uZmlndXJhdGlvbiBmcm9tOiAiICsgZm9sZGVyLmdldEZ1bGxQYXRoKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIGZvbGRlci5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSksIGUpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTYXZlIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICogQHBhcmFtIGZvcmNlRGlydHkgYm9vbGVhbgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmUoSVBhdGggcGF0aCwgYm9vbGVhbiBmb3JjZURpcnR5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIDMpOwotCQkJCi0JCQkvLyBtYWtlIHN1cmUgZGlyZWN0b3J5IGV4aXN0cwotCQkJaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJZm9yY2VEaXJ0eSA9IHRydWU7Ci0JCQkJcGF0aC50b0ZpbGUoKS5ta2RpcigpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCS8vIHNhdmUgZmlsZXMKLQkJCWlmIChmb3JjZURpcnR5IHx8IGlzU2VydmVyRGlydHkpIHsKLQkJCQlzZXJ2ZXJGYWN0b3J5LnNhdmUocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b09TU3RyaW5nKCkpOwotCQkJCWlzU2VydmVyRGlydHkgPSBmYWxzZTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQl3ZWJBcHBEb2N1bWVudC5zYXZlKHBhdGguYXBwZW5kKCJ3ZWIueG1sIikudG9PU1N0cmluZygpLCBmb3JjZURpcnR5KTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAoZm9yY2VEaXJ0eSkKLQkJCQlYTUxVdGlsLnNhdmUocGF0aC5hcHBlbmQoInRvbWNhdC11c2Vycy54bWwiKS50b09TU3RyaW5nKCksIHRvbWNhdFVzZXJzRG9jdW1lbnQpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChmb3JjZURpcnR5KSB7Ci0JCQkJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIocGF0aC5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvRmlsZSgpKSk7Ci0JCQkJYncud3JpdGUocG9saWN5RmlsZSk7Ci0JCQkJYncuY2xvc2UoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjQuMCBjb25maWd1cmF0aW9uIHRvICIgKyBwYXRoLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4gIEFsbCBmaWxlcyBhcmUgZm9yY2VkIHRvIGJlIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGRlc2luYXRpb24gcGF0aCBmb3IgdGhlIGZpbGVzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2F2ZShwYXRoLCB0cnVlLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiBoZWxkIGJ5IHRoaXMgb2JqZWN0IHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gZm9sZGVyIGEgZm9sZGVyCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCA5MDApOwotCQkJCi0JCQkvLyBzYXZlIHNlcnZlci54bWwKLQkJCWJ5dGVbXSBkYXRhID0gc2VydmVyRmFjdG9yeS5nZXRDb250ZW50cygpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKGlzU2VydmVyRGlydHkpCi0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCWVsc2UKLQkJCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCX0gZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWlzU2VydmVyRGlydHkgPSBmYWxzZTsKLQkJCQotCQkJLy8gc2F2ZSB3ZWIueG1sCi0JCQl3ZWJBcHBEb2N1bWVudC5zYXZlKGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIiksIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCi0JCQkvLyBzYXZlIHRvbWNhdC11c2Vycy54bWwKLQkJCWRhdGEgPSBYTUxVdGlsLmdldENvbnRlbnRzKHRvbWNhdFVzZXJzRG9jdW1lbnQpOwotCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInRvbWNhdC11c2Vycy54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgY2F0YWxpbmEucG9saWN5Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwb2xpY3lGaWxlLmdldEJ5dGVzKCkpOwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFRvbWNhdCB2NC4wIGNvbmZpZ3VyYXRpb24gdG8gIiArIGZvbGRlci50b1N0cmluZygpLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSNhZGRNaW1lTWFwcGluZyhpbnQsIElNaW1lTWFwcGluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQuYWRkTWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KEFERF9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I2FkZFdlYk1vZHVsZShpbnQsIElUb21jYXRXZWJNb2R1bGUpCi0JICovCi0JcHVibGljIHZvaWQgYWRkV2ViTW9kdWxlKGludCBpbmRleCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJdHJ5IHsKLQkJCUNvbnRleHQgY29udGV4dCA9IHNlcnZlckluc3RhbmNlLmNyZWF0ZUNvbnRleHQoaW5kZXgpOwotCQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJCWNvbnRleHQuc2V0RG9jQmFzZShtb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCkpOwotCQkJCWNvbnRleHQuc2V0UGF0aChtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJCQljb250ZXh0LnNldFJlbG9hZGFibGUobW9kdWxlLmlzUmVsb2FkYWJsZSgpID8gInRydWUiIDogImZhbHNlIik7Ci0JCQkJaWYgKG1vZHVsZS5nZXRNZW1lbnRvKCkgIT0gbnVsbCAmJiBtb2R1bGUuZ2V0TWVtZW50bygpLmxlbmd0aCgpID4gMCkKLQkJCQkJY29udGV4dC5zZXRTb3VyY2UobW9kdWxlLmdldE1lbWVudG8oKSk7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoQUREX1dFQl9NT0RVTEVfUFJPUEVSVFksIG51bGwsIG1vZHVsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBhZGRpbmcgd2ViIG1vZHVsZSAiICsgbW9kdWxlLmdldFBhdGgoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdGhlIGV4dGVuc2lvbiBvZiBhIG1pbWUgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gbWFwCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5TWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXdlYkFwcERvY3VtZW50Lm1vZGlmeU1pbWVNYXBwaW5nKGluZGV4LCBtYXApOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfTUFQUElOR19QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtYXApOwotCX0KLQkKLQkvKioKLQkgKiBNb2RpZnkgdGhlIHBvcnQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwb3J0IGludAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVNlcnZlclBvcnQoU3RyaW5nIGlkLCBpbnQgcG9ydCkgewotCQl0cnkgewotCQkJaWYgKCJzZXJ2ZXIiLmVxdWFscyhpZCkpIHsKLQkJCQlzZXJ2ZXIuc2V0UG9ydChwb3J0ICsgIiIpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkKLQkJCWludCBpID0gaWQuaW5kZXhPZigiLyIpOwotCQkJLy8gSWYgYSBjb25uZWN0b3IgaW4gdGhlIGluc3RhbmNlIFNlcnZpY2UKLQkJCWlmIChpIDwgMCkgewotCQkJCWludCBjb25uTnVtID0gSW50ZWdlci5wYXJzZUludChpZCk7Ci0JCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZlckluc3RhbmNlLmdldENvbm5lY3Rvcihjb25uTnVtKTsKLQkJCQlpZiAoY29ubmVjdG9yICE9IG51bGwpIHsKLQkJCQkJY29ubmVjdG9yLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJCX0KLQkJCX0KLQkJCS8vIEVsc2UgYSBjb25uZWN0b3IgaW4gYW5vdGhlciBTZXJ2aWNlCi0JCQllbHNlIHsKLQkJCQlpbnQgc2Vydk51bSA9IEludGVnZXIucGFyc2VJbnQoaWQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCQlpbnQgY29ubk51bSA9IEludGVnZXIucGFyc2VJbnQoaWQuc3Vic3RyaW5nKGkgKyAxKSk7Ci0JCQkJCi0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2Uoc2Vydk51bSk7Ci0JCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yKGNvbm5OdW0pOwotCQkJCWNvbm5lY3Rvci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBtb2RpZnlpbmcgc2VydmVyIHBvcnQgIiArIGlkLCBlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBDaGFuZ2UgYSB3ZWIgbW9kdWxlLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKiBAcGFyYW0gZG9jQmFzZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhdGggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByZWxvYWRhYmxlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlXZWJNb2R1bGUoaW50IGluZGV4LCBTdHJpbmcgZG9jQmFzZSwgU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVsb2FkYWJsZSkgewotCQl0cnkgewotCQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dChpbmRleCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJY29udGV4dC5zZXRQYXRoKHBhdGgpOwotCQkJCWNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKLQkJCQljb250ZXh0LnNldFJlbG9hZGFibGUocmVsb2FkYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKHBhdGgsIGRvY0Jhc2UsIG51bGwsIHJlbG9hZGFibGUpOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9XRUJfTU9EVUxFX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1vZHVsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBtb2RpZnlpbmcgd2ViIG1vZHVsZSAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYSBtaW1lIG1hcHBpbmcuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKGludCBpbmRleCkgewotCQl3ZWJBcHBEb2N1bWVudC5yZW1vdmVNaW1lTWFwcGluZyhpbmRleCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9NQVBQSU5HX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlV2ViTW9kdWxlKGludCBpbmRleCkgewotCQl0cnkgewotCQkJc2VydmVySW5zdGFuY2UucmVtb3ZlQ29udGV4dChpbmRleCk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9XRUJfTU9EVUxFX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVtb3ZpbmcgbW9kdWxlIHJlZiAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xlYW51cCB0aGUgc2VydmVyIGluc3RhbmNlLiAgVGhpcyBjb25zaXN0cyBvZiBkZWxldGluZyB0aGUgd29yawotCSAqIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggQ29udGV4dHMgdGhhdCBhcmUgZ29pbmcgYXdheSBpbiB0aGUKLQkgKiB1cCBjb21pbmcgcHVibGlzaC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBwYXRoIHRvIHNlcnZlciBpbnN0YW5jZSBkaXJlY3RvcnksIGkuZS4gY2F0YWxpbmEuYmFzZQotCSAqIEBwYXJhbSBpbnN0YWxsRGlyIHBhdGggdG8gc2VydmVyIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKG5vdCBjdXJyZW50bHkgdXNlZCkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqIEByZXR1cm4gTXVsdGlTdGF0dXMgY29udGFpbmluZyByZXN1bHRzIG9mIHRoZSBjbGVhbnVwIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIGNsZWFudXBTZXJ2ZXIoSVBhdGggYmFzZURpciwgSVBhdGggaW5zdGFsbERpciwgYm9vbGVhbiByZW1vdmVLZXB0Q29udGV4dEZpbGVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTGlzdCBtb2R1bGVzID0gZ2V0V2ViTW9kdWxlcygpOwotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5jbGVhbnVwQ2F0YWxpbmFTZXJ2ZXIoYmFzZURpciwgaW5zdGFsbERpciwgcmVtb3ZlS2VwdENvbnRleHRGaWxlcywgbW9kdWxlcywgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvY2FsaXplQ29uZmlndXJhdGlvbihJUGF0aCwgSVBhdGgsIFRvbWNhdFNlcnZlciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBsb2NhbGl6ZUNvbmZpZ3VyYXRpb24oSVBhdGggYmFzZURpciwgSVBhdGggZGVwbG95RGlyLCBUb21jYXRTZXJ2ZXIgdG9tY2F0U2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIubG9jYWxpemVDb25maWd1cmF0aW9uKGJhc2VEaXIsIGRlcGxveURpciwgdG9tY2F0U2VydmVyLCBtb25pdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQwSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhYjgxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLS8qKgotICogVG9tY2F0IDQwIGhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXQ0MEhhbmRsZXIgaW1wbGVtZW50cyBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgewotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ZlcmlmeUluc3RhbGxQYXRoKElQYXRoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZlcmlmeUluc3RhbGxQYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCXJldHVybiBUb21jYXRQbHVnaW4udmVyaWZ5SW5zdGFsbFBhdGhXaXRoRm9sZGVyQ2hlY2soaW5zdGFsbFBhdGgsIFRvbWNhdFBsdWdpbi5UT01DQVRfNDApOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAiOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJTGlzdCBjcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIDQuMCAtIGFkZCBib290c3RyYXAuamFyIGZyb20gdGhlIFRvbWNhdCBiaW4gZGlyZWN0b3J5Ci0JCUlQYXRoIGJpblBhdGggPSBpbnN0YWxsUGF0aC5hcHBlbmQoImJpbiIpOwotCQlpZiAoYmluUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJSVBhdGggcGF0aCA9IGJpblBhdGguYXBwZW5kKCJib290c3RyYXAuamFyIik7Ci0JCQljcC5hZGQoSmF2YVJ1bnRpbWUubmV3QXJjaGl2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShwYXRoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBjcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhJUGF0aCwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoSVBhdGggY29uZmlnUGF0aCwgYm9vbGVhbiBkZWJ1ZywgYm9vbGVhbiBzdGFydGluZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlpZiAoZGVidWcpCi0JCQlsaXN0LmFkZCgiLWRlYnVnIik7Ci0JCQotCQlpZiAoc3RhcnRpbmcpCi0JCQlsaXN0LmFkZCgic3RhcnQiKTsKLQkJZWxzZQotCQkJbGlzdC5hZGQoInN0b3AiKTsKLQkJCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoYm9vbGVhbiBkZWJ1ZywgYm9vbGVhbiBzdGFydGluZykgewotCQlpZiAoIWRlYnVnKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7ICItZGVidWciIH07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVWTUFyZ3VtZW50cyhJUGF0aCwgSVBhdGgsIElQYXRoLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVBhdGggaW5zdGFsbFBhdGgsIElQYXRoIGNvbmZpZ1BhdGgsIElQYXRoIGRlcGxveVBhdGgsIGJvb2xlYW4gaXNUZXN0RW52KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGlzVGVzdEVudikKLQkJCWxpc3QuYWRkKCItRGNhdGFsaW5hLmJhc2U9XCIiICsgY29uZmlnUGF0aC50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJZWxzZSAKLQkJCWxpc3QuYWRkKCItRGNhdGFsaW5hLmJhc2U9XCIiICsgaW5zdGFsbFBhdGgudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCWxpc3QuYWRkKCItRGNhdGFsaW5hLmhvbWU9XCIiICsgaW5zdGFsbFBhdGgudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCS8vIEluY2x1ZGUgYSBzeXN0ZW0gcHJvcGVydHkgZm9yIHRoZSBjb25maWd1cmFibGUgZGVwbG95IGxvY2F0aW9uCi0JCWxpc3QuYWRkKCItRHd0cC5kZXBsb3k9XCIiICsgZGVwbG95UGF0aC50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJbGlzdC5hZGQoIi1EamF2YS5lbmRvcnNlZC5kaXJzPVwiIiArIGdldEVuZG9yc2VkRGlyZWN0b3JpZXMoaW5zdGFsbFBhdGgpICsgIlwiIik7Ci0JCQotCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShzKTsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVBvbGljeUZpbGUoSVBhdGgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lUG9saWN5RmlsZShJUGF0aCBjb25maWdQYXRoKSB7Ci0JCXJldHVybiBjb25maWdQYXRoLmFwcGVuZCgiY29uZiIpLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9PU1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2NhbkFkZE1vZHVsZShJTW9kdWxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbkFkZE1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotCQlTdHJpbmcgdmVyc2lvbiA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0VmVyc2lvbigpOwotCQlpZiAoIjIuMiIuZXF1YWxzKHZlcnNpb24pIHx8ICIyLjMiLmVxdWFscyh2ZXJzaW9uKSkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JTcGVjNDAsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KFRvbWNhdFNlcnZlcikKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRTdGFuZGFyZEJhc2VEaXJlY3Rvcnkoc2VydmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNwcmVwYXJlUnVudGltZURpcmVjdG9yeShJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcmVwYXJlUnVudGltZURpcmVjdG9yeShJUGF0aCBiYXNlRGlyKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmNyZWF0ZUNhdGFsaW5hSW5zdGFuY2VEaXJlY3RvcnkoYmFzZURpcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjcHJlcGFyZURlcGxveURpcmVjdG9yeShJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcmVwYXJlRGVwbG95RGlyZWN0b3J5KElQYXRoIGRlcGxveVBhdGgpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuY3JlYXRlRGVwbG95bWVudERpcmVjdG9yeShkZXBsb3lQYXRoLAotCQkJCVRvbWNhdFZlcnNpb25IZWxwZXIuREVGQVVMVF9XRUJYTUxfU0VSVkxFVDIzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNwcmVwYXJlRm9yU2VydmluZ0RpcmVjdGx5KElQYXRoLCBUb21jYXRTZXJ2ZXIpCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlcGFyZUZvclNlcnZpbmdEaXJlY3RseShJUGF0aCBiYXNlRGlyLCBUb21jYXRTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIuaXNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JOb1B1Ymxpc2hOb3RTdXBwb3J0ZWQsIG51bGwpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9CQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFNoYXJlZExvYWRlcihJUGF0aCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXJlZExvYWRlcihJUGF0aCBiYXNlRGlyKSB7Ci0JCS8vIE5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgZmFsc2Ugc2luY2UgVG9tY2F0IDQuMCBkb2Vzbid0IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gZmFsc2Ugc2luY2UgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3N1cHBvcnRzRGVidWdBcmd1bWVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEZWJ1Z0FyZ3VtZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNzdXBwb3J0c1NlcGFyYXRlQ29udGV4dEZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcGFyYXRlQ29udGV4dEZpbGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0RW5kb3JzZWREaXJlY3RvcmllcyhJUGF0aCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuZG9yc2VkRGlyZWN0b3JpZXMoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJcmV0dXJuIGluc3RhbGxQYXRoLmFwcGVuZCgiYmluIikudG9PU1N0cmluZygpICsgCi0JCWphdmEuaW8uRmlsZS5wYXRoU2VwYXJhdG9yICsKLQkJaW5zdGFsbFBhdGguYXBwZW5kKCJjb21tb24iKS5hcHBlbmQoImxpYiIpLnRvT1NTdHJpbmcoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQxQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwZWJmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQxQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuU2VydmVySW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0vKioKLSAqIFRvbWNhdCB2NC4xIHNlcnZlciBjb25maWd1cmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0NDFDb25maWd1cmF0aW9uIGV4dGVuZHMgVG9tY2F0Q29uZmlndXJhdGlvbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVJWSUNFID0gIlRvbWNhdC1TdGFuZGFsb25lIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0NPTk5FQ1RPUiA9ICJvcmcuYXBhY2hlLmNveW90ZS50b21jYXQ0LkNveW90ZUNvbm5lY3RvciI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSktfUFJPVE9DT0xfSEFORExFUiA9ICJvcmcuYXBhY2hlLmprLnNlcnZlci5Ka0NveW90ZUhhbmRsZXIiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNTTF9TT0NLRVRfRkFDVE9SWSA9ICJvcmcuYXBhY2hlLmNveW90ZS50b21jYXQ0LkNveW90ZVNlcnZlclNvY2tldEZhY3RvcnkiOwotCS8vcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DT05ORUNUT1IgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IudGVzdC5IdHRwQ29ubmVjdG9yIjsKLQkvL29yZy5hcGFjaGUuYWpwLnRvbWNhdDQuQWpwMTNDb25uZWN0b3IKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUEFDSEVfQ09OTkVDVE9SID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLndhcnAuV2FycENvbm5lY3RvciI7Ci0KLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgU2VydmVySW5zdGFuY2Ugc2VydmVySW5zdGFuY2U7Ci0JcHJvdGVjdGVkIEZhY3Rvcnkgc2VydmVyRmFjdG9yeTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZlckRpcnR5OwotCi0JcHJvdGVjdGVkIFdlYkFwcERvY3VtZW50IHdlYkFwcERvY3VtZW50OwotCi0JcHJvdGVjdGVkIERvY3VtZW50IHRvbWNhdFVzZXJzRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvbGljeUZpbGU7Ci0KLQkvKioKLQkgKiBUb21jYXQ0MUNvbmZpZ3VyYXRpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICovCi0JcHVibGljIFRvbWNhdDQxQ29uZmlndXJhdGlvbihJRm9sZGVyIHBhdGgpIHsKLQkJc3VwZXIocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwb3J0IG51bWJlci4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQb3J0IGdldE1haW5Qb3J0KCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlcnZlclBvcnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUG9ydCBwb3J0ID0gKFNlcnZlclBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIFJldHVybiBvbmx5IGFuIEhUVFAgcG9ydCBmcm9tIHRoZSBzZWxlY3RlZCBTZXJ2aWNlCi0JCQlpZiAocG9ydC5nZXROYW1lKCkuZXF1YWxzKCJIVFRQIENvbm5lY3RvciIpICYmIHBvcnQuZ2V0SWQoKS5pbmRleE9mKCcvJykgPCAwKQotCQkJCXJldHVybiBwb3J0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtaW1lIG1hcHBpbmdzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNaW1lTWFwcGluZ3MoKSB7Ci0JCXJldHVybiB3ZWJBcHBEb2N1bWVudC5nZXRNaW1lTWFwcGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBTZXJ2ZXJQb3J0cyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiB1c2VzLgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZlclBvcnRzKCkgewotCQlMaXN0IHBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQkvLyBmaXJzdCBhZGQgc2VydmVyIHBvcnQKLQkJdHJ5IHsKLQkJCWludCBwb3J0ID0gSW50ZWdlci5wYXJzZUludChzZXJ2ZXIuZ2V0UG9ydCgpKTsKLQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydCgic2VydmVyIiwgTWVzc2FnZXMucG9ydFNlcnZlciwgcG9ydCwgIlRDUElQIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkKLQkJLy8gYWRkIGNvbm5lY3RvcnMKLQkJdHJ5IHsKLQkJCVN0cmluZyBpbnN0YW5jZVNlcnZpY2VOYW1lID0gc2VydmVySW5zdGFuY2UuZ2V0U2VydmljZSgpLmdldE5hbWUoKTsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpbnQgc2l6ZTIgPSBzZXJ2aWNlLmdldENvbm5lY3RvckNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2aWNlLmdldENvbm5lY3RvcihqKTsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbm5lY3Rvci5nZXRDbGFzc05hbWUoKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBjbGFzc05hbWU7Ci0JCQkJCVN0cmluZyBwcm90b2NvbCA9ICJUQ1BJUCI7Ci0JCQkJCWJvb2xlYW4gYWR2YW5jZWQgPSB0cnVlOwotCQkJCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBudWxsOwotCQkJCQlpbnQgcG9ydCA9IC0xOwotCQkJCQl0cnkgewotCQkJCQkJcG9ydCA9IEludGVnZXIucGFyc2VJbnQoY29ubmVjdG9yLmdldFBvcnQoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQlpZiAoSFRUUF9DT05ORUNUT1IuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQkJCW5hbWUgPSAiSFRUUCBDb25uZWN0b3IiOwotCQkJCQkJcHJvdG9jb2wgPSAiSFRUUCI7Ci0JCQkJCQljb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW10geyAid2ViIiwgIndlYnNlcnZpY2VzIiB9OwotCQkJCQkJLy8gY2hlY2sgZm9yIEFKUC8xLjMgQ295b3RlIGNvbm5lY3RvcgotCQkJCQkJU3RyaW5nIHByb3RvY29sSGFuZGxlciA9IGNvbm5lY3Rvci5nZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUoKTsKLQkJCQkJCWlmIChKS19QUk9UT0NPTF9IQU5ETEVSLmVxdWFscyhwcm90b2NvbEhhbmRsZXIpKSB7Ci0JCQkJCQkJbmFtZSA9ICJBSlAvMS4zIENvbm5lY3RvciI7Ci0JCQkJCQkJcHJvdG9jb2wgPSAiQUpQLzEuMyI7IAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBhc3N1bWUgSFRUUCwgY2hlY2sgZm9yIEhUVFAgU1NMIGNvbm5lY3RvcgotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUVsZW1lbnQgZWxlbWVudCA9IGNvbm5lY3Rvci5nZXRTdWJFbGVtZW50KCJGYWN0b3J5Iik7Ci0JCQkJCQkJCWlmIChTU0xfU09DS0VUX0ZBQ1RPUlkuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKSkpIHsKLQkJCQkJCQkJCW5hbWUgPSAiU1NMIENvbm5lY3RvciI7Ci0JCQkJCQkJCQlwcm90b2NvbCA9ICJTU0wiOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gaWdub3JlCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCJIVFRQIi5lcXVhbHMocHJvdG9jb2wpKQotCQkJCQkJCWFkdmFuY2VkID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSBpZiAoQVBBQ0hFX0NPTk5FQ1RPUi5lcXVhbHMoY2xhc3NOYW1lKSkKLQkJCQkJCW5hbWUgPSAiQXBhY2hlIENvbm5lY3RvciI7Ci0JCQkJCVN0cmluZyBwb3J0SWQ7Ci0JCQkJCWlmIChpbnN0YW5jZVNlcnZpY2VOYW1lICE9IG51bGwgJiYgaW5zdGFuY2VTZXJ2aWNlTmFtZS5lcXVhbHMoc2VydmljZS5nZXROYW1lKCkpKQotCQkJCQkJcG9ydElkID0gSW50ZWdlci50b1N0cmluZyhqKTsKLQkJCQkJZWxzZQotCQkJCQkJcG9ydElkID0gaSArIi8iICsgajsKLQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS5sZW5ndGgoKSA+IDApCi0JCQkJCQlwb3J0cy5hZGQobmV3IFNlcnZlclBvcnQocG9ydElkLCBuYW1lLCBwb3J0LCBwcm90b2NvbCwgY29udGVudFR5cGVzLCBhZHZhbmNlZCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgc2VydmVyIHBvcnRzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIHBvcnRzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3ZWIgbW9kdWxlcyBpbiB0aGlzIHNlcnZlci4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViTW9kdWxlcygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQl0cnkgewotCQkJQ29udGV4dCBbXSBjb250ZXh0cyA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHRzKCk7Ci0JCQlpZiAoY29udGV4dHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJQ29udGV4dCBjb250ZXh0ID0gY29udGV4dHNbaV07Ci0JCQkJCVN0cmluZyByZWxvYWQgPSBjb250ZXh0LmdldFJlbG9hZGFibGUoKTsKLQkJCQkJaWYgKHJlbG9hZCA9PSBudWxsKQotCQkJCQkJcmVsb2FkID0gImZhbHNlIjsKLQkJCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUoY29udGV4dC5nZXRQYXRoKCksIAotCQkJCQkJY29udGV4dC5nZXREb2NCYXNlKCksIGNvbnRleHQuZ2V0U291cmNlKCksCi0JCQkJCQlyZWxvYWQuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpID8gdHJ1ZSA6IGZhbHNlKTsKLQkJCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIHByb2plY3QgcmVmcyIsIGUpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jZ2V0U2VydmVyV29ya0RpcmVjdG9yeShJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0U2VydmVyV29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCkgewotCQlyZXR1cm4gc2VydmVySW5zdGFuY2UuZ2V0SG9zdFdvcmtEaXJlY3RvcnkoYmFzZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNnZXRDb250ZXh0V29ya0RpcmVjdG9yeShJUGF0aCwgSVRvbWNhdFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCUNvbnRleHQgY29udGV4dCA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHQobW9kdWxlLmdldFBhdGgoKSk7Ci0JCWlmIChjb250ZXh0ICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoYmFzZVBhdGgsIGNvbnRleHQpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2ltcG9ydEZyb21QYXRoKElQYXRoLCBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGltcG9ydEZyb21QYXRoKElQYXRoIHBhdGgsIGJvb2xlYW4gaXNUZXN0RW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9hZChwYXRoLCBtb25pdG9yKTsKLQkJCi0JCS8vIGZvciB0ZXN0IGVudmlyb25tZW50LCByZW1vdmUgZXhpc3RpbmcgY29udGV4dHMgc2luY2UgYSBzZXBhcmF0ZQotCQkvLyBjYXRhbGluYS5iYXNlIHdpbGwgYmUgdXNlZAotCQlpZiAoaXNUZXN0RW52KSB7Ci0JCQl3aGlsZSAoc2VydmVySW5zdGFuY2UucmVtb3ZlQ29udGV4dCgwKSkgewotCQkJCS8vIG5vLW9wCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvYWQoSVBhdGgsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmxvYWRpbmdUYXNrLCA1KTsKLQkJCQotCQkJLy8gY2hlY2sgZm9yIGNhdGFsaW5hLnBvbGljeSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgdjQuMCBjb25maWcKLQkJCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpOwotCQkJaW4ucmVhZCgpOwotCQkJaW4uY2xvc2UoKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQlzZXJ2ZXJGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCXNlcnZlckZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlzZXJ2ZXIgPSAoU2VydmVyKSBzZXJ2ZXJGYWN0b3J5LmxvYWREb2N1bWVudChuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9GaWxlKCkpKTsKLQkJCXNlcnZlckluc3RhbmNlID0gbmV3IFNlcnZlckluc3RhbmNlKHNlcnZlciwgbnVsbCwgbnVsbCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJd2ViQXBwRG9jdW1lbnQgPSBuZXcgV2ViQXBwRG9jdW1lbnQocGF0aC5hcHBlbmQoIndlYi54bWwiKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCXRvbWNhdFVzZXJzRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJ0b21jYXQtdXNlcnMueG1sIikudG9GaWxlKCkpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCi0JCQkvLyBsb2FkIHBvbGljeSBmaWxlCi0JCQlwb2xpY3lGaWxlID0gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRGaWxlQ29udGVudHMobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIFRvbWNhdCB2NC4wIGNvbmZpZ3VyYXRpb24gZnJvbSAiICsgcGF0aC50b09TU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIHBhdGgudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvYWQoSUZvbGRlciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmxvYWRpbmdUYXNrLCA4MDApOwotCQotCQkJLy8gY2hlY2sgZm9yIGNhdGFsaW5hLnBvbGljeSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgdjQuMCBjb25maWcKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgbnVsbCkpOwotCQotCQkJLy8gbG9hZCBzZXJ2ZXIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCUlucHV0U3RyZWFtIGluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJc2VydmVyRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJc2VydmVyID0gKFNlcnZlcikgc2VydmVyRmFjdG9yeS5sb2FkRG9jdW1lbnQoaW4pOwotCQkJc2VydmVySW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2Uoc2VydmVyLCBudWxsLCBudWxsKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIHdlYi54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpOwotCQkJd2ViQXBwRG9jdW1lbnQgPSBuZXcgV2ViQXBwRG9jdW1lbnQoZmlsZSk7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJLy8gbG9hZCB0b21jYXQtdXNlcnMueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInRvbWNhdC11c2Vycy54bWwiKTsKLQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCi0JCQl0b21jYXRVc2Vyc0RvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQotCQkJLy8gbG9hZCBjYXRhbGluYS5wb2xpY3kKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXBvbGljeUZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhpbik7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNhbmNlbGxlZCIpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHJlbG9hZCBUb21jYXQgdjQuMSBjb25maWd1cmF0aW9uIGZyb206ICIgKyBmb2xkZXIuZ2V0RnVsbFBhdGgoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqIEBwYXJhbSBmb3JjZURpcnR5IGJvb2xlYW4KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElQYXRoIHBhdGgsIGJvb2xlYW4gZm9yY2VEaXJ0eSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCAzKTsKLQkKLQkJCS8vIG1ha2Ugc3VyZSBkaXJlY3RvcnkgZXhpc3RzCi0JCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQlmb3JjZURpcnR5ID0gdHJ1ZTsKLQkJCQlwYXRoLnRvRmlsZSgpLm1rZGlyKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCS8vIHNhdmUgZmlsZXMKLQkJCWlmIChmb3JjZURpcnR5IHx8IGlzU2VydmVyRGlydHkpIHsKLQkJCQlzZXJ2ZXJGYWN0b3J5LnNhdmUocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b09TU3RyaW5nKCkpOwotCQkJCWlzU2VydmVyRGlydHkgPSBmYWxzZTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQl3ZWJBcHBEb2N1bWVudC5zYXZlKHBhdGguYXBwZW5kKCJ3ZWIueG1sIikudG9PU1N0cmluZygpLCBmb3JjZURpcnR5KTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAoZm9yY2VEaXJ0eSkKLQkJCQlYTUxVdGlsLnNhdmUocGF0aC5hcHBlbmQoInRvbWNhdC11c2Vycy54bWwiKS50b09TU3RyaW5nKCksIHRvbWNhdFVzZXJzRG9jdW1lbnQpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChmb3JjZURpcnR5KSB7Ci0JCQkJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIocGF0aC5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvRmlsZSgpKSk7Ci0JCQkJYncud3JpdGUocG9saWN5RmlsZSk7Ci0JCQkJYncuY2xvc2UoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjQuMSBjb25maWd1cmF0aW9uIHRvICIgKyBwYXRoLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4gIEFsbCBmaWxlcyBhcmUgZm9yY2VkIHRvIGJlIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGRlc2luYXRpb24gcGF0aCBmb3IgdGhlIGZpbGVzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2F2ZShwYXRoLCB0cnVlLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiBoZWxkIGJ5IHRoaXMgb2JqZWN0IHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gZm9sZGVyIGEgZm9sZGVyCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCA5MDApOwotCQkJCi0JCQkvLyBzYXZlIHNlcnZlci54bWwKLQkJCWJ5dGVbXSBkYXRhID0gc2VydmVyRmFjdG9yeS5nZXRDb250ZW50cygpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKGlzU2VydmVyRGlydHkpCi0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCWVsc2UKLQkJCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCX0gZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWlzU2VydmVyRGlydHkgPSBmYWxzZTsKLQkJCQotCQkJLy8gc2F2ZSB3ZWIueG1sCi0JCQl3ZWJBcHBEb2N1bWVudC5zYXZlKGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIiksIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCi0JCQkvLyBzYXZlIHRvbWNhdC11c2Vycy54bWwKLQkJCWRhdGEgPSBYTUxVdGlsLmdldENvbnRlbnRzKHRvbWNhdFVzZXJzRG9jdW1lbnQpOwotCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInRvbWNhdC11c2Vycy54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgY2F0YWxpbmEucG9saWN5Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwb2xpY3lGaWxlLmdldEJ5dGVzKCkpOwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFRvbWNhdCB2NC4xIGNvbmZpZ3VyYXRpb24gdG8gIiArIGZvbGRlci50b1N0cmluZygpLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNNREJMaXN0ZW5lcihTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWludCBjb3VudCA9IHNlcnZlci5nZXRMaXN0ZW5lckNvdW50KCk7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBzZXJ2ZXIuZ2V0TGlzdGVuZXIoaSk7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCAmJiBsaXN0ZW5lci5nZXRDbGFzc05hbWUoKSAhPSBudWxsICYmIGxpc3RlbmVyLmdldENsYXNzTmFtZSgpLmluZGV4T2YoIm1iZWFuIikgPj0gMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSNhZGRNaW1lTWFwcGluZyhpbnQsIElNaW1lTWFwcGluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQuYWRkTWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KEFERF9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I2FkZFdlYk1vZHVsZShpbnQsIElUb21jYXRXZWJNb2R1bGUpCi0JICovCi0JcHVibGljIHZvaWQgYWRkV2ViTW9kdWxlKGludCBpbmRleCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJdHJ5IHsKLQkJCUNvbnRleHQgY29udGV4dCA9IHNlcnZlckluc3RhbmNlLmNyZWF0ZUNvbnRleHQoaW5kZXgpOwotCQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJCWNvbnRleHQuc2V0RG9jQmFzZShtb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCkpOwotCQkJCWNvbnRleHQuc2V0UGF0aChtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJCQljb250ZXh0LnNldFJlbG9hZGFibGUobW9kdWxlLmlzUmVsb2FkYWJsZSgpID8gInRydWUiIDogImZhbHNlIik7Ci0JCQkJaWYgKG1vZHVsZS5nZXRNZW1lbnRvKCkgIT0gbnVsbCAmJiBtb2R1bGUuZ2V0TWVtZW50bygpLmxlbmd0aCgpID4gMCkKLQkJCQkJY29udGV4dC5zZXRTb3VyY2UobW9kdWxlLmdldE1lbWVudG8oKSk7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoQUREX1dFQl9NT0RVTEVfUFJPUEVSVFksIG51bGwsIG1vZHVsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBhZGRpbmcgd2ViIG1vZHVsZSAiICsgbW9kdWxlLmdldFBhdGgoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdGhlIGV4dGVuc2lvbiBvZiBhIG1pbWUgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gbWFwCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5TWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXdlYkFwcERvY3VtZW50Lm1vZGlmeU1pbWVNYXBwaW5nKGluZGV4LCBtYXApOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfTUFQUElOR19QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtYXApOwotCX0KLQkKLQkvKioKLQkgKiBNb2RpZnkgdGhlIHBvcnQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwb3J0IGludAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVNlcnZlclBvcnQoU3RyaW5nIGlkLCBpbnQgcG9ydCkgewotCQl0cnkgewotCQkJaWYgKCJzZXJ2ZXIiLmVxdWFscyhpZCkpIHsKLQkJCQlzZXJ2ZXIuc2V0UG9ydChwb3J0ICsgIiIpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkKLQkJCWludCBpID0gaWQuaW5kZXhPZigiLyIpOwotCQkJLy8gSWYgYSBjb25uZWN0b3IgaW4gdGhlIGluc3RhbmNlIFNlcnZpY2UKLQkJCWlmIChpIDwgMCkgewotCQkJCWludCBjb25uTnVtID0gSW50ZWdlci5wYXJzZUludChpZCk7Ci0JCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZlckluc3RhbmNlLmdldENvbm5lY3Rvcihjb25uTnVtKTsKLQkJCQlpZiAoY29ubmVjdG9yICE9IG51bGwpIHsKLQkJCQkJY29ubmVjdG9yLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJCX0KLQkJCX0KLQkJCS8vIEVsc2UgYSBjb25uZWN0b3IgaW4gYW5vdGhlciBTZXJ2aWNlCi0JCQllbHNlIHsKLQkJCQlpbnQgc2Vydk51bSA9IEludGVnZXIucGFyc2VJbnQoaWQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCQlpbnQgY29ubk51bSA9IEludGVnZXIucGFyc2VJbnQoaWQuc3Vic3RyaW5nKGkgKyAxKSk7Ci0JCQkJCi0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2Uoc2Vydk51bSk7Ci0JCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yKGNvbm5OdW0pOwotCQkJCWNvbm5lY3Rvci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBtb2RpZnlpbmcgc2VydmVyIHBvcnQgIiArIGlkLCBlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBDaGFuZ2UgYSB3ZWIgbW9kdWxlLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKiBAcGFyYW0gZG9jQmFzZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhdGggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByZWxvYWRhYmxlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlXZWJNb2R1bGUoaW50IGluZGV4LCBTdHJpbmcgZG9jQmFzZSwgU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVsb2FkYWJsZSkgewotCQl0cnkgewotCQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dChpbmRleCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJY29udGV4dC5zZXRQYXRoKHBhdGgpOwotCQkJCWNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKLQkJCQljb250ZXh0LnNldFJlbG9hZGFibGUocmVsb2FkYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKHBhdGgsIGRvY0Jhc2UsIG51bGwsIHJlbG9hZGFibGUpOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9XRUJfTU9EVUxFX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1vZHVsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBtb2RpZnlpbmcgd2ViIG1vZHVsZSAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIG1pbWUgbWFwcGluZy4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWltZU1hcHBpbmcoaW50IGluZGV4KSB7Ci0JCXdlYkFwcERvY3VtZW50LnJlbW92ZU1pbWVNYXBwaW5nKGluZGV4KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUkVNT1ZFX01BUFBJTkdfUFJPUEVSVFksIG51bGwsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHdlYiBtb2R1bGUuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVdlYk1vZHVsZShpbnQgaW5kZXgpIHsKLQkJdHJ5IHsKLQkJCXNlcnZlckluc3RhbmNlLnJlbW92ZUNvbnRleHQoaW5kZXgpOwotCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChSRU1PVkVfV0VCX01PRFVMRV9QUk9QRVJUWSwgbnVsbCwgbmV3IEludGVnZXIoaW5kZXgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlbW92aW5nIG1vZHVsZSByZWYgIiArIGluZGV4LCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gTUVUQS1JTkYvY29udGV4dC54bWwgZmlsZXMKLQkgKiBwcmVzZW50IGluIHByb2plY3RzIHRvIHB1Ymxpc2hlZCBzZXJ2ZXIueG1sLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIHBhdGggdG8gY2F0YWxpbmEgaW5zdGFuY2UgZGlyZWN0b3J5Ci0JICogQHBhcmFtIGRlcGxveURpciBwYXRoIHRvIGRlcGxveW1lbnQgZGlyZWN0b3J5Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIG9yIG51bGwKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBwdWJsaXNoQ29udGV4dENvbmZpZyhJUGF0aCBiYXNlRGlyLCBJUGF0aCBkZXBsb3lEaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5wdWJsaXNoQ2F0YWxpbmFDb250ZXh0Q29uZmlnKGJhc2VEaXIsIGRlcGxveURpciwgbW9uaXRvcik7Ci0JfQotCQotCS8qKgotCSAqIENsZWFudXAgdGhlIHNlcnZlciBpbnN0YW5jZS4gIFRoaXMgY29uc2lzdHMgb2YgZGVsZXRpbmcgdGhlIHdvcmsKLQkgKiBkaXJlY3RvcnkgYXNzb2NpYXRlZCB3aXRoIENvbnRleHRzIHRoYXQgYXJlIGdvaW5nIGF3YXkgaW4gdGhlCi0JICogdXAgY29taW5nIHB1Ymxpc2guCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBzZXJ2ZXIgaW5zdGFuY2UgZGlyZWN0b3J5LCBpLmUuIGNhdGFsaW5hLmJhc2UKLQkgKiBAcGFyYW0gaW5zdGFsbERpciBwYXRoIHRvIHNlcnZlciBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IChub3QgY3VycmVudGx5IHVzZWQpCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIG9yIG51bGwKLQkgKiBAcmV0dXJuIE11bHRpU3RhdHVzIGNvbnRhaW5pbmcgcmVzdWx0cyBvZiB0aGUgY2xlYW51cCBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBjbGVhbnVwU2VydmVyKElQYXRoIGJhc2VEaXIsIElQYXRoIGluc3RhbGxEaXIsIGJvb2xlYW4gcmVtb3ZlS2VwdENvbnRleHRGaWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgbW9kdWxlcyA9IGdldFdlYk1vZHVsZXMoKTsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuY2xlYW51cENhdGFsaW5hU2VydmVyKGJhc2VEaXIsIGluc3RhbGxEaXIsIHJlbW92ZUtlcHRDb250ZXh0RmlsZXMsIG1vZHVsZXMsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2NhbGl6ZUNvbmZpZ3VyYXRpb24oSVBhdGgsIElQYXRoLCBUb21jYXRTZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTdGF0dXMgbG9jYWxpemVDb25maWd1cmF0aW9uKElQYXRoIGJhc2VEaXIsIElQYXRoIGRlcGxveURpciwgVG9tY2F0U2VydmVyIHRvbWNhdFNlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmxvY2FsaXplQ29uZmlndXJhdGlvbihiYXNlRGlyLCBkZXBsb3lEaXIsIHRvbWNhdFNlcnZlciwgbW9uaXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NDFIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YTNkYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0vKioKLSAqIFRvbWNhdCA0MSBoYW5kbGVyLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0NDFIYW5kbGVyIGltcGxlbWVudHMgSVRvbWNhdFZlcnNpb25IYW5kbGVyIHsKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciN2ZXJpZnlJbnN0YWxsUGF0aChJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2ZXJpZnlJbnN0YWxsUGF0aChJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlyZXR1cm4gVG9tY2F0UGx1Z2luLnZlcmlmeUluc3RhbGxQYXRoV2l0aEZvbGRlckNoZWNrKGluc3RhbGxQYXRoLCBUb21jYXRQbHVnaW4uVE9NQ0FUXzQxKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVDbGFzcygpIHsKLQkJcmV0dXJuICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwIjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZUNsYXNzcGF0aChJUGF0aCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCUxpc3QgY3AgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyA0LjEgLSBhZGQgYm9vdHN0cmFwLmphciBmcm9tIHRoZSBUb21jYXQgYmluIGRpcmVjdG9yeQotCQlJUGF0aCBiaW5QYXRoID0gaW5zdGFsbFBhdGguYXBwZW5kKCJiaW4iKTsKLQkJaWYgKGJpblBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCUlQYXRoIHBhdGggPSBiaW5QYXRoLmFwcGVuZCgiYm9vdHN0cmFwLmphciIpOwotCQkJY3AuYWRkKEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkocGF0aCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gY3A7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoSVBhdGgsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElQYXRoIGNvbmZpZ1BhdGgsIGJvb2xlYW4gZGVidWcsIGJvb2xlYW4gc3RhcnRpbmcpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJaWYgKGRlYnVnKQotCQkJbGlzdC5hZGQoIi1kZWJ1ZyIpOwotCQkKLQkJaWYgKHN0YXJ0aW5nKQotCQkJbGlzdC5hZGQoInN0YXJ0Iik7Ci0JCWVsc2UKLQkJCWxpc3QuYWRkKCJzdG9wIik7Ci0JCQotCQlTdHJpbmdbXSB0ZW1wID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheSh0ZW1wKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGJvb2xlYW4gZGVidWcsIGJvb2xlYW4gc3RhcnRpbmcpIHsKLQkJaWYgKCFkZWJ1ZykgewotCQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyAiLWRlYnVnIiB9OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVBhdGgsIElQYXRoLCBJUGF0aCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVZNQXJndW1lbnRzKElQYXRoIGluc3RhbGxQYXRoLCBJUGF0aCBjb25maWdQYXRoLCBJUGF0aCBkZXBsb3lQYXRoLCBib29sZWFuIGlzVGVzdEVudikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRDYXRhbGluYVZNQXJndW1lbnRzKGluc3RhbGxQYXRoLCBjb25maWdQYXRoLCBkZXBsb3lQYXRoLCBnZXRFbmRvcnNlZERpcmVjdG9yaWVzKGluc3RhbGxQYXRoKSwgaXNUZXN0RW52KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lUG9saWN5RmlsZShJUGF0aCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVQb2xpY3lGaWxlKElQYXRoIGNvbmZpZ1BhdGgpIHsKLQkJcmV0dXJuIGNvbmZpZ1BhdGguYXBwZW5kKCJjb25mIikuYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b09TU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjY2FuQWRkTW9kdWxlKElNb2R1bGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuQWRkTW9kdWxlKElNb2R1bGUgbW9kdWxlKSB7Ci0JCVN0cmluZyB2ZXJzaW9uID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRWZXJzaW9uKCk7Ci0JCWlmICgiMi4yIi5lcXVhbHModmVyc2lvbikgfHwgIjIuMyIuZXF1YWxzKHZlcnNpb24pKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclNwZWM0MSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeShUb21jYXRTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmdldFN0YW5kYXJkQmFzZURpcmVjdG9yeShzZXJ2ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVSdW50aW1lRGlyZWN0b3J5KElQYXRoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByZXBhcmVSdW50aW1lRGlyZWN0b3J5KElQYXRoIGJhc2VEaXIpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuY3JlYXRlQ2F0YWxpbmFJbnN0YW5jZURpcmVjdG9yeShiYXNlRGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNwcmVwYXJlRGVwbG95RGlyZWN0b3J5KElQYXRoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByZXBhcmVEZXBsb3lEaXJlY3RvcnkoSVBhdGggZGVwbG95UGF0aCkgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5jcmVhdGVEZXBsb3ltZW50RGlyZWN0b3J5KGRlcGxveVBhdGgsCi0JCQkJVG9tY2F0VmVyc2lvbkhlbHBlci5ERUZBVUxUX1dFQlhNTF9TRVJWTEVUMjMpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNwcmVwYXJlRm9yU2VydmluZ0RpcmVjdGx5KElQYXRoLCBUb21jYXRTZXJ2ZXIpCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlcGFyZUZvclNlcnZpbmdEaXJlY3RseShJUGF0aCBiYXNlRGlyLCBUb21jYXRTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIuaXNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JOb1B1Ymxpc2hOb3RTdXBwb3J0ZWQsIG51bGwpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9CQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFNoYXJlZExvYWRlcihJUGF0aCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXJlZExvYWRlcihJUGF0aCBiYXNlRGlyKSB7Ci0JCS8vIE5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgZmFsc2Ugc2luY2UgVG9tY2F0IDQuMSBkb2Vzbid0IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gZmFsc2Ugc2luY2UgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3N1cHBvcnRzRGVidWdBcmd1bWVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEZWJ1Z0FyZ3VtZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBXaGlsZSBUb21jYXQgNC4xLnggZG9lcyBpbXBsZW1lbnQgYSBmb3JtIG9mIHNlcGFyYXRlCi0JICogY29udGV4dCBmaWxlcywgdGhlc2UgZmlsZSBhcmUgZm91bmQgb3V0c2lkZSBvZiB0aGUKLQkgKiAmcXVvdDtjb25mJnF1b3Q7IGRpcmVjdG9yeSBhbmQgaXMgbm90IHByYWN0aWNhbCB0bwotCSAqIHN1cHBvcnQuCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjc3VwcG9ydHNTZXBhcmF0ZUNvbnRleHRGaWxlcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXBhcmF0ZUNvbnRleHRGaWxlcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRFbmRvcnNlZERpcmVjdG9yaWVzKElQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kb3JzZWREaXJlY3RvcmllcyhJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlyZXR1cm4gaW5zdGFsbFBhdGguYXBwZW5kKCJjb21tb24iKS5hcHBlbmQoImVuZG9yc2VkIikudG9PU1N0cmluZygpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDUwQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ1MENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4ODIwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDUwQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuU2VydmVySW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotLyoqCi0gKiBUb21jYXQgdjUuMCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDUwQ29uZmlndXJhdGlvbiBleHRlbmRzIFRvbWNhdENvbmZpZ3VyYXRpb24gewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRSA9ICJDYXRhbGluYSI7Ci0JcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIFNlcnZlckluc3RhbmNlIHNlcnZlckluc3RhbmNlOwotCXByb3RlY3RlZCBGYWN0b3J5IHNlcnZlckZhY3Rvcnk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXJ2ZXJEaXJ0eTsKLQotCXByb3RlY3RlZCBXZWJBcHBEb2N1bWVudCB3ZWJBcHBEb2N1bWVudDsKLQotCXByb3RlY3RlZCBEb2N1bWVudCB0b21jYXRVc2Vyc0RvY3VtZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZyBwb2xpY3lGaWxlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9wZXJ0aWVzRmlsZTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1hcCBwcm90b2NvbEhhbmRsZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXN0YXRpYyB7Ci0JCXByb3RvY29sSGFuZGxlck1hcC5wdXQoIm9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5IdHRwMTFQcm90b2NvbCIsICJIVFRQLzEuMSIpOwotCQlwcm90b2NvbEhhbmRsZXJNYXAucHV0KCJvcmcuYXBhY2hlLmprLnNlcnZlci5Ka0NveW90ZUhhbmRsZXIiLCAiQUpQLzEuMyIpOwotCX0KLQkKLQkvKioKLQkgKiBUb21jYXQ1MENvbmZpZ3VyYXRpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICovCi0JcHVibGljIFRvbWNhdDUwQ29uZmlndXJhdGlvbihJRm9sZGVyIHBhdGgpIHsKLQkJc3VwZXIocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwb3J0IG51bWJlci4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQb3J0IGdldE1haW5Qb3J0KCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlcnZlclBvcnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUG9ydCBwb3J0ID0gKFNlcnZlclBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIFJldHVybiBvbmx5IGFuIEhUVFAgcG9ydCBmcm9tIHRoZSBzZWxlY3RlZCBTZXJ2aWNlCi0JCQlpZiAocG9ydC5nZXRQcm90b2NvbCgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJodHRwIikgJiYgcG9ydC5nZXRJZCgpLmluZGV4T2YoJy8nKSA8IDApCi0JCQkJcmV0dXJuIHBvcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pbWUgbWFwcGluZ3MuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1pbWVNYXBwaW5ncygpIHsKLQkJcmV0dXJuIHdlYkFwcERvY3VtZW50LmdldE1pbWVNYXBwaW5ncygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFNlcnZlclBvcnRzIHRoYXQgdGhpcyBjb25maWd1cmF0aW9uIHVzZXMuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmVyUG9ydHMoKSB7Ci0JCUxpc3QgcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCS8vIGZpcnN0IGFkZCBzZXJ2ZXIgcG9ydAotCQl0cnkgewotCQkJaW50IHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHNlcnZlci5nZXRQb3J0KCkpOwotCQkJcG9ydHMuYWRkKG5ldyBTZXJ2ZXJQb3J0KCJzZXJ2ZXIiLCBNZXNzYWdlcy5wb3J0U2VydmVyLCBwb3J0LCAiVENQSVAiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQotCQkvLyBhZGQgY29ubmVjdG9ycwotCQl0cnkgewotCQkJU3RyaW5nIGluc3RhbmNlU2VydmljZU5hbWUgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRTZXJ2aWNlKCkuZ2V0TmFtZSgpOwotCQkJaW50IHNpemUgPSBzZXJ2ZXIuZ2V0U2VydmljZUNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKGkpOwotCQkJCWludCBzaXplMiA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yQ291bnQoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yKGopOwotCQkJCQlTdHJpbmcgbmFtZSA9ICJIVFRQLzEuMSI7Ci0JCQkJCVN0cmluZyBwcm90b2NvbDIgPSAiSFRUUCI7Ci0JCQkJCWJvb2xlYW4gYWR2YW5jZWQgPSB0cnVlOwotCQkJCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBudWxsOwotCQkJCQlpbnQgcG9ydCA9IC0xOwotCQkJCQl0cnkgewotCQkJCQkJcG9ydCA9IEludGVnZXIucGFyc2VJbnQoY29ubmVjdG9yLmdldFBvcnQoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQlTdHJpbmcgcHJvdG9jb2wgPSBjb25uZWN0b3IuZ2V0UHJvdG9jb2woKTsKLQkJCQkJaWYgKHByb3RvY29sICE9IG51bGwgJiYgcHJvdG9jb2wubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlpZiAocHJvdG9jb2wuc3RhcnRzV2l0aCgiSFRUUCIpKSB7Ci0JCQkJCQkJbmFtZSA9IHByb3RvY29sOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAocHJvdG9jb2wuc3RhcnRzV2l0aCgiQUpQIikpIHsKLQkJCQkJCQluYW1lID0gcHJvdG9jb2w7Ci0JCQkJCQkJcHJvdG9jb2wyID0gIkFKUCI7IAotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gR2V0IFRvbWNhdCBlcXVpdmFsZW50IG5hbWUgaWYgcHJvdG9jb2wgaGFuZGxlciBjbGFzcyBzcGVjaWZpZWQKLQkJCQkJCQluYW1lID0gKFN0cmluZylwcm90b2NvbEhhbmRsZXJNYXAuZ2V0KHByb3RvY29sKTsKLQkJCQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIFByZXBhcmUgc2ltcGxlIHByb3RvY29sIHN0cmluZyBmb3IgU2VydmVyUG9ydCBwcm90b2NvbAotCQkJCQkJCQlpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoJy8nKTsKLQkJCQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCQkJCXByb3RvY29sMiA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJcHJvdG9jb2wyID0gbmFtZTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gU3BlY2lmaWVkIHByb3RvY29sIGlzIHVua25vd24sIGp1c3QgdXNlIGFzIGlzCi0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCW5hbWUgPSBwcm90b2NvbDsKLQkJCQkJCQkJcHJvdG9jb2wyID0gcHJvdG9jb2w7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChwcm90b2NvbDIudG9Mb3dlckNhc2UoKS5lcXVhbHMoImh0dHAiKSkKLQkJCQkJCWNvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7ICJ3ZWIiLCAid2Vic2VydmljZXMiIH07Ci0JCQkJCVN0cmluZyBzZWN1cmUgPSBjb25uZWN0b3IuZ2V0U2VjdXJlKCk7Ci0JCQkJCWlmIChzZWN1cmUgIT0gbnVsbCAmJiBzZWN1cmUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQluYW1lID0gIlNTTCI7Ci0JCQkJCQlwcm90b2NvbDIgPSAiU1NMIjsKLQkJCQkJfSBlbHNlCi0JCQkJCQlhZHZhbmNlZCA9IGZhbHNlOwotCQkJCQlTdHJpbmcgcG9ydElkOwotCQkJCQlpZiAoaW5zdGFuY2VTZXJ2aWNlTmFtZSAhPSBudWxsICYmIGluc3RhbmNlU2VydmljZU5hbWUuZXF1YWxzKHNlcnZpY2UuZ2V0TmFtZSgpKSkKLQkJCQkJCXBvcnRJZCA9IEludGVnZXIudG9TdHJpbmcoaik7Ci0JCQkJCWVsc2UKLQkJCQkJCXBvcnRJZCA9IGkgKyIvIiArIGo7Ci0JCQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydChwb3J0SWQsIG5hbWUsIHBvcnQsIHByb3RvY29sMiwgY29udGVudFR5cGVzLCBhZHZhbmNlZCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgc2VydmVyIHBvcnRzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIHBvcnRzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3ZWIgbW9kdWxlcyBpbiB0aGlzIHNlcnZlci4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViTW9kdWxlcygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQl0cnkgewotCQkJQ29udGV4dCBbXSBjb250ZXh0cyA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHRzKCk7Ci0JCQlpZiAoY29udGV4dHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJQ29udGV4dCBjb250ZXh0ID0gY29udGV4dHNbaV07Ci0JCQkJCVN0cmluZyByZWxvYWQgPSBjb250ZXh0LmdldFJlbG9hZGFibGUoKTsKLQkJCQkJaWYgKHJlbG9hZCA9PSBudWxsKQotCQkJCQkJcmVsb2FkID0gImZhbHNlIjsKLQkJCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUoY29udGV4dC5nZXRQYXRoKCksIAotCQkJCQkJY29udGV4dC5nZXREb2NCYXNlKCksIGNvbnRleHQuZ2V0U291cmNlKCksCi0JCQkJCQlyZWxvYWQuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpID8gdHJ1ZSA6IGZhbHNlKTsKLQkJCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIHByb2plY3QgcmVmcyIsIGUpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNnZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KElQYXRoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KElQYXRoIGJhc2VQYXRoKSB7Ci0JCXJldHVybiBzZXJ2ZXJJbnN0YW5jZS5nZXRIb3N0V29ya0RpcmVjdG9yeShiYXNlUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2dldENvbnRleHRXb3JrRGlyZWN0b3J5KElQYXRoLCBJVG9tY2F0V2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRDb250ZXh0V29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dChtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0V29ya0RpcmVjdG9yeShiYXNlUGF0aCwgY29udGV4dCk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJUGF0aCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDYpOwotCQkJCi0JCQkvLyBjaGVjayBmb3IgY2F0YWxpbmEucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2NS4wIGNvbmZpZwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSk7Ci0JCQlpbi5yZWFkKCk7Ci0JCQlpbi5jbG9zZSgpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCXNlcnZlckZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJc2VydmVyRmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCXNlcnZlciA9IChTZXJ2ZXIpIHNlcnZlckZhY3RvcnkubG9hZERvY3VtZW50KG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b0ZpbGUoKSkpOwotCQkJc2VydmVySW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2Uoc2VydmVyLCBudWxsLCBudWxsKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChwYXRoLmFwcGVuZCgid2ViLnhtbCIpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQl0b21jYXRVc2Vyc0RvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvRmlsZSgpKSkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCS8vIGxvYWQgcG9saWN5IGZpbGUKLQkJCXBvbGljeUZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCS8vIGxvYWQgcHJvcGVydGllcyBmaWxlCi0JCQlGaWxlIGZpbGUgPSBwYXRoLmFwcGVuZCgiY2F0YWxpbmEucHJvcGVydGllcyIpLnRvRmlsZSgpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJcHJvcGVydGllc0ZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJCWVsc2UKLQkJCQlwcm9wZXJ0aWVzRmlsZSA9IG51bGw7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIFRvbWNhdCB2NS4wIGNvbmZpZ3VyYXRpb24gZnJvbSAiICsgcGF0aC50b09TU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIHBhdGgudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2ltcG9ydEZyb21QYXRoKElQYXRoLCBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGltcG9ydEZyb21QYXRoKElQYXRoIHBhdGgsIGJvb2xlYW4gaXNUZXN0RW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9hZChwYXRoLCBtb25pdG9yKTsKLQkJCi0JCS8vIGZvciB0ZXN0IGVudmlyb25tZW50LCByZW1vdmUgZXhpc3RpbmcgY29udGV4dHMgc2luY2UgYSBzZXBhcmF0ZQotCQkvLyBjYXRhbGluYS5iYXNlIHdpbGwgYmUgdXNlZAotCQlpZiAoaXNUZXN0RW52KSB7Ci0JCQl3aGlsZSAoc2VydmVySW5zdGFuY2UucmVtb3ZlQ29udGV4dCgwKSkgewotCQkJCS8vIG5vLW9wCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJRm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDEwMDApOwotCQotCQkJLy8gY2hlY2sgZm9yIGNhdGFsaW5hLnBvbGljeSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgdjQuMCBjb25maWcKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgbnVsbCkpOwotCQotCQkJLy8gbG9hZCBzZXJ2ZXIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCUlucHV0U3RyZWFtIGluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJc2VydmVyRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJc2VydmVyID0gKFNlcnZlcikgc2VydmVyRmFjdG9yeS5sb2FkRG9jdW1lbnQoaW4pOwotCQkJc2VydmVySW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2Uoc2VydmVyLCBudWxsLCBudWxsKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIHdlYi54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpOwotCQkJd2ViQXBwRG9jdW1lbnQgPSBuZXcgV2ViQXBwRG9jdW1lbnQoZmlsZSk7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJLy8gbG9hZCB0b21jYXQtdXNlcnMueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInRvbWNhdC11c2Vycy54bWwiKTsKLQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCi0JCQl0b21jYXRVc2Vyc0RvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQotCQkJLy8gbG9hZCBjYXRhbGluYS5wb2xpY3kKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXBvbGljeUZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhpbik7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCi0JCQkvLyBsb2FkIGNhdGFsaW5hLnByb3BlcnRpZXMKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucHJvcGVydGllcyIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQlwcm9wZXJ0aWVzRmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKGluKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlwcm9wZXJ0aWVzRmlsZSA9IG51bGw7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2FuY2VsbGVkIik7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgcmVsb2FkIFRvbWNhdCB2NS4wIGNvbmZpZ3VyYXRpb24gZnJvbTogIiArIGZvbGRlci5nZXRGdWxsUGF0aCgpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICogQHBhcmFtIGZvcmNlRGlydHkgYm9vbGVhbgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmUoSVBhdGggcGF0aCwgYm9vbGVhbiBmb3JjZURpcnR5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIDQpOwotCQotCQkJLy8gbWFrZSBzdXJlIGRpcmVjdG9yeSBleGlzdHMKLQkJCWlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCWZvcmNlRGlydHkgPSB0cnVlOwotCQkJCXBhdGgudG9GaWxlKCkubWtkaXIoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQkvLyBzYXZlIGZpbGVzCi0JCQlpZiAoZm9yY2VEaXJ0eSB8fCBpc1NlcnZlckRpcnR5KSB7Ci0JCQkJc2VydmVyRmFjdG9yeS5zYXZlKHBhdGguYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9PU1N0cmluZygpKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gZmFsc2U7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShwYXRoLmFwcGVuZCgid2ViLnhtbCIpLnRvT1NTdHJpbmcoKSwgZm9yY2VEaXJ0eSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKGZvcmNlRGlydHkpCi0JCQkJWE1MVXRpbC5zYXZlKHBhdGguYXBwZW5kKCJ0b21jYXQtdXNlcnMueG1sIikudG9PU1N0cmluZygpLCB0b21jYXRVc2Vyc0RvY3VtZW50KTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAoZm9yY2VEaXJ0eSkgewotCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSkpOwotCQkJCWJ3LndyaXRlKHBvbGljeUZpbGUpOwotCQkJCWJ3LmNsb3NlKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCWlmIChwcm9wZXJ0aWVzRmlsZSAhPSBudWxsICYmIGZvcmNlRGlydHkpIHsKLQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihwYXRoLmFwcGVuZCgiY2F0YWxpbmEucHJvcGVydGllcyIpLnRvRmlsZSgpKSk7Ci0JCQkJYncud3JpdGUocHJvcGVydGllc0ZpbGUpOwotCQkJCWJ3LmNsb3NlKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgVG9tY2F0IHY1LjAgY29uZmlndXJhdGlvbiB0byAiICsgcGF0aCwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RTYXZlQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuICBBbGwgZmlsZXMgYXJlIGZvcmNlZCB0byBiZSBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBkZXNpbmF0aW9uIHBhdGggZm9yIHRoZSBmaWxlcwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNhdmUocGF0aCwgdHJ1ZSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgaW5mb3JtYXRpb24gaGVsZCBieSB0aGlzIG9iamVjdCB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqCi0JICogQHBhcmFtIGZvbGRlciBhIGZvbGRlcgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuc2F2aW5nVGFzaywgMTEwMCk7Ci0JCQkKLQkJCS8vIHNhdmUgc2VydmVyLnhtbAotCQkJYnl0ZVtdIGRhdGEgPSBzZXJ2ZXJGYWN0b3J5LmdldENvbnRlbnRzKCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAoaXNTZXJ2ZXJEaXJ0eSkKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkJZWxzZQotCQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJfSBlbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJaXNTZXJ2ZXJEaXJ0eSA9IGZhbHNlOwotCQkJCi0JCQkvLyBzYXZlIHdlYi54bWwKLQkJCXdlYkFwcERvY3VtZW50LnNhdmUoZm9sZGVyLmdldEZpbGUoIndlYi54bWwiKSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgdG9tY2F0LXVzZXJzLnhtbAotCQkJZGF0YSA9IFhNTFV0aWwuZ2V0Q29udGVudHModG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQotCQkJLy8gc2F2ZSBjYXRhbGluYS5wb2xpY3kKLQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBvbGljeUZpbGUuZ2V0Qnl0ZXMoKSk7Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnBvbGljeSIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQotCQkJLy8gc2F2ZSBjYXRhbGluYS5wcm9wZXJ0aWVzCi0JCQlpZiAocHJvcGVydGllc0ZpbGUgIT0gbnVsbCkgewotCQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHByb3BlcnRpZXNGaWxlLmdldEJ5dGVzKCkpOwotCQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucHJvcGVydGllcyIpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCWVsc2UKLQkJCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJfSBlbHNlCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgVG9tY2F0IHY1LjAgY29uZmlndXJhdGlvbiB0byAiICsgZm9sZGVyLnRvU3RyaW5nKCksIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZUNvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGhhc01EQkxpc3RlbmVyKFNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IGNvdW50ID0gc2VydmVyLmdldExpc3RlbmVyQ291bnQoKTsKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlMaXN0ZW5lciBsaXN0ZW5lciA9IHNlcnZlci5nZXRMaXN0ZW5lcihpKTsKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsICYmIGxpc3RlbmVyLmdldENsYXNzTmFtZSgpICE9IG51bGwgJiYgbGlzdGVuZXIuZ2V0Q2xhc3NOYW1lKCkuaW5kZXhPZigibWJlYW4iKSA+PSAwKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I2FkZE1pbWVNYXBwaW5nKGludCwgSU1pbWVNYXBwaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewotCQl3ZWJBcHBEb2N1bWVudC5hZGRNaW1lTWFwcGluZyhpbmRleCwgbWFwKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoQUREX01BUFBJTkdfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkV2ViTW9kdWxlKGludCwgSVRvbWNhdFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRXZWJNb2R1bGUoaW50IGluZGV4LCBJVG9tY2F0V2ViTW9kdWxlIG1vZHVsZSkgewotCQl0cnkgewotCQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuY3JlYXRlQ29udGV4dChpbmRleCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJY29udGV4dC5zZXREb2NCYXNlKG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSk7Ci0JCQkJY29udGV4dC5zZXRQYXRoKG1vZHVsZS5nZXRQYXRoKCkpOwotCQkJCWNvbnRleHQuc2V0UmVsb2FkYWJsZShtb2R1bGUuaXNSZWxvYWRhYmxlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCQlpZiAobW9kdWxlLmdldE1lbWVudG8oKSAhPSBudWxsICYmIG1vZHVsZS5nZXRNZW1lbnRvKCkubGVuZ3RoKCkgPiAwKQotCQkJCQljb250ZXh0LnNldFNvdXJjZShtb2R1bGUuZ2V0TWVtZW50bygpKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfV0VCX01PRFVMRV9QUk9QRVJUWSwgbnVsbCwgbW9kdWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGFkZGluZyB3ZWIgbW9kdWxlICIgKyBtb2R1bGUuZ2V0UGF0aCgpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoYW5nZSB0aGUgZXh0ZW5zaW9uIG9mIGEgbWltZSBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBtYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQubW9kaWZ5TWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IHRoZSBwb3J0IHdpdGggdGhlIGdpdmVuIGlkLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcG9ydCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlTZXJ2ZXJQb3J0KFN0cmluZyBpZCwgaW50IHBvcnQpIHsKLQkJdHJ5IHsKLQkJCWlmICgic2VydmVyIi5lcXVhbHMoaWQpKSB7Ci0JCQkJc2VydmVyLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfUE9SVF9QUk9QRVJUWSwgaWQsIG5ldyBJbnRlZ2VyKHBvcnQpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCi0JCQlpbnQgaSA9IGlkLmluZGV4T2YoIi8iKTsKLQkJCS8vIElmIGEgY29ubmVjdG9yIGluIHRoZSBpbnN0YW5jZSBTZXJ2aWNlCi0JCQlpZiAoaSA8IDApIHsKLQkJCQlpbnQgY29ubk51bSA9IEludGVnZXIucGFyc2VJbnQoaWQpOwotCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb25uZWN0b3IoY29ubk51bSk7Ci0JCQkJaWYgKGNvbm5lY3RvciAhPSBudWxsKSB7Ci0JCQkJCWNvbm5lY3Rvci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfUE9SVF9QUk9QRVJUWSwgaWQsIG5ldyBJbnRlZ2VyKHBvcnQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBFbHNlIGEgY29ubmVjdG9yIGluIGFub3RoZXIgU2VydmljZQotCQkJZWxzZSB7Ci0JCQkJaW50IHNlcnZOdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGlkLnN1YnN0cmluZygwLCBpKSk7Ci0JCQkJaW50IGNvbm5OdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGlkLnN1YnN0cmluZyhpICsgMSkpOwotCQkJCQotCQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKHNlcnZOdW0pOwotCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2aWNlLmdldENvbm5lY3Rvcihjb25uTnVtKTsKLQkJCQljb25uZWN0b3Iuc2V0UG9ydChwb3J0ICsgIiIpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJfQotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBtb2RpZnlpbmcgc2VydmVyIHBvcnQgIiArIGlkLCBlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBDaGFuZ2UgYSB3ZWIgbW9kdWxlLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKiBAcGFyYW0gZG9jQmFzZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhdGggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByZWxvYWRhYmxlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlXZWJNb2R1bGUoaW50IGluZGV4LCBTdHJpbmcgZG9jQmFzZSwgU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVsb2FkYWJsZSkgewotCQl0cnkgewotCQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dChpbmRleCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJY29udGV4dC5zZXRQYXRoKHBhdGgpOwotCQkJCWNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKLQkJCQljb250ZXh0LnNldFJlbG9hZGFibGUocmVsb2FkYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKHBhdGgsIGRvY0Jhc2UsIG51bGwsIHJlbG9hZGFibGUpOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9XRUJfTU9EVUxFX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1vZHVsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBtb2RpZnlpbmcgd2ViIG1vZHVsZSAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIG1pbWUgbWFwcGluZy4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWltZU1hcHBpbmcoaW50IGluZGV4KSB7Ci0JCXdlYkFwcERvY3VtZW50LnJlbW92ZU1pbWVNYXBwaW5nKGluZGV4KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUkVNT1ZFX01BUFBJTkdfUFJPUEVSVFksIG51bGwsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHdlYiBtb2R1bGUuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVdlYk1vZHVsZShpbnQgaW5kZXgpIHsKLQkJdHJ5IHsKLQkJCXNlcnZlckluc3RhbmNlLnJlbW92ZUNvbnRleHQoaW5kZXgpOwotCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChSRU1PVkVfV0VCX01PRFVMRV9QUk9QRVJUWSwgbnVsbCwgbmV3IEludGVnZXIoaW5kZXgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlbW92aW5nIG1vZHVsZSByZWYgIiArIGluZGV4LCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gTUVUQS1JTkYvY29udGV4dC54bWwgZmlsZXMKLQkgKiBwcmVzZW50IGluIHByb2plY3RzIHRvIHB1Ymxpc2hlZCBzZXJ2ZXIueG1sLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIHBhdGggdG8gY2F0YWxpbmEgaW5zdGFuY2UgZGlyZWN0b3J5Ci0JICogQHBhcmFtIGRlcGxveURpciBwYXRoIHRvIGRlcGxveW1lbnQgZGlyZWN0b3J5Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIG9yIG51bGwKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBwdWJsaXNoQ29udGV4dENvbmZpZyhJUGF0aCBiYXNlRGlyLCBJUGF0aCBkZXBsb3lEaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5wdWJsaXNoQ2F0YWxpbmFDb250ZXh0Q29uZmlnKGJhc2VEaXIsIGRlcGxveURpciwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGNvbnRleHRzIGluIHNlcnZlci54bWwgdG8gc2VydmUgcHJvamVjdHMgZGlyZWN0bHkgd2l0aG91dAotCSAqIHB1Ymxpc2hpbmcuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBjYXRhbGluYSBpbnN0YW5jZSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHVwZGF0ZUNvbnRleHRzVG9TZXJ2ZURpcmVjdGx5KElQYXRoIGJhc2VEaXIsIFN0cmluZyBsb2FkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci51cGRhdGVDb250ZXh0c1RvU2VydmVEaXJlY3RseShiYXNlRGlyLCBsb2FkZXIsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIENsZWFudXAgdGhlIHNlcnZlciBpbnN0YW5jZS4gIFRoaXMgY29uc2lzdHMgb2YgZGVsZXRpbmcgdGhlIHdvcmsKLQkgKiBkaXJlY3RvcnkgYXNzb2NpYXRlZCB3aXRoIENvbnRleHRzIHRoYXQgYXJlIGdvaW5nIGF3YXkgaW4gdGhlCi0JICogdXAgY29taW5nIHB1Ymxpc2guICBJbiBhZGRpdGlvbiwgQ29udGV4dCBYTUwgZmlsZXMgd2hpY2ggbWF5IGhhdmUgYmVlbgotCSAqIGNyZWF0ZWQgZm9yIHRoZXNlIENvbnRleHRzIGFyZSBhbHNvIGRlbGV0ZWQuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBzZXJ2ZXIgaW5zdGFuY2UgZGlyZWN0b3J5LCBpLmUuIGNhdGFsaW5hLmJhc2UKLQkgKiBAcGFyYW0gaW5zdGFsbERpciBwYXRoIHRvIHNlcnZlciBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IChub3QgY3VycmVudGx5IHVzZWQpCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIG9yIG51bGwKLQkgKiBAcmV0dXJuIE11bHRpU3RhdHVzIGNvbnRhaW5pbmcgcmVzdWx0cyBvZiB0aGUgY2xlYW51cCBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBjbGVhbnVwU2VydmVyKElQYXRoIGJhc2VEaXIsIElQYXRoIGluc3RhbGxEaXIsIGJvb2xlYW4gcmVtb3ZlS2VwdENvbnRleHRGaWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgbW9kdWxlcyA9IGdldFdlYk1vZHVsZXMoKTsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuY2xlYW51cENhdGFsaW5hU2VydmVyKGJhc2VEaXIsIGluc3RhbGxEaXIsIGZhbHNlLCBtb2R1bGVzLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9jYWxpemVDb25maWd1cmF0aW9uKElQYXRoLCBJUGF0aCwgVG9tY2F0U2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxvY2FsaXplQ29uZmlndXJhdGlvbihJUGF0aCBiYXNlRGlyLCBJUGF0aCBkZXBsb3lEaXIsIFRvbWNhdFNlcnZlciB0b21jYXRTZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5sb2NhbGl6ZUNvbmZpZ3VyYXRpb24oYmFzZURpciwgZGVwbG95RGlyLCB0b21jYXRTZXJ2ZXIsIG1vbml0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NTBIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDUwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzk4NGYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NTBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBUb21jYXQgNTAgaGFuZGxlci4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDUwSGFuZGxlciBpbXBsZW1lbnRzIElUb21jYXRWZXJzaW9uSGFuZGxlciB7Ci0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJcmV0dXJuIFRvbWNhdFBsdWdpbi52ZXJpZnlJbnN0YWxsUGF0aFdpdGhGb2xkZXJDaGVjayhpbnN0YWxsUGF0aCwgVG9tY2F0UGx1Z2luLlRPTUNBVF81MCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVDbGFzcygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UnVudGltZUNsYXNzcGF0aChJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlMaXN0IGNwID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJLy8gNS4wIC0gYWRkIGJvb3RzdHJhcC5qYXIgZnJvbSB0aGUgVG9tY2F0IGJpbiBkaXJlY3RvcnkKLQkJSVBhdGggYmluUGF0aCA9IGluc3RhbGxQYXRoLmFwcGVuZCgiYmluIik7Ci0JCWlmIChiaW5QYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQlJUGF0aCBwYXRoID0gYmluUGF0aC5hcHBlbmQoImJvb3RzdHJhcC5qYXIiKTsKLQkJCWNwLmFkZChKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KHBhdGgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElQYXRoLCBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhJUGF0aCBjb25maWdQYXRoLCBib29sZWFuIGRlYnVnLCBib29sZWFuIHN0YXJ0aW5nKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWlmIChkZWJ1ZykKLQkJCWxpc3QuYWRkKCItZGVidWciKTsKLQkJCi0JCWlmIChzdGFydGluZykKLQkJCWxpc3QuYWRkKCJzdGFydCIpOwotCQllbHNlCi0JCQlsaXN0LmFkZCgic3RvcCIpOwotCQkKLQkJU3RyaW5nW10gdGVtcCA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkodGVtcCk7Ci0JCXJldHVybiB0ZW1wOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuIGRlYnVnLCBib29sZWFuIHN0YXJ0aW5nKSB7Ci0JCWlmICghZGVidWcpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nIFtdIHsgIi1kZWJ1ZyIgfTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVZNQXJndW1lbnRzKElQYXRoLCBJUGF0aCwgSVBhdGgsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVWTUFyZ3VtZW50cyhJUGF0aCBpbnN0YWxsUGF0aCwgSVBhdGggY29uZmlnUGF0aCwgSVBhdGggZGVwbG95UGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0Q2F0YWxpbmFWTUFyZ3VtZW50cyhpbnN0YWxsUGF0aCwgY29uZmlnUGF0aCwgZGVwbG95UGF0aCwgZ2V0RW5kb3JzZWREaXJlY3RvcmllcyhpbnN0YWxsUGF0aCksIGlzVGVzdEVudik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVBvbGljeUZpbGUoSVBhdGgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lUG9saWN5RmlsZShJUGF0aCBjb25maWdQYXRoKSB7Ci0JCXJldHVybiBjb25maWdQYXRoLmFwcGVuZCgiY29uZiIpLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9PU1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2NhbkFkZE1vZHVsZShJTW9kdWxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbkFkZE1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotCQlTdHJpbmcgdmVyc2lvbiA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0VmVyc2lvbigpOwotCQlpZiAoIjIuMiIuZXF1YWxzKHZlcnNpb24pIHx8ICIyLjMiLmVxdWFscyh2ZXJzaW9uKSB8fCAiMi40Ii5lcXVhbHModmVyc2lvbikpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yU3BlYzUwLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQmFzZURpcmVjdG9yeShUb21jYXRTZXJ2ZXIpCi0JICovCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KFRvbWNhdFNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0U3RhbmRhcmRCYXNlRGlyZWN0b3J5KHNlcnZlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjcHJlcGFyZVJ1bnRpbWVEaXJlY3RvcnkoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlcGFyZVJ1bnRpbWVEaXJlY3RvcnkoSVBhdGggYmFzZURpcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5jcmVhdGVDYXRhbGluYUluc3RhbmNlRGlyZWN0b3J5KGJhc2VEaXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVEZXBsb3lEaXJlY3RvcnkoSVBhdGgpCi0JICovCi0JcHVibGljIElTdGF0dXMgcHJlcGFyZURlcGxveURpcmVjdG9yeShJUGF0aCBkZXBsb3lQYXRoKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmNyZWF0ZURlcGxveW1lbnREaXJlY3RvcnkoZGVwbG95UGF0aCwKLQkJCQlUb21jYXRWZXJzaW9uSGVscGVyLkRFRkFVTFRfV0VCWE1MX1NFUlZMRVQyNCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVGb3JTZXJ2aW5nRGlyZWN0bHkoSVBhdGgsIFRvbWNhdFNlcnZlcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcmVwYXJlRm9yU2VydmluZ0RpcmVjdGx5KElQYXRoIGJhc2VEaXIsIFRvbWNhdFNlcnZlciBzZXJ2ZXIpIHsKLQkJSVN0YXR1cyBzdGF0dXM7Ci0JCS8vIElmIHNlcnZpbmcgbW9kdWxlcyB3aXRob3V0IHB1Ymxpc2hpbmcsIGxvYWRlciBqYXIgaXMgbmVlZGVkCi0JCWlmIChzZXJ2ZXIuaXNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpKSB7Ci0JCQlzdGF0dXMgPSBUb21jYXRWZXJzaW9uSGVscGVyLmNvcHlMb2FkZXJKYXIoCi0JCQkJCWdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KHNlcnZlcikuYXBwZW5kKCJzZXJ2ZXIvbGliIiksCi0JCQkJCXNlcnZlci5nZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCS8vIElmIGNvcHkgc3VjY2Vzc2Z1bCBhbmQgcnVubmluZyBhIHNlcGFyYXRlIHNlcnZlciBpbnN0YW5jZSwgbW9kaWZ5IGNhdGFsaW5hLnByb3BlcnRpZXMKLQkJCWlmIChzdGF0dXMuaXNPSygpICYmIHNlcnZlci5pc1Rlc3RFbnZpcm9ubWVudCgpKSB7Ci0JCQkJc3RhdHVzID0gVG9tY2F0VmVyc2lvbkhlbHBlci51cGRhdGVQcm9wZXJ0aWVzVG9TZXJ2ZURpcmVjdGx5KGJhc2VEaXIsICJzZXJ2ZXIvbGliIiwgInNlcnZlciIpOwotCQkJfQotCQl9Ci0JCS8vIEVsc2UgZW5zdXJlIGphciBpcyByZW1vdmVkCi0JCWVsc2UgewotCQkJVG9tY2F0VmVyc2lvbkhlbHBlci5yZW1vdmVMb2FkZXJKYXIoCi0JCQkJCWdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KHNlcnZlcikuYXBwZW5kKCJzZXJ2ZXIvbGliIiksCi0JCQkJCXNlcnZlci5nZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCS8vIFRPRE8gRGVjaWRlIHdoYXQgdG8gZG8gd2l0aCByZW1vdmFsIHdhcm5pbmcsIG1heWJlIG5vdGhpbmcKLQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0U2hhcmVkTG9hZGVyKElQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcmVkTG9hZGVyKElQYXRoIGJhc2VEaXIpIHsKLQkJLy8gVXNlIHNoYXJlZCBsb2FkZXIKLQkJcmV0dXJuICJzaGFyZWQiOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgc2luY2UgVG9tY2F0IDUueCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiB0cnVlIHNpbmNlIGZlYXR1cmUgaXMgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjc3VwcG9ydHNEZWJ1Z0FyZ3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RlYnVnQXJndW1lbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNzdXBwb3J0c1NlcGFyYXRlQ29udGV4dEZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcGFyYXRlQ29udGV4dEZpbGVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRFbmRvcnNlZERpcmVjdG9yaWVzKElQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kb3JzZWREaXJlY3RvcmllcyhJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlyZXR1cm4gaW5zdGFsbFBhdGguYXBwZW5kKCJjb21tb24iKS5hcHBlbmQoImVuZG9yc2VkIikudG9PU1N0cmluZygpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDU1Q29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ1NUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiMjY5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDU1Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuU2VydmVySW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotLyoqCi0gKiBUb21jYXQgdjUuNSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDU1Q29uZmlndXJhdGlvbiBleHRlbmRzIFRvbWNhdENvbmZpZ3VyYXRpb24gewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRSA9ICJDYXRhbGluYSI7Ci0JcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIFNlcnZlckluc3RhbmNlIHNlcnZlckluc3RhbmNlOwotCXByb3RlY3RlZCBGYWN0b3J5IHNlcnZlckZhY3Rvcnk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXJ2ZXJEaXJ0eTsKLQotCXByb3RlY3RlZCBXZWJBcHBEb2N1bWVudCB3ZWJBcHBEb2N1bWVudDsKLQotCXByb3RlY3RlZCBEb2N1bWVudCBjb250ZXh0RG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgdG9tY2F0VXNlcnNEb2N1bWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgcG9saWN5RmlsZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHJvcGVydGllc0ZpbGU7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1hcCBwcm90b2NvbEhhbmRsZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXN0YXRpYyB7Ci0JCXByb3RvY29sSGFuZGxlck1hcC5wdXQoIm9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5IdHRwMTFQcm90b2NvbCIsICJIVFRQLzEuMSIpOwotCQlwcm90b2NvbEhhbmRsZXJNYXAucHV0KCJvcmcuYXBhY2hlLmNveW90ZS5odHRwMTEuSHR0cDExQXByUHJvdG9jb2wiLCAiSFRUUC8xLjEiKTsKLQkJcHJvdG9jb2xIYW5kbGVyTWFwLnB1dCgib3JnLmFwYWNoZS5jb3lvdGUuYWpwLkFqcEFwclByb3RvY29sIiwgIkFKUC8xLjMiKTsKLQkJcHJvdG9jb2xIYW5kbGVyTWFwLnB1dCgib3JnLmFwYWNoZS5qay5zZXJ2ZXIuSmtDb3lvdGVIYW5kbGVyIiwgIkFKUC8xLjMiKTsKLQl9Ci0JCi0JLyoqCi0JICogVG9tY2F0NTVDb25maWd1cmF0aW9uIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqLwotCXB1YmxpYyBUb21jYXQ1NUNvbmZpZ3VyYXRpb24oSUZvbGRlciBwYXRoKSB7Ci0JCXN1cGVyKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcG9ydCBudW1iZXIuCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyUG9ydCBnZXRNYWluUG9ydCgpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTZXJ2ZXJQb3J0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclBvcnQgcG9ydCA9IChTZXJ2ZXJQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvLyBSZXR1cm4gb25seSBhbiBIVFRQIHBvcnQgZnJvbSB0aGUgc2VsZWN0ZWQgU2VydmljZQotCQkJaWYgKHBvcnQuZ2V0UHJvdG9jb2woKS50b0xvd2VyQ2FzZSgpLmVxdWFscygiaHR0cCIpICYmIHBvcnQuZ2V0SWQoKS5pbmRleE9mKCcvJykgPCAwKQotCQkJCXJldHVybiBwb3J0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtaW1lIG1hcHBpbmdzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNaW1lTWFwcGluZ3MoKSB7Ci0JCXJldHVybiB3ZWJBcHBEb2N1bWVudC5nZXRNaW1lTWFwcGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBTZXJ2ZXJQb3J0cyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiB1c2VzLgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZlclBvcnRzKCkgewotCQlMaXN0IHBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQkvLyBmaXJzdCBhZGQgc2VydmVyIHBvcnQKLQkJdHJ5IHsKLQkJCWludCBwb3J0ID0gSW50ZWdlci5wYXJzZUludChzZXJ2ZXIuZ2V0UG9ydCgpKTsKLQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydCgic2VydmVyIiwgTWVzc2FnZXMucG9ydFNlcnZlciwgcG9ydCwgIlRDUElQIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkKLQkJLy8gYWRkIGNvbm5lY3RvcnMKLQkJdHJ5IHsKLQkJCVN0cmluZyBpbnN0YW5jZVNlcnZpY2VOYW1lID0gc2VydmVySW5zdGFuY2UuZ2V0U2VydmljZSgpLmdldE5hbWUoKTsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpbnQgc2l6ZTIgPSBzZXJ2aWNlLmdldENvbm5lY3RvckNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2aWNlLmdldENvbm5lY3RvcihqKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSAiSFRUUC8xLjEiOwotCQkJCQlTdHJpbmcgcHJvdG9jb2wyID0gIkhUVFAiOwotCQkJCQlib29sZWFuIGFkdmFuY2VkID0gdHJ1ZTsKLQkJCQkJU3RyaW5nW10gY29udGVudFR5cGVzID0gbnVsbDsKLQkJCQkJaW50IHBvcnQgPSAtMTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGNvbm5lY3Rvci5nZXRQb3J0KCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQkJU3RyaW5nIHByb3RvY29sID0gY29ubmVjdG9yLmdldFByb3RvY29sKCk7Ci0JCQkJCWlmIChwcm90b2NvbCAhPSBudWxsICYmIHByb3RvY29sLmxlbmd0aCgpID4gMCkgewotCQkJCQkJaWYgKHByb3RvY29sLnN0YXJ0c1dpdGgoIkhUVFAiKSkgewotCQkJCQkJCW5hbWUgPSBwcm90b2NvbDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHByb3RvY29sLnN0YXJ0c1dpdGgoIkFKUCIpKSB7Ci0JCQkJCQkJbmFtZSA9IHByb3RvY29sOwotCQkJCQkJCXByb3RvY29sMiA9ICJBSlAiOyAKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIEdldCBUb21jYXQgZXF1aXZhbGVudCBuYW1lIGlmIHByb3RvY29sIGhhbmRsZXIgY2xhc3Mgc3BlY2lmaWVkCi0JCQkJCQkJbmFtZSA9IChTdHJpbmcpcHJvdG9jb2xIYW5kbGVyTWFwLmdldChwcm90b2NvbCk7Ci0JCQkJCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBQcmVwYXJlIHNpbXBsZSBwcm90b2NvbCBzdHJpbmcgZm9yIFNlcnZlclBvcnQgcHJvdG9jb2wKLQkJCQkJCQkJaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCcvJyk7Ci0JCQkJCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCQkJCQlwcm90b2NvbDIgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCXByb3RvY29sMiA9IG5hbWU7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIFNwZWNpZmllZCBwcm90b2NvbCBpcyB1bmtub3duLCBqdXN0IHVzZSBhcyBpcwotCQkJCQkJCWVsc2UgewotCQkJCQkJCQluYW1lID0gcHJvdG9jb2w7Ci0JCQkJCQkJCXByb3RvY29sMiA9IHByb3RvY29sOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocHJvdG9jb2wyLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJodHRwIikpCi0JCQkJCQljb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW10geyAid2ViIiwgIndlYnNlcnZpY2VzIiB9OwotCQkJCQlTdHJpbmcgc2VjdXJlID0gY29ubmVjdG9yLmdldFNlY3VyZSgpOwotCQkJCQlpZiAoc2VjdXJlICE9IG51bGwgJiYgc2VjdXJlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJbmFtZSA9ICJTU0wiOwotCQkJCQkJcHJvdG9jb2wyID0gIlNTTCI7Ci0JCQkJCX0gZWxzZQotCQkJCQkJYWR2YW5jZWQgPSBmYWxzZTsKLQkJCQkJU3RyaW5nIHBvcnRJZDsKLQkJCQkJaWYgKGluc3RhbmNlU2VydmljZU5hbWUgIT0gbnVsbCAmJiBpbnN0YW5jZVNlcnZpY2VOYW1lLmVxdWFscyhzZXJ2aWNlLmdldE5hbWUoKSkpCi0JCQkJCQlwb3J0SWQgPSBJbnRlZ2VyLnRvU3RyaW5nKGopOwotCQkJCQllbHNlCi0JCQkJCQlwb3J0SWQgPSBpICsiLyIgKyBqOwotCQkJCQlwb3J0cy5hZGQobmV3IFNlcnZlclBvcnQocG9ydElkLCBuYW1lLCBwb3J0LCBwcm90b2NvbDIsIGNvbnRlbnRUeXBlcywgYWR2YW5jZWQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIHNlcnZlciBwb3J0cyIsIGUpOwotCQl9Ci0JCXJldHVybiBwb3J0czsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgd2ViIG1vZHVsZXMgaW4gdGhpcyBzZXJ2ZXIuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdlYk1vZHVsZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJdHJ5IHsKLQkJCUNvbnRleHQgW10gY29udGV4dHMgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0cygpOwotCQkJaWYgKGNvbnRleHRzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUNvbnRleHQgY29udGV4dCA9IGNvbnRleHRzW2ldOwotCQkJCQlTdHJpbmcgcmVsb2FkID0gY29udGV4dC5nZXRSZWxvYWRhYmxlKCk7Ci0JCQkJCWlmIChyZWxvYWQgPT0gbnVsbCkKLQkJCQkJCXJlbG9hZCA9ICJmYWxzZSI7Ci0JCQkJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKGNvbnRleHQuZ2V0UGF0aCgpLCAKLQkJCQkJCWNvbnRleHQuZ2V0RG9jQmFzZSgpLCBjb250ZXh0LmdldFNvdXJjZSgpLAotCQkJCQkJcmVsb2FkLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSA/IHRydWUgOiBmYWxzZSk7Ci0JCQkJCWxpc3QuYWRkKG1vZHVsZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZ2V0dGluZyBwcm9qZWN0IHJlZnMiLCBlKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jZ2V0U2VydmVyV29ya0RpcmVjdG9yeShJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0U2VydmVyV29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCkgewotCQlyZXR1cm4gc2VydmVySW5zdGFuY2UuZ2V0SG9zdFdvcmtEaXJlY3RvcnkoYmFzZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNnZXRDb250ZXh0V29ya0RpcmVjdG9yeShJUGF0aCwgSVRvbWNhdFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCUNvbnRleHQgY29udGV4dCA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHQobW9kdWxlLmdldFBhdGgoKSk7Ci0JCWlmIChjb250ZXh0ICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoYmFzZVBhdGgsIGNvbnRleHQpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvYWQoSVBhdGgsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmxvYWRpbmdUYXNrLCA3KTsKLQkJCQotCQkJLy8gY2hlY2sgZm9yIGNhdGFsaW5hLnBvbGljeSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgdjUuNSBjb25maWcKLQkJCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpOwotCQkJaW4ucmVhZCgpOwotCQkJaW4uY2xvc2UoKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQlzZXJ2ZXJGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCXNlcnZlckZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlzZXJ2ZXIgPSAoU2VydmVyKSBzZXJ2ZXJGYWN0b3J5LmxvYWREb2N1bWVudChuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9GaWxlKCkpKTsKLQkJCXNlcnZlckluc3RhbmNlID0gbmV3IFNlcnZlckluc3RhbmNlKHNlcnZlciwgbnVsbCwgbnVsbCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJd2ViQXBwRG9jdW1lbnQgPSBuZXcgV2ViQXBwRG9jdW1lbnQocGF0aC5hcHBlbmQoIndlYi54bWwiKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJLy8gbG9hZCBjb250ZXh0LnhtbCBmaWxlCi0JCQlGaWxlIGZpbGUgPSBwYXRoLmFwcGVuZCgiY29udGV4dC54bWwiKS50b0ZpbGUoKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCWNvbnRleHREb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpKTsKLQkJCWVsc2UKLQkJCQljb250ZXh0RG9jdW1lbnQgPSBudWxsOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCXRvbWNhdFVzZXJzRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJ0b21jYXQtdXNlcnMueG1sIikudG9GaWxlKCkpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJLy8gbG9hZCBwb2xpY3kgZmlsZQotCQkJcG9saWN5RmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvRmlsZSgpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJLy8gbG9hZCBwcm9wZXJ0aWVzIGZpbGUKLQkJCWZpbGUgPSBwYXRoLmFwcGVuZCgiY2F0YWxpbmEucHJvcGVydGllcyIpLnRvRmlsZSgpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJcHJvcGVydGllc0ZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJCWVsc2UKLQkJCQlwcm9wZXJ0aWVzRmlsZSA9IG51bGw7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIFRvbWNhdCB2NS41IGNvbmZpZ3VyYXRpb24gZnJvbSAiICsgcGF0aC50b09TU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIHBhdGgudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2ltcG9ydEZyb21QYXRoKElQYXRoLCBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGltcG9ydEZyb21QYXRoKElQYXRoIHBhdGgsIGJvb2xlYW4gaXNUZXN0RW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9hZChwYXRoLCBtb25pdG9yKTsKLQkJCi0JCS8vIGZvciB0ZXN0IGVudmlyb25tZW50LCByZW1vdmUgZXhpc3RpbmcgY29udGV4dHMgc2luY2UgYSBzZXBhcmF0ZQotCQkvLyBjYXRhbGluYS5iYXNlIHdpbGwgYmUgdXNlZAotCQlpZiAoaXNUZXN0RW52KSB7Ci0JCQl3aGlsZSAoc2VydmVySW5zdGFuY2UucmVtb3ZlQ29udGV4dCgwKSkgewotCQkJCS8vIG5vLW9wCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJRm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDEyMDApOwotCQotCQkJLy8gY2hlY2sgZm9yIGNhdGFsaW5hLnBvbGljeSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgdjQuMCBjb25maWcKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgbnVsbCkpOwotCQotCQkJLy8gbG9hZCBzZXJ2ZXIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCUlucHV0U3RyZWFtIGluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJc2VydmVyRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJc2VydmVyID0gKFNlcnZlcikgc2VydmVyRmFjdG9yeS5sb2FkRG9jdW1lbnQoaW4pOwotCQkJc2VydmVySW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2Uoc2VydmVyLCBudWxsLCBudWxsKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIHdlYi54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpOwotCQkJd2ViQXBwRG9jdW1lbnQgPSBuZXcgV2ViQXBwRG9jdW1lbnQoZmlsZSk7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJLy8gbG9hZCBjb250ZXh0LnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjb250ZXh0LnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQljb250ZXh0RG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOwotCQkJfQotCQkJZWxzZQotCQkJCWNvbnRleHREb2N1bWVudCA9IG51bGw7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkKLQkJCS8vIGxvYWQgdG9tY2F0LXVzZXJzLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ0b21jYXQtdXNlcnMueG1sIik7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQotCQkJdG9tY2F0VXNlcnNEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkKLQkJCS8vIGxvYWQgY2F0YWxpbmEucG9saWN5Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnBvbGljeSIpOwotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlwb2xpY3lGaWxlID0gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRGaWxlQ29udGVudHMoaW4pOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgY2F0YWxpbmEucHJvcGVydGllcwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wcm9wZXJ0aWVzIik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCXByb3BlcnRpZXNGaWxlID0gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRGaWxlQ29udGVudHMoaW4pOwotCQkJfQotCQkJZWxzZQotCQkJCXByb3BlcnRpZXNGaWxlID0gbnVsbDsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDYW5jZWxsZWQiKTsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCByZWxvYWQgVG9tY2F0IHY1LjUgY29uZmlndXJhdGlvbiBmcm9tOiAiICsgZm9sZGVyLmdldEZ1bGxQYXRoKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIGZvbGRlci5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSksIGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKiBAcGFyYW0gZm9yY2VEaXJ0eSBib29sZWFuCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShJUGF0aCBwYXRoLCBib29sZWFuIGZvcmNlRGlydHksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuc2F2aW5nVGFzaywgNSk7Ci0JCQkKLQkJCS8vIG1ha2Ugc3VyZSBkaXJlY3RvcnkgZXhpc3RzCi0JCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQlmb3JjZURpcnR5ID0gdHJ1ZTsKLQkJCQlwYXRoLnRvRmlsZSgpLm1rZGlyKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJLy8gc2F2ZSBmaWxlcwotCQkJaWYgKGZvcmNlRGlydHkgfHwgaXNTZXJ2ZXJEaXJ0eSkgewotCQkJCXNlcnZlckZhY3Rvcnkuc2F2ZShwYXRoLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IGZhbHNlOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCXdlYkFwcERvY3VtZW50LnNhdmUocGF0aC5hcHBlbmQoIndlYi54bWwiKS50b09TU3RyaW5nKCksIGZvcmNlRGlydHkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChmb3JjZURpcnR5ICYmIGNvbnRleHREb2N1bWVudCAhPSBudWxsKQotCQkJCVhNTFV0aWwuc2F2ZShwYXRoLmFwcGVuZCgiY29udGV4dC54bWwiKS50b09TU3RyaW5nKCksIGNvbnRleHREb2N1bWVudCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKGZvcmNlRGlydHkpCi0JCQkJWE1MVXRpbC5zYXZlKHBhdGguYXBwZW5kKCJ0b21jYXQtdXNlcnMueG1sIikudG9PU1N0cmluZygpLCB0b21jYXRVc2Vyc0RvY3VtZW50KTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAoZm9yY2VEaXJ0eSkgewotCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSkpOwotCQkJCWJ3LndyaXRlKHBvbGljeUZpbGUpOwotCQkJCWJ3LmNsb3NlKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCWlmIChwcm9wZXJ0aWVzRmlsZSAhPSBudWxsICYmIGZvcmNlRGlydHkpIHsKLQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihwYXRoLmFwcGVuZCgiY2F0YWxpbmEucHJvcGVydGllcyIpLnRvRmlsZSgpKSk7Ci0JCQkJYncud3JpdGUocHJvcGVydGllc0ZpbGUpOwotCQkJCWJ3LmNsb3NlKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgVG9tY2F0IHY1LjUgY29uZmlndXJhdGlvbiB0byAiICsgcGF0aCwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RTYXZlQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuICBBbGwgZmlsZXMgYXJlIGZvcmNlZCB0byBiZSBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBkZXNpbmF0aW9uIHBhdGggZm9yIHRoZSBmaWxlcwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNhdmUocGF0aCwgdHJ1ZSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgaW5mb3JtYXRpb24gaGVsZCBieSB0aGlzIG9iamVjdCB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqCi0JICogQHBhcmFtIGZvbGRlciBhIGZvbGRlcgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuc2F2aW5nVGFzaywgMTIwMCk7Ci0JCQkKLQkJCS8vIHNhdmUgc2VydmVyLnhtbAotCQkJYnl0ZVtdIGRhdGEgPSBzZXJ2ZXJGYWN0b3J5LmdldENvbnRlbnRzKCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAoaXNTZXJ2ZXJEaXJ0eSkKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkJZWxzZQotCQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJfSBlbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJaXNTZXJ2ZXJEaXJ0eSA9IGZhbHNlOwotCQkJCi0JCQkvLyBzYXZlIHdlYi54bWwKLQkJCXdlYkFwcERvY3VtZW50LnNhdmUoZm9sZGVyLmdldEZpbGUoIndlYi54bWwiKSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgY29udGV4dC54bWwKLQkJCWlmIChjb250ZXh0RG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWRhdGEgPSBYTUxVdGlsLmdldENvbnRlbnRzKGNvbnRleHREb2N1bWVudCk7Ci0JCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjb250ZXh0LnhtbCIpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCWVsc2UKLQkJCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJfQotCQkJCi0JCQkvLyBzYXZlIHRvbWNhdC11c2Vycy54bWwKLQkJCWRhdGEgPSBYTUxVdGlsLmdldENvbnRlbnRzKHRvbWNhdFVzZXJzRG9jdW1lbnQpOwotCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInRvbWNhdC11c2Vycy54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgY2F0YWxpbmEucG9saWN5Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwb2xpY3lGaWxlLmdldEJ5dGVzKCkpOwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkKLQkJCS8vIHNhdmUgY2F0YWxpbmEucHJvcGVydGllcwotCQkJaWYgKHByb3BlcnRpZXNGaWxlICE9IG51bGwpIHsKLQkJCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwcm9wZXJ0aWVzRmlsZS5nZXRCeXRlcygpKTsKLQkJCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnByb3BlcnRpZXMiKTsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQllbHNlCi0JCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCX0gZWxzZQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFRvbWNhdCB2NS41IGNvbmZpZ3VyYXRpb24gdG8gIiArIGZvbGRlci50b1N0cmluZygpLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNNREJMaXN0ZW5lcihTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWludCBjb3VudCA9IHNlcnZlci5nZXRMaXN0ZW5lckNvdW50KCk7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBzZXJ2ZXIuZ2V0TGlzdGVuZXIoaSk7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCAmJiBsaXN0ZW5lci5nZXRDbGFzc05hbWUoKSAhPSBudWxsICYmIGxpc3RlbmVyLmdldENsYXNzTmFtZSgpLmluZGV4T2YoIm1iZWFuIikgPj0gMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSNhZGRNaW1lTWFwcGluZyhpbnQsIElNaW1lTWFwcGluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQuYWRkTWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KEFERF9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I2FkZFdlYk1vZHVsZShpbnQsIElUb21jYXRXZWJNb2R1bGUpCi0JICovCi0JcHVibGljIHZvaWQgYWRkV2ViTW9kdWxlKGludCBpbmRleCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJdHJ5IHsKLQkJCUNvbnRleHQgY29udGV4dCA9IHNlcnZlckluc3RhbmNlLmNyZWF0ZUNvbnRleHQoaW5kZXgpOwotCQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJCWNvbnRleHQuc2V0RG9jQmFzZShtb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCkpOwotCQkJCWNvbnRleHQuc2V0UGF0aChtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJCQljb250ZXh0LnNldFJlbG9hZGFibGUobW9kdWxlLmlzUmVsb2FkYWJsZSgpID8gInRydWUiIDogImZhbHNlIik7Ci0JCQkJaWYgKG1vZHVsZS5nZXRNZW1lbnRvKCkgIT0gbnVsbCAmJiBtb2R1bGUuZ2V0TWVtZW50bygpLmxlbmd0aCgpID4gMCkKLQkJCQkJY29udGV4dC5zZXRTb3VyY2UobW9kdWxlLmdldE1lbWVudG8oKSk7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoQUREX1dFQl9NT0RVTEVfUFJPUEVSVFksIG51bGwsIG1vZHVsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBhZGRpbmcgd2ViIG1vZHVsZSAiICsgbW9kdWxlLmdldFBhdGgoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdGhlIGV4dGVuc2lvbiBvZiBhIG1pbWUgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gbWFwCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5TWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXdlYkFwcERvY3VtZW50Lm1vZGlmeU1pbWVNYXBwaW5nKGluZGV4LCBtYXApOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfTUFQUElOR19QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtYXApOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSB0aGUgcG9ydCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBvcnQgaW50Ci0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5U2VydmVyUG9ydChTdHJpbmcgaWQsIGludCBwb3J0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoInNlcnZlciIuZXF1YWxzKGlkKSkgewotCQkJCXNlcnZlci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQotCQkJaW50IGkgPSBpZC5pbmRleE9mKCIvIik7Ci0JCQkvLyBJZiBhIGNvbm5lY3RvciBpbiB0aGUgaW5zdGFuY2UgU2VydmljZQotCQkJaWYgKGkgPCAwKSB7Ci0JCQkJaW50IGNvbm5OdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGlkKTsKLQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmVySW5zdGFuY2UuZ2V0Q29ubmVjdG9yKGNvbm5OdW0pOwotCQkJCWlmIChjb25uZWN0b3IgIT0gbnVsbCkgewotCQkJCQljb25uZWN0b3Iuc2V0UG9ydChwb3J0ICsgIiIpOwotCQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gRWxzZSBhIGNvbm5lY3RvciBpbiBhbm90aGVyIFNlcnZpY2UKLQkJCWVsc2UgewotCQkJCWludCBzZXJ2TnVtID0gSW50ZWdlci5wYXJzZUludChpZC5zdWJzdHJpbmcoMCwgaSkpOwotCQkJCWludCBjb25uTnVtID0gSW50ZWdlci5wYXJzZUludChpZC5zdWJzdHJpbmcoaSArIDEpKTsKLQkJCQkKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShzZXJ2TnVtKTsKLQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmljZS5nZXRDb25uZWN0b3IoY29ubk51bSk7Ci0JCQkJY29ubmVjdG9yLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfUE9SVF9QUk9QRVJUWSwgaWQsIG5ldyBJbnRlZ2VyKHBvcnQpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG1vZGlmeWluZyBzZXJ2ZXIgcG9ydCAiICsgaWQsIGUpOwotCQl9Ci0JfQotCS8qKgotCSAqIENoYW5nZSBhIHdlYiBtb2R1bGUuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqIEBwYXJhbSBkb2NCYXNlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGF0aCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJlbG9hZGFibGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVdlYk1vZHVsZShpbnQgaW5kZXgsIFN0cmluZyBkb2NCYXNlLCBTdHJpbmcgcGF0aCwgYm9vbGVhbiByZWxvYWRhYmxlKSB7Ci0JCXRyeSB7Ci0JCQlDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0KGluZGV4KTsKLQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCQljb250ZXh0LnNldFBhdGgocGF0aCk7Ci0JCQkJY29udGV4dC5zZXREb2NCYXNlKGRvY0Jhc2UpOwotCQkJCWNvbnRleHQuc2V0UmVsb2FkYWJsZShyZWxvYWRhYmxlID8gInRydWUiIDogImZhbHNlIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUocGF0aCwgZG9jQmFzZSwgbnVsbCwgcmVsb2FkYWJsZSk7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1dFQl9NT0RVTEVfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbW9kdWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG1vZGlmeWluZyB3ZWIgbW9kdWxlICIgKyBpbmRleCwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbWltZSBtYXBwaW5nLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNaW1lTWFwcGluZyhpbnQgaW5kZXgpIHsKLQkJd2ViQXBwRG9jdW1lbnQucmVtb3ZlTWltZU1hcHBpbmcoaW5kZXgpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChSRU1PVkVfTUFQUElOR19QUk9QRVJUWSwgbnVsbCwgbmV3IEludGVnZXIoaW5kZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlV2ViTW9kdWxlKGludCBpbmRleCkgewotCQl0cnkgewotCQkJc2VydmVySW5zdGFuY2UucmVtb3ZlQ29udGV4dChpbmRleCk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9XRUJfTU9EVUxFX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVtb3ZpbmcgbW9kdWxlIHJlZiAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGNvbnRleHQgY29uZmlndXJhdGlvbiBmb3VuZCBpbiBNRVRBLUlORi9jb250ZXh0LnhtbCBmaWxlcwotCSAqIHByZXNlbnQgaW4gcHJvamVjdHMgdG8gcHVibGlzaGVkIHNlcnZlci54bWwuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBjYXRhbGluYSBpbnN0YW5jZSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gZGVwbG95RGlyIHBhdGggdG8gZGVwbG95bWVudCBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHB1Ymxpc2hDb250ZXh0Q29uZmlnKElQYXRoIGJhc2VEaXIsIElQYXRoIGRlcGxveURpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLnB1Ymxpc2hDYXRhbGluYUNvbnRleHRDb25maWcoYmFzZURpciwgZGVwbG95RGlyLCBtb25pdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIGNvbnRleHRzIGluIHNlcnZlci54bWwgdG8gc2VydmUgcHJvamVjdHMgZGlyZWN0bHkgd2l0aG91dAotCSAqIHB1Ymxpc2hpbmcuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBjYXRhbGluYSBpbnN0YW5jZSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHVwZGF0ZUNvbnRleHRzVG9TZXJ2ZURpcmVjdGx5KElQYXRoIGJhc2VEaXIsIFN0cmluZyBsb2FkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci51cGRhdGVDb250ZXh0c1RvU2VydmVEaXJlY3RseShiYXNlRGlyLCBsb2FkZXIsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIENsZWFudXAgdGhlIHNlcnZlciBpbnN0YW5jZS4gIFRoaXMgY29uc2lzdHMgb2YgZGVsZXRpbmcgdGhlIHdvcmsKLQkgKiBkaXJlY3RvcnkgYXNzb2NpYXRlZCB3aXRoIENvbnRleHRzIHRoYXQgYXJlIGdvaW5nIGF3YXkgaW4gdGhlCi0JICogdXAgY29taW5nIHB1Ymxpc2guCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcGF0aCB0byBzZXJ2ZXIgaW5zdGFuY2UgZGlyZWN0b3J5LCBpLmUuIGNhdGFsaW5hLmJhc2UKLQkgKiBAcGFyYW0gaW5zdGFsbERpciBwYXRoIHRvIHNlcnZlciBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IChub3QgY3VycmVudGx5IHVzZWQpCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIG9yIG51bGwKLQkgKiBAcmV0dXJuIE11bHRpU3RhdHVzIGNvbnRhaW5pbmcgcmVzdWx0cyBvZiB0aGUgY2xlYW51cCBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBjbGVhbnVwU2VydmVyKElQYXRoIGJhc2VEaXIsIElQYXRoIGluc3RhbGxEaXIsIGJvb2xlYW4gcmVtb3ZlS2VwdENvbnRleHRGaWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgbW9kdWxlcyA9IGdldFdlYk1vZHVsZXMoKTsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuY2xlYW51cENhdGFsaW5hU2VydmVyKGJhc2VEaXIsIGluc3RhbGxEaXIsIHJlbW92ZUtlcHRDb250ZXh0RmlsZXMsIG1vZHVsZXMsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2NhbGl6ZUNvbmZpZ3VyYXRpb24oSVBhdGgsIElQYXRoLCBUb21jYXRTZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTdGF0dXMgbG9jYWxpemVDb25maWd1cmF0aW9uKElQYXRoIGJhc2VEaXIsIElQYXRoIGRlcGxveURpciwgVG9tY2F0U2VydmVyIHRvbWNhdFNlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmxvY2FsaXplQ29uZmlndXJhdGlvbihiYXNlRGlyLCBkZXBsb3lEaXIsIHRvbWNhdFNlcnZlciwgbW9uaXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ1NUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NTVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMjI3M2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ1NUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLS8qKgotICogVG9tY2F0IDU1IGhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXQ1NUhhbmRsZXIgZXh0ZW5kcyBUb21jYXQ1MEhhbmRsZXIgewotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ZlcmlmeUluc3RhbGxQYXRoKElQYXRoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZlcmlmeUluc3RhbGxQYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCXJldHVybiBUb21jYXRQbHVnaW4udmVyaWZ5SW5zdGFsbFBhdGhXaXRoRm9sZGVyQ2hlY2soaW5zdGFsbFBhdGgsIFRvbWNhdFBsdWdpbi5UT01DQVRfNTUpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNjYW5BZGRNb2R1bGUoSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5BZGRNb2R1bGUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJU3RyaW5nIHZlcnNpb24gPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldFZlcnNpb24oKTsKLQkJaWYgKCIyLjIiLmVxdWFscyh2ZXJzaW9uKSB8fCAiMi4zIi5lcXVhbHModmVyc2lvbikgfHwgIjIuNCIuZXF1YWxzKHZlcnNpb24pKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclNwZWM1NSwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ2MENvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NjBDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNzg2NmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ2MENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2ZXJJbnN0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0vKioKLSAqIFRvbWNhdCB2Ni4wIHNlcnZlciBjb25maWd1cmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0NjBDb25maWd1cmF0aW9uIGV4dGVuZHMgVG9tY2F0Q29uZmlndXJhdGlvbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVJWSUNFID0gIkNhdGFsaW5hIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFT0wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0JcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIFNlcnZlckluc3RhbmNlIHNlcnZlckluc3RhbmNlOwotCXByb3RlY3RlZCBGYWN0b3J5IHNlcnZlckZhY3Rvcnk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXJ2ZXJEaXJ0eTsKLQotCXByb3RlY3RlZCBXZWJBcHBEb2N1bWVudCB3ZWJBcHBEb2N1bWVudDsKLQotCXByb3RlY3RlZCBEb2N1bWVudCBjb250ZXh0RG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgdG9tY2F0VXNlcnNEb2N1bWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgcG9saWN5RmlsZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHJvcGVydGllc0ZpbGU7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNYXAgcHJvdG9jb2xIYW5kbGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlwcm90b2NvbEhhbmRsZXJNYXAucHV0KCJvcmcuYXBhY2hlLmNveW90ZS5odHRwMTEuSHR0cDExUHJvdG9jb2wiLCAiSFRUUC8xLjEiKTsKLQkJcHJvdG9jb2xIYW5kbGVyTWFwLnB1dCgib3JnLmFwYWNoZS5jb3lvdGUuaHR0cDExLkh0dHAxMU5pb1Byb3RvY29sIiwgIkhUVFAvMS4xIik7Ci0JCXByb3RvY29sSGFuZGxlck1hcC5wdXQoIm9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5IdHRwMTFBcHJQcm90b2NvbCIsICJIVFRQLzEuMSIpOwotCQlwcm90b2NvbEhhbmRsZXJNYXAucHV0KCJvcmcuYXBhY2hlLmNveW90ZS5hanAuQWpwQXByUHJvdG9jb2wiLCAiQUpQLzEuMyIpOwotCQlwcm90b2NvbEhhbmRsZXJNYXAucHV0KCJvcmcuYXBhY2hlLmprLnNlcnZlci5Ka0NveW90ZUhhbmRsZXIiLCAiQUpQLzEuMyIpOwotCX0KLQkKLQkvKioKLQkgKiBUb21jYXQ2MENvbmZpZ3VyYXRpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICovCi0JcHVibGljIFRvbWNhdDYwQ29uZmlndXJhdGlvbihJRm9sZGVyIHBhdGgpIHsKLQkJc3VwZXIocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwb3J0IG51bWJlci4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQb3J0IGdldE1haW5Qb3J0KCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlcnZlclBvcnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUG9ydCBwb3J0ID0gKFNlcnZlclBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIFJldHVybiBvbmx5IGFuIEhUVFAgcG9ydCBmcm9tIHRoZSBzZWxlY3RlZCBTZXJ2aWNlCi0JCQlpZiAocG9ydC5nZXRQcm90b2NvbCgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJodHRwIikgJiYgcG9ydC5nZXRJZCgpLmluZGV4T2YoJy8nKSA8IDApCi0JCQkJcmV0dXJuIHBvcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pbWUgbWFwcGluZ3MuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1pbWVNYXBwaW5ncygpIHsKLQkJcmV0dXJuIHdlYkFwcERvY3VtZW50LmdldE1pbWVNYXBwaW5ncygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFNlcnZlclBvcnRzIHRoYXQgdGhpcyBjb25maWd1cmF0aW9uIHVzZXMuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmVyUG9ydHMoKSB7Ci0JCUxpc3QgcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCS8vIGZpcnN0IGFkZCBzZXJ2ZXIgcG9ydAotCQl0cnkgewotCQkJaW50IHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHNlcnZlci5nZXRQb3J0KCkpOwotCQkJcG9ydHMuYWRkKG5ldyBTZXJ2ZXJQb3J0KCJzZXJ2ZXIiLCBNZXNzYWdlcy5wb3J0U2VydmVyLCBwb3J0LCAiVENQSVAiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQotCQkvLyBhZGQgY29ubmVjdG9ycwotCQl0cnkgewotCQkJU3RyaW5nIGluc3RhbmNlU2VydmljZU5hbWUgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRTZXJ2aWNlKCkuZ2V0TmFtZSgpOwotCQkJaW50IHNpemUgPSBzZXJ2ZXIuZ2V0U2VydmljZUNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKGkpOwotCQkJCWludCBzaXplMiA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yQ291bnQoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yKGopOwotCQkJCQlTdHJpbmcgbmFtZSA9ICJIVFRQLzEuMSI7Ci0JCQkJCVN0cmluZyBwcm90b2NvbDIgPSAiSFRUUCI7Ci0JCQkJCWJvb2xlYW4gYWR2YW5jZWQgPSB0cnVlOwotCQkJCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBudWxsOwotCQkJCQlpbnQgcG9ydCA9IC0xOwotCQkJCQl0cnkgewotCQkJCQkJcG9ydCA9IEludGVnZXIucGFyc2VJbnQoY29ubmVjdG9yLmdldFBvcnQoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQlTdHJpbmcgcHJvdG9jb2wgPSBjb25uZWN0b3IuZ2V0UHJvdG9jb2woKTsKLQkJCQkJaWYgKHByb3RvY29sICE9IG51bGwgJiYgcHJvdG9jb2wubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlpZiAocHJvdG9jb2wuc3RhcnRzV2l0aCgiSFRUUCIpKSB7Ci0JCQkJCQkJbmFtZSA9IHByb3RvY29sOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAocHJvdG9jb2wuc3RhcnRzV2l0aCgiQUpQIikpIHsKLQkJCQkJCQluYW1lID0gcHJvdG9jb2w7Ci0JCQkJCQkJcHJvdG9jb2wyID0gIkFKUCI7IAotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gR2V0IFRvbWNhdCBlcXVpdmFsZW50IG5hbWUgaWYgcHJvdG9jb2wgaGFuZGxlciBjbGFzcyBzcGVjaWZpZWQKLQkJCQkJCQluYW1lID0gKFN0cmluZylwcm90b2NvbEhhbmRsZXJNYXAuZ2V0KHByb3RvY29sKTsKLQkJCQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIFByZXBhcmUgc2ltcGxlIHByb3RvY29sIHN0cmluZyBmb3IgU2VydmVyUG9ydCBwcm90b2NvbAotCQkJCQkJCQlpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoJy8nKTsKLQkJCQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCQkJCXByb3RvY29sMiA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJcHJvdG9jb2wyID0gbmFtZTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gU3BlY2lmaWVkIHByb3RvY29sIGlzIHVua25vd24sIGp1c3QgdXNlIGFzIGlzCi0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCW5hbWUgPSBwcm90b2NvbDsKLQkJCQkJCQkJcHJvdG9jb2wyID0gcHJvdG9jb2w7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChwcm90b2NvbDIudG9Mb3dlckNhc2UoKS5lcXVhbHMoImh0dHAiKSkKLQkJCQkJCWNvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7ICJ3ZWIiLCAid2Vic2VydmljZXMiIH07Ci0JCQkJCVN0cmluZyBzZWN1cmUgPSBjb25uZWN0b3IuZ2V0U2VjdXJlKCk7Ci0JCQkJCWlmIChzZWN1cmUgIT0gbnVsbCAmJiBzZWN1cmUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQluYW1lID0gIlNTTCI7Ci0JCQkJCQlwcm90b2NvbDIgPSAiU1NMIjsKLQkJCQkJfSBlbHNlCi0JCQkJCQlhZHZhbmNlZCA9IGZhbHNlOwotCQkJCQlTdHJpbmcgcG9ydElkOwotCQkJCQlpZiAoaW5zdGFuY2VTZXJ2aWNlTmFtZSAhPSBudWxsICYmIGluc3RhbmNlU2VydmljZU5hbWUuZXF1YWxzKHNlcnZpY2UuZ2V0TmFtZSgpKSkKLQkJCQkJCXBvcnRJZCA9IEludGVnZXIudG9TdHJpbmcoaik7Ci0JCQkJCWVsc2UKLQkJCQkJCXBvcnRJZCA9IGkgKyIvIiArIGo7Ci0JCQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydChwb3J0SWQsIG5hbWUsIHBvcnQsIHByb3RvY29sMiwgY29udGVudFR5cGVzLCBhZHZhbmNlZCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgc2VydmVyIHBvcnRzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIHBvcnRzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3ZWIgbW9kdWxlcyBpbiB0aGlzIHNlcnZlci4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViTW9kdWxlcygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQl0cnkgewotCQkJQ29udGV4dCBbXSBjb250ZXh0cyA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHRzKCk7Ci0JCQlpZiAoY29udGV4dHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJQ29udGV4dCBjb250ZXh0ID0gY29udGV4dHNbaV07Ci0JCQkJCVN0cmluZyByZWxvYWQgPSBjb250ZXh0LmdldFJlbG9hZGFibGUoKTsKLQkJCQkJaWYgKHJlbG9hZCA9PSBudWxsKQotCQkJCQkJcmVsb2FkID0gImZhbHNlIjsKLQkJCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUoY29udGV4dC5nZXRQYXRoKCksIAotCQkJCQkJY29udGV4dC5nZXREb2NCYXNlKCksIGNvbnRleHQuZ2V0U291cmNlKCksCi0JCQkJCQlyZWxvYWQuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpID8gdHJ1ZSA6IGZhbHNlKTsKLQkJCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIHByb2plY3QgcmVmcyIsIGUpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jZ2V0U2VydmVyV29ya0RpcmVjdG9yeShJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0U2VydmVyV29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCkgewotCQlyZXR1cm4gc2VydmVySW5zdGFuY2UuZ2V0SG9zdFdvcmtEaXJlY3RvcnkoYmFzZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNnZXRDb250ZXh0V29ya0RpcmVjdG9yeShJUGF0aCwgSVRvbWNhdFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCUNvbnRleHQgY29udGV4dCA9IHNlcnZlckluc3RhbmNlLmdldENvbnRleHQobW9kdWxlLmdldFBhdGgoKSk7Ci0JCWlmIChjb250ZXh0ICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoYmFzZVBhdGgsIGNvbnRleHQpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvYWQoSVBhdGgsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmxvYWRpbmdUYXNrLCA3KTsKLQkJCQotCQkJLy8gY2hlY2sgZm9yIGNhdGFsaW5hLnBvbGljeSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgdjUuNSBjb25maWcKLQkJCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpOwotCQkJaW4ucmVhZCgpOwotCQkJaW4uY2xvc2UoKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQlzZXJ2ZXJGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCXNlcnZlckZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlzZXJ2ZXIgPSAoU2VydmVyKSBzZXJ2ZXJGYWN0b3J5LmxvYWREb2N1bWVudChuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9GaWxlKCkpKTsKLQkJCXNlcnZlckluc3RhbmNlID0gbmV3IFNlcnZlckluc3RhbmNlKHNlcnZlciwgbnVsbCwgbnVsbCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJd2ViQXBwRG9jdW1lbnQgPSBuZXcgV2ViQXBwRG9jdW1lbnQocGF0aC5hcHBlbmQoIndlYi54bWwiKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJRmlsZSBmaWxlID0gcGF0aC5hcHBlbmQoImNvbnRleHQueG1sIikudG9GaWxlKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQljb250ZXh0RG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJdG9tY2F0VXNlcnNEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInRvbWNhdC11c2Vycy54bWwiKS50b0ZpbGUoKSkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQkvLyBsb2FkIHBvbGljeSBmaWxlCi0JCQlwb2xpY3lGaWxlID0gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRGaWxlQ29udGVudHMobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQkvLyBsb2FkIHByb3BlcnRpZXMgZmlsZQotCQkJZmlsZSA9IHBhdGguYXBwZW5kKCJjYXRhbGluYS5wcm9wZXJ0aWVzIikudG9GaWxlKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQlwcm9wZXJ0aWVzRmlsZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0RmlsZUNvbnRlbnRzKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCQkJZWxzZQotCQkJCXByb3BlcnRpZXNGaWxlID0gbnVsbDsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgVG9tY2F0IHY1LjUgY29uZmlndXJhdGlvbiBmcm9tICIgKyBwYXRoLnRvT1NTdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgcGF0aC50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jaW1wb3J0RnJvbVBhdGgoSVBhdGgsIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW1wb3J0RnJvbVBhdGgoSVBhdGggcGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlsb2FkKHBhdGgsIG1vbml0b3IpOwotCQkKLQkJLy8gZm9yIHRlc3QgZW52aXJvbm1lbnQsIHJlbW92ZSBleGlzdGluZyBjb250ZXh0cyBzaW5jZSBhIHNlcGFyYXRlCi0JCS8vIGNhdGFsaW5hLmJhc2Ugd2lsbCBiZSB1c2VkCi0JCWlmIChpc1Rlc3RFbnYpIHsKLQkJCXdoaWxlIChzZXJ2ZXJJbnN0YW5jZS5yZW1vdmVDb250ZXh0KDApKSB7Ci0JCQkJLy8gbm8tb3AKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2FkKElGb2xkZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5sb2FkaW5nVGFzaywgMTIwMCk7Ci0JCi0JCQkvLyBjaGVjayBmb3IgY2F0YWxpbmEucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2NC4wIGNvbmZpZwotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBudWxsKSk7Ci0JCi0JCQkvLyBsb2FkIHNlcnZlci54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCXNlcnZlckZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlzZXJ2ZXIgPSAoU2VydmVyKSBzZXJ2ZXJGYWN0b3J5LmxvYWREb2N1bWVudChpbik7Ci0JCQlzZXJ2ZXJJbnN0YW5jZSA9IG5ldyBTZXJ2ZXJJbnN0YW5jZShzZXJ2ZXIsIG51bGwsIG51bGwpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgd2ViLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIik7Ci0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChmaWxlKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIGNvbnRleHQueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNvbnRleHQueG1sIik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCWNvbnRleHREb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJY29udGV4dERvY3VtZW50ID0gbnVsbDsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQotCQkJLy8gbG9hZCB0b21jYXQtdXNlcnMueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInRvbWNhdC11c2Vycy54bWwiKTsKLQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCi0JCQl0b21jYXRVc2Vyc0RvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQotCQkJLy8gbG9hZCBjYXRhbGluYS5wb2xpY3kKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXBvbGljeUZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhpbik7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJLy8gbG9hZCBjYXRhbGluYS5wcm9wZXJ0aWVzCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnByb3BlcnRpZXMiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJcHJvcGVydGllc0ZpbGUgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhpbik7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcHJvcGVydGllc0ZpbGUgPSBudWxsOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNhbmNlbGxlZCIpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHJlbG9hZCBUb21jYXQgdjUuNSBjb25maWd1cmF0aW9uIGZyb206ICIgKyBmb2xkZXIuZ2V0RnVsbFBhdGgoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqIEBwYXJhbSBmb3JjZURpcnR5IGJvb2xlYW4KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElQYXRoIHBhdGgsIGJvb2xlYW4gZm9yY2VEaXJ0eSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCA1KTsKLQkJCQotCQkJLy8gbWFrZSBzdXJlIGRpcmVjdG9yeSBleGlzdHMKLQkJCWlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCWZvcmNlRGlydHkgPSB0cnVlOwotCQkJCXBhdGgudG9GaWxlKCkubWtkaXIoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQkvLyBzYXZlIGZpbGVzCi0JCQlpZiAoZm9yY2VEaXJ0eSB8fCBpc1NlcnZlckRpcnR5KSB7Ci0JCQkJc2VydmVyRmFjdG9yeS5zYXZlKHBhdGguYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9PU1N0cmluZygpKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gZmFsc2U7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShwYXRoLmFwcGVuZCgid2ViLnhtbCIpLnRvT1NTdHJpbmcoKSwgZm9yY2VEaXJ0eSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKGZvcmNlRGlydHkgJiYgY29udGV4dERvY3VtZW50ICE9IG51bGwpCi0JCQkJWE1MVXRpbC5zYXZlKHBhdGguYXBwZW5kKCJjb250ZXh0LnhtbCIpLnRvT1NTdHJpbmcoKSwgY29udGV4dERvY3VtZW50KTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAoZm9yY2VEaXJ0eSkKLQkJCQlYTUxVdGlsLnNhdmUocGF0aC5hcHBlbmQoInRvbWNhdC11c2Vycy54bWwiKS50b09TU3RyaW5nKCksIHRvbWNhdFVzZXJzRG9jdW1lbnQpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCWlmIChmb3JjZURpcnR5KSB7Ci0JCQkJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIocGF0aC5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvRmlsZSgpKSk7Ci0JCQkJYncud3JpdGUocG9saWN5RmlsZSk7Ci0JCQkJYncuY2xvc2UoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJaWYgKHByb3BlcnRpZXNGaWxlICE9IG51bGwgJiYgZm9yY2VEaXJ0eSkgewotCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wcm9wZXJ0aWVzIikudG9GaWxlKCkpKTsKLQkJCQlidy53cml0ZShwcm9wZXJ0aWVzRmlsZSk7Ci0JCQkJYncuY2xvc2UoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjUuNSBjb25maWd1cmF0aW9uIHRvICIgKyBwYXRoLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4gIEFsbCBjb25maWd1cmF0aW9uIGZpbGVzCi0JICogYXJlIGZvcmNlZCB0byBiZSBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBEZXNpbmF0aW9uIHBhdGggZm9yIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzLgotCSAqIEBwYXJhbSBtb25pdG9yIEEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNhdmUocGF0aCwgdHJ1ZSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgaW5mb3JtYXRpb24gaGVsZCBieSB0aGlzIG9iamVjdCB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqCi0JICogQHBhcmFtIGZvbGRlciBhIGZvbGRlcgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuc2F2aW5nVGFzaywgMTIwMCk7Ci0JCi0JCQkvLyBzYXZlIHNlcnZlci54bWwKLQkJCWJ5dGVbXSBkYXRhID0gc2VydmVyRmFjdG9yeS5nZXRDb250ZW50cygpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKGlzU2VydmVyRGlydHkpCi0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCWVsc2UKLQkJCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCX0gZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWlzU2VydmVyRGlydHkgPSBmYWxzZTsKLQkJCQotCQkJLy8gc2F2ZSB3ZWIueG1sCi0JCQl3ZWJBcHBEb2N1bWVudC5zYXZlKGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIiksIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCi0JCQkvLyBzYXZlIGNvbnRleHQueG1sCi0JCQlpZiAoY29udGV4dERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlkYXRhID0gWE1MVXRpbC5nZXRDb250ZW50cyhjb250ZXh0RG9jdW1lbnQpOwotCQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOwotCQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY29udGV4dC54bWwiKTsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQllbHNlCi0JCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCX0KLQkJCQotCQkJLy8gc2F2ZSB0b21jYXQtdXNlcnMueG1sCi0JCQlkYXRhID0gWE1MVXRpbC5nZXRDb250ZW50cyh0b21jYXRVc2Vyc0RvY3VtZW50KTsKLQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ0b21jYXQtdXNlcnMueG1sIik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCS8vZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQllbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCi0JCQkvLyBzYXZlIGNhdGFsaW5hLnBvbGljeQotCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocG9saWN5RmlsZS5nZXRCeXRlcygpKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCS8vZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQllbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCi0JCQkvLyBzYXZlIGNhdGFsaW5hLnByb3BlcnRpZXMKLQkJCWlmIChwcm9wZXJ0aWVzRmlsZSAhPSBudWxsKSB7Ci0JCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocHJvcGVydGllc0ZpbGUuZ2V0Qnl0ZXMoKSk7Ci0JCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wcm9wZXJ0aWVzIik7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJCS8vZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkJZWxzZQotCQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQl9IGVsc2UKLQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjUuNSBjb25maWd1cmF0aW9uIHRvICIgKyBmb2xkZXIudG9TdHJpbmcoKSwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RTYXZlQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzTURCTGlzdGVuZXIoU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgY291bnQgPSBzZXJ2ZXIuZ2V0TGlzdGVuZXJDb3VudCgpOwotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gc2VydmVyLmdldExpc3RlbmVyKGkpOwotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwgJiYgbGlzdGVuZXIuZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbCAmJiBsaXN0ZW5lci5nZXRDbGFzc05hbWUoKS5pbmRleE9mKCJtYmVhbiIpID49IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkTWltZU1hcHBpbmcoaW50LCBJTWltZU1hcHBpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXdlYkFwcERvY3VtZW50LmFkZE1pbWVNYXBwaW5nKGluZGV4LCBtYXApOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfTUFQUElOR19QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtYXApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSNhZGRXZWJNb2R1bGUoaW50LCBJVG9tY2F0V2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFdlYk1vZHVsZShpbnQgaW5kZXgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlDb250ZXh0IGNvbnRleHQgPSBzZXJ2ZXJJbnN0YW5jZS5jcmVhdGVDb250ZXh0KGluZGV4KTsKLQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCQljb250ZXh0LnNldERvY0Jhc2UobW9kdWxlLmdldERvY3VtZW50QmFzZSgpKTsKLQkJCQljb250ZXh0LnNldFBhdGgobW9kdWxlLmdldFBhdGgoKSk7Ci0JCQkJY29udGV4dC5zZXRSZWxvYWRhYmxlKG1vZHVsZS5pc1JlbG9hZGFibGUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJCWlmIChtb2R1bGUuZ2V0TWVtZW50bygpICE9IG51bGwgJiYgbW9kdWxlLmdldE1lbWVudG8oKS5sZW5ndGgoKSA+IDApCi0JCQkJCWNvbnRleHQuc2V0U291cmNlKG1vZHVsZS5nZXRNZW1lbnRvKCkpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KEFERF9XRUJfTU9EVUxFX1BST1BFUlRZLCBudWxsLCBtb2R1bGUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgYWRkaW5nIHdlYiBtb2R1bGUgIiArIG1vZHVsZS5nZXRQYXRoKCksIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlIHRoZSBleHRlbnNpb24gb2YgYSBtaW1lIG1hcHBpbmcuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIG1hcAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeU1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewotCQl3ZWJBcHBEb2N1bWVudC5tb2RpZnlNaW1lTWFwcGluZyhpbmRleCwgbWFwKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX01BUFBJTkdfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgdGhlIHBvcnQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwb3J0IGludAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVNlcnZlclBvcnQoU3RyaW5nIGlkLCBpbnQgcG9ydCkgewotCQl0cnkgewotCQkJaWYgKCJzZXJ2ZXIiLmVxdWFscyhpZCkpIHsKLQkJCQlzZXJ2ZXIuc2V0UG9ydChwb3J0ICsgIiIpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkKLQkJCWludCBpID0gaWQuaW5kZXhPZigiLyIpOwotCQkJLy8gSWYgYSBjb25uZWN0b3IgaW4gdGhlIGluc3RhbmNlIFNlcnZpY2UKLQkJCWlmIChpIDwgMCkgewotCQkJCWludCBjb25uTnVtID0gSW50ZWdlci5wYXJzZUludChpZCk7Ci0JCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZlckluc3RhbmNlLmdldENvbm5lY3Rvcihjb25uTnVtKTsKLQkJCQlpZiAoY29ubmVjdG9yICE9IG51bGwpIHsKLQkJCQkJY29ubmVjdG9yLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJCX0KLQkJCX0KLQkJCS8vIEVsc2UgYSBjb25uZWN0b3IgaW4gYW5vdGhlciBTZXJ2aWNlCi0JCQllbHNlIHsKLQkJCQlpbnQgc2Vydk51bSA9IEludGVnZXIucGFyc2VJbnQoaWQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCQlpbnQgY29ubk51bSA9IEludGVnZXIucGFyc2VJbnQoaWQuc3Vic3RyaW5nKGkgKyAxKSk7Ci0JCQkJCi0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2Uoc2Vydk51bSk7Ci0JCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yKGNvbm5OdW0pOwotCQkJCWNvbm5lY3Rvci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBtb2RpZnlpbmcgc2VydmVyIHBvcnQgIiArIGlkLCBlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBDaGFuZ2UgYSB3ZWIgbW9kdWxlLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKiBAcGFyYW0gZG9jQmFzZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhdGggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByZWxvYWRhYmxlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlXZWJNb2R1bGUoaW50IGluZGV4LCBTdHJpbmcgZG9jQmFzZSwgU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVsb2FkYWJsZSkgewotCQl0cnkgewotCQkJQ29udGV4dCBjb250ZXh0ID0gc2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dChpbmRleCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJY29udGV4dC5zZXRQYXRoKHBhdGgpOwotCQkJCWNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKLQkJCQljb250ZXh0LnNldFJlbG9hZGFibGUocmVsb2FkYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKHBhdGgsIGRvY0Jhc2UsIG51bGwsIHJlbG9hZGFibGUpOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9XRUJfTU9EVUxFX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1vZHVsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBtb2RpZnlpbmcgd2ViIG1vZHVsZSAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIG1pbWUgbWFwcGluZy4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWltZU1hcHBpbmcoaW50IGluZGV4KSB7Ci0JCXdlYkFwcERvY3VtZW50LnJlbW92ZU1pbWVNYXBwaW5nKGluZGV4KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUkVNT1ZFX01BUFBJTkdfUFJPUEVSVFksIG51bGwsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHdlYiBtb2R1bGUuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVdlYk1vZHVsZShpbnQgaW5kZXgpIHsKLQkJdHJ5IHsKLQkJCXNlcnZlckluc3RhbmNlLnJlbW92ZUNvbnRleHQoaW5kZXgpOwotCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChSRU1PVkVfV0VCX01PRFVMRV9QUk9QRVJUWSwgbnVsbCwgbmV3IEludGVnZXIoaW5kZXgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlbW92aW5nIG1vZHVsZSByZWYgIiArIGluZGV4LCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gTUVUQS1JTkYvY29udGV4dC54bWwgZmlsZXMKLQkgKiBwcmVzZW50IGluIHByb2plY3RzIHRvIHB1Ymxpc2hlZCBzZXJ2ZXIueG1sLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIHBhdGggdG8gY2F0YWxpbmEgaW5zdGFuY2UgZGlyZWN0b3J5Ci0JICogQHBhcmFtIGRlcGxveURpciBwYXRoIHRvIGRlcGxveW1lbnQgZGlyZWN0b3J5Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIG9yIG51bGwKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBwdWJsaXNoQ29udGV4dENvbmZpZyhJUGF0aCBiYXNlRGlyLCBJUGF0aCBkZXBsb3lEaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5wdWJsaXNoQ2F0YWxpbmFDb250ZXh0Q29uZmlnKGJhc2VEaXIsIGRlcGxveURpciwgbW9uaXRvcik7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSBjb250ZXh0cyBpbiBzZXJ2ZXIueG1sIHRvIHNlcnZlIHByb2plY3RzIGRpcmVjdGx5IHdpdGhvdXQKLQkgKiBwdWJsaXNoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIHBhdGggdG8gY2F0YWxpbmEgaW5zdGFuY2UgZGlyZWN0b3J5Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIG9yIG51bGwKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB1cGRhdGVDb250ZXh0c1RvU2VydmVEaXJlY3RseShJUGF0aCBiYXNlRGlyLCBTdHJpbmcgbG9hZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIudXBkYXRlQ29udGV4dHNUb1NlcnZlRGlyZWN0bHkoYmFzZURpciwgbG9hZGVyLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhbnVwIHRoZSBzZXJ2ZXIgaW5zdGFuY2UuICBUaGlzIGNvbnNpc3RzIG9mIGRlbGV0aW5nIHRoZSB3b3JrCi0JICogZGlyZWN0b3J5IGFzc29jaWF0ZWQgd2l0aCBDb250ZXh0cyB0aGF0IGFyZSBnb2luZyBhd2F5IGluIHRoZQotCSAqIHVwIGNvbWluZyBwdWJsaXNoLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIHBhdGggdG8gc2VydmVyIGluc3RhbmNlIGRpcmVjdG9yeSwgaS5lLiBjYXRhbGluYS5iYXNlCi0JICogQHBhcmFtIGluc3RhbGxEaXIgcGF0aCB0byBzZXJ2ZXIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAobm90IGN1cnJlbnRseSB1c2VkKQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciBvciBudWxsCi0JICogQHJldHVybiBNdWx0aVN0YXR1cyBjb250YWluaW5nIHJlc3VsdHMgb2YgdGhlIGNsZWFudXAgb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgY2xlYW51cFNlcnZlcihJUGF0aCBiYXNlRGlyLCBJUGF0aCBpbnN0YWxsRGlyLCBib29sZWFuIHJlbW92ZUtlcHRDb250ZXh0RmlsZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0IG1vZHVsZXMgPSBnZXRXZWJNb2R1bGVzKCk7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmNsZWFudXBDYXRhbGluYVNlcnZlcihiYXNlRGlyLCBpbnN0YWxsRGlyLCByZW1vdmVLZXB0Q29udGV4dEZpbGVzLCBtb2R1bGVzLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9jYWxpemVDb25maWd1cmF0aW9uKElQYXRoLCBJUGF0aCwgVG9tY2F0U2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxvY2FsaXplQ29uZmlndXJhdGlvbihJUGF0aCBiYXNlRGlyLCBJUGF0aCBkZXBsb3lEaXIsIFRvbWNhdFNlcnZlciB0b21jYXRTZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5sb2NhbGl6ZUNvbmZpZ3VyYXRpb24oYmFzZURpciwgZGVwbG95RGlyLCB0b21jYXRTZXJ2ZXIsIG1vbml0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NjBIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDYwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGMxNGM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NjBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLS8qKgotICogVG9tY2F0IDYwIGhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXQ2MEhhbmRsZXIgaW1wbGVtZW50cyBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgewotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ZlcmlmeUluc3RhbGxQYXRoKElQYXRoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZlcmlmeUluc3RhbGxQYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCXJldHVybiBUb21jYXRQbHVnaW4udmVyaWZ5SW5zdGFsbFBhdGhXaXRoRm9sZGVyQ2hlY2soaW5zdGFsbFBhdGgsIFRvbWNhdFBsdWdpbi5UT01DQVRfNjApOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAiOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJTGlzdCBjcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIDYuMCAtIGFkZCBib290c3RyYXAuamFyIGZyb20gdGhlIFRvbWNhdCBiaW4gZGlyZWN0b3J5Ci0JCUlQYXRoIGJpblBhdGggPSBpbnN0YWxsUGF0aC5hcHBlbmQoImJpbiIpOwotCQlpZiAoYmluUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJSVBhdGggcGF0aCA9IGJpblBhdGguYXBwZW5kKCJib290c3RyYXAuamFyIik7Ci0JCQljcC5hZGQoSmF2YVJ1bnRpbWUubmV3QXJjaGl2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShwYXRoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBjcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhJUGF0aCwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoSVBhdGggY29uZmlnUGF0aCwgYm9vbGVhbiBkZWJ1ZywgYm9vbGVhbiBzdGFydGluZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKHN0YXJ0aW5nKQotCQkJbGlzdC5hZGQoInN0YXJ0Iik7Ci0JCWVsc2UKLQkJCWxpc3QuYWRkKCJzdG9wIik7Ci0JCQotCQlTdHJpbmdbXSB0ZW1wID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheSh0ZW1wKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGJvb2xlYW4gZGVidWcsIGJvb2xlYW4gc3RhcnRpbmcpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVWTUFyZ3VtZW50cyhJUGF0aCwgSVBhdGgsIElQYXRoLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVBhdGggaW5zdGFsbFBhdGgsIElQYXRoIGNvbmZpZ1BhdGgsIElQYXRoIGRlcGxveVBhdGgsIGJvb2xlYW4gaXNUZXN0RW52KSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmdldENhdGFsaW5hVk1Bcmd1bWVudHMoaW5zdGFsbFBhdGgsIGNvbmZpZ1BhdGgsIGRlcGxveVBhdGgsIGdldEVuZG9yc2VkRGlyZWN0b3JpZXMoaW5zdGFsbFBhdGgpLCBpc1Rlc3RFbnYpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVQb2xpY3lGaWxlKElQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZVBvbGljeUZpbGUoSVBhdGggY29uZmlnUGF0aCkgewotCQlyZXR1cm4gY29uZmlnUGF0aC5hcHBlbmQoImNvbmYiKS5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvT1NTdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNjYW5BZGRNb2R1bGUoSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5BZGRNb2R1bGUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJU3RyaW5nIHZlcnNpb24gPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldFZlcnNpb24oKTsKLQkJaWYgKCIyLjIiLmVxdWFscyh2ZXJzaW9uKSB8fCAiMi4zIi5lcXVhbHModmVyc2lvbikgfHwgIjIuNCIuZXF1YWxzKHZlcnNpb24pfHwgIjIuNSIuZXF1YWxzKHZlcnNpb24pKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclNwZWM2MCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeShUb21jYXRTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBUb21jYXRWZXJzaW9uSGVscGVyLmdldFN0YW5kYXJkQmFzZURpcmVjdG9yeShzZXJ2ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVSdW50aW1lRGlyZWN0b3J5KElQYXRoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByZXBhcmVSdW50aW1lRGlyZWN0b3J5KElQYXRoIGJhc2VEaXIpIHsKLQkJcmV0dXJuIFRvbWNhdFZlcnNpb25IZWxwZXIuY3JlYXRlQ2F0YWxpbmFJbnN0YW5jZURpcmVjdG9yeShiYXNlRGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNwcmVwYXJlRGVwbG95RGlyZWN0b3J5KElQYXRoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByZXBhcmVEZXBsb3lEaXJlY3RvcnkoSVBhdGggZGVwbG95UGF0aCkgewotCQlyZXR1cm4gVG9tY2F0VmVyc2lvbkhlbHBlci5jcmVhdGVEZXBsb3ltZW50RGlyZWN0b3J5KGRlcGxveVBhdGgsCi0JCQkJVG9tY2F0VmVyc2lvbkhlbHBlci5ERUZBVUxUX1dFQlhNTF9TRVJWTEVUMjUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ByZXBhcmVGb3JTZXJ2aW5nRGlyZWN0bHkoSVBhdGgsIFRvbWNhdFNlcnZlcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwcmVwYXJlRm9yU2VydmluZ0RpcmVjdGx5KElQYXRoIGJhc2VEaXIsIFRvbWNhdFNlcnZlciBzZXJ2ZXIpIHsKLQkJSVN0YXR1cyBzdGF0dXM7Ci0JCS8vIElmIHNlcnZpbmcgbW9kdWxlcyB3aXRob3V0IHB1Ymxpc2hpbmcsIGxvYWRlciBqYXIgaXMgbmVlZGVkCi0JCS8vIFRPRE8gTmVlZCB0byBleGFtaW5lIGNhdGFsaW5hLnByb3BlcnRpZXMgdG8gZW5zdXJlIGxvYWRlciBqYXIgYW5kIGNhdGFsaW5hLnByb3BlcnRpZXMgYXJlIGhhbmRsZWQgYXBwcm9wcmlhdGVseQotCQlpZiAoc2VydmVyLmlzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKSkgewotCQkJc3RhdHVzID0gVG9tY2F0VmVyc2lvbkhlbHBlci5jb3B5TG9hZGVySmFyKAotCQkJCQlnZXRSdW50aW1lQmFzZURpcmVjdG9yeShzZXJ2ZXIpLmFwcGVuZCgibGliIiksCi0JCQkJCXNlcnZlci5nZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCS8vIElmIGNvcHkgc3VjY2Vzc2Z1bCBhbmQgcnVubmluZyBhIHNlcGFyYXRlIHNlcnZlciBpbnN0YW5jZSwgbW9kaWZ5IGNhdGFsaW5hLnByb3BlcnRpZXMKLQkJCWlmIChzdGF0dXMuaXNPSygpICYmIHNlcnZlci5pc1Rlc3RFbnZpcm9ubWVudCgpKSB7Ci0JCQkJc3RhdHVzID0gVG9tY2F0VmVyc2lvbkhlbHBlci51cGRhdGVQcm9wZXJ0aWVzVG9TZXJ2ZURpcmVjdGx5KGJhc2VEaXIsICJsaWIiLCAiY29tbW9uIik7Ci0JCQl9Ci0JCX0KLQkJLy8gRWxzZSBlbnN1cmUgamFyIGlzIHJlbW92ZWQKLQkJZWxzZSB7Ci0JCQlUb21jYXRWZXJzaW9uSGVscGVyLnJlbW92ZUxvYWRlckphcigKLQkJCQkJZ2V0UnVudGltZUJhc2VEaXJlY3Rvcnkoc2VydmVyKS5hcHBlbmQoImxpYiIpLAotCQkJCQlzZXJ2ZXIuZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7Ci0JCQkvLyBUT0RPIERlY2lkZSB3aGF0IHRvIGRvIHdpdGggcmVtb3ZhbCB3YXJuaW5nLCBtYXliZSBub3RoaW5nCi0JCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0U2hhcmVkTG9hZGVyKElQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcmVkTG9hZGVyKElQYXRoIGJhc2VEaXIpIHsKLQkJcmV0dXJuICJjb21tb24iOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgc2luY2UgVG9tY2F0IDYueCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiB0cnVlIHNpbmNlIGZlYXR1cmUgaXMgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjc3VwcG9ydHNEZWJ1Z0FyZ3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RlYnVnQXJndW1lbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNzdXBwb3J0c1NlcGFyYXRlQ29udGV4dEZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1NlcGFyYXRlQ29udGV4dEZpbGVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRFbmRvcnNlZERpcmVjdG9yaWVzKElQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kb3JzZWREaXJlY3RvcmllcyhJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlyZXR1cm4gaW5zdGFsbFBhdGguYXBwZW5kKCJlbmRvcnNlZCIpLnRvT1NTdHJpbmcoKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1OWJiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci0vKioKLSAqIEdlbmVyaWMgVG9tY2F0IHNlcnZlciBjb25maWd1cmF0aW9uLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVG9tY2F0Q29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIElUb21jYXRDb25maWd1cmF0aW9uLCBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfUFJPUEVSVFkgPSAicG9ydCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ESUZZX1BPUlRfUFJPUEVSVFkgPSAibW9kaWZ5UG9ydCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX01BUFBJTkdfUFJPUEVSVFkgPSAiYWRkTWFwcGluZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX01BUFBJTkdfUFJPUEVSVFkgPSAicmVtb3ZlTWFwcGluZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ESUZZX01BUFBJTkdfUFJPUEVSVFkgPSAibW9kaWZ5TWFwcGluZyI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ESUZZX1dFQl9NT0RVTEVfUFJPUEVSVFkgPSAibW9kaWZ5V2ViTW9kdWxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfV0VCX01PRFVMRV9QUk9QRVJUWSA9ICJhZGRXZWJNb2R1bGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9XRUJfTU9EVUxFX1BST1BFUlRZID0gInJlbW92ZVdlYk1vZHVsZSI7Ci0JCi0JcHJvdGVjdGVkIElGb2xkZXIgY29uZmlnUGF0aDsKLQotCS8vIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMKLQlwcml2YXRlIHRyYW5zaWVudCBMaXN0IHByb3BlcnR5TGlzdGVuZXJzOwotCi0JLyoqCi0JICogVG9tY2F0Q29uZmlndXJhdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKi8KLQlwdWJsaWMgVG9tY2F0Q29uZmlndXJhdGlvbihJRm9sZGVyIHBhdGgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb25maWdQYXRoID0gcGF0aDsKLQkJLyp0cnkgewotCQkJbG9hZChjb25maWdQYXRoLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ki8KLQl9Ci0JCi0JcHJvdGVjdGVkIElGb2xkZXIgZ2V0Rm9sZGVyKCkgewotCQlyZXR1cm4gY29uZmlnUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgYWxsIGZpbGVzIGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yeSBpbiB0aGUgd29ya2JlbmNoCi0JICogdG8gdGhlIGdpdmVuIGxvY2F0aW9uLiAgQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdmVyc2lvbiBzcGVjaWZpYwotCSAqIGNsYXNzIHRvIG1vZGlmeSBvciBlbmhhbmNlIHdoYXQgcHVibGlzaCBkb2VzLgotCSAqIAotCSAqIEBwYXJhbSB0b21jYXREaXIgRGVzdGluYXRpb24gdG9tY2F0IGRpcmVjdG9yeS4gIEVxdWl2YWxlbnQgdG8gY2F0YWxpbmEuYmFzZQotCSAqICAgICAgICAgICAgICAgICAgZm9yIFRvbWNhdCA0LnggYW5kIHVwLgotCSAqIEBwYXJhbSBkb0JhY2t1cCBCYWNrdXAgZXhpc3RpbmcgY29uZmlndXJhdGlvbiBmaWxlcyAodHJ1ZSBpZiBub3QgdGVzdCBtb2RlKS4KLQkgKiBAcGFyYW0gbW9uaXRvciBQcm9ncmVzcyBtb25pdG9yIHRvIHVzZQotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIGJhY2t1cEFuZFB1Ymxpc2goSVBhdGggdG9tY2F0RGlyLCBib29sZWFuIGRvQmFja3VwLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTXVsdGlTdGF0dXMgbXMgPSBuZXcgTXVsdGlTdGF0dXMoVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMucHVibGlzaENvbmZpZ3VyYXRpb25UYXNrLCBudWxsKTsKLQkJaWYgKFRyYWNlLmlzVHJhY2VFbmFibGVkKCkpCi0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkJhY2t1cCBhbmQgcHVibGlzaCIpOwotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0KLQkJdHJ5IHsKLQkJCUlQYXRoIGJhY2t1cCA9IG51bGw7Ci0JCQlpZiAoZG9CYWNrdXApIHsKLQkJCQkvLyBjcmVhdGUgYmFja3VwIGRpcmVjdG9yeQotCQkJCWJhY2t1cCA9IHRvbWNhdERpci5hcHBlbmQoImJhY2t1cCIpOwotCQkJCWlmICghYmFja3VwLnRvRmlsZSgpLmV4aXN0cygpKQotCQkJCQliYWNrdXAudG9GaWxlKCkubWtkaXIoKTsKLQkJCX0KLQkJCWJhY2t1cEZvbGRlcihnZXRGb2xkZXIoKSwgdG9tY2F0RGlyLmFwcGVuZCgiY29uZiIpLCBiYWNrdXAsIG1zLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgImJhY2t1cEFuZFB1Ymxpc2goKSBlcnJvciIsIGUpOwotCQkJSVN0YXR1cyBzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQkJbXMuYWRkKHMpOwotCQl9Ci0KLQkJbW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiBtczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYmFja3VwRm9sZGVyKElGb2xkZXIgZm9sZGVyLCBJUGF0aCBjb25mRGlyLCBJUGF0aCBiYWNrdXAsIE11bHRpU3RhdHVzIG1zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlW10gY2hpbGRyZW4gPSBmb2xkZXIubWVtYmVycygpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29uZmlndXJhdGlvblRhc2ssIHNpemUgKiAxMDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQl0cnkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBjaGlsZHJlbltpXTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLnB1Ymxpc2hlclB1Ymxpc2hUYXNrLCBuZXcgU3RyaW5nW10ge25hbWV9KSk7Ci0JCQkJCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUHVibGlzaGluZyAiICsgbmFtZSk7Ci0KLQkJCQkJLy8gYmFja3VwIGFuZCBjb3B5IGZpbGUKLQkJCQkJYm9vbGVhbiBjb3B5ID0gdHJ1ZTsKLQkJCQkJaWYgKGJhY2t1cCAhPSBudWxsICYmICEoYmFja3VwLmFwcGVuZChuYW1lKS50b0ZpbGUoKS5leGlzdHMoKSkpIHsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gRmlsZVV0aWwuY29weUZpbGUoY29uZkRpci5hcHBlbmQobmFtZSkudG9PU1N0cmluZygpLCBiYWNrdXAgKyBGaWxlLnNlcGFyYXRvciArIG5hbWUpOwotCQkJCQkJbXMuYWRkKHN0YXR1cyk7Ci0JCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQkJCQkJY29weSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoY29weSkgewotCQkJCQkJU3RyaW5nIGRlc3RQYXRoID0gY29uZkRpci5hcHBlbmQobmFtZSkudG9PU1N0cmluZygpOwotCQkJCQkJU3RyaW5nIGRlc3RDb250ZW50cyA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgc3JjQ29udGVudHMgPSBudWxsOwotCQkJCQkJRmlsZSBkZXN0ID0gbmV3IEZpbGUoZGVzdFBhdGgpOwotCQkJCQkJaWYgKGRlc3QuZXhpc3RzKCkpIHsKLQkJCQkJCQlJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGRlc3RQYXRoKTsKLQkJCQkJCQlkZXN0Q29udGVudHMgPSBUb21jYXRWZXJzaW9uSGVscGVyLmdldEZpbGVDb250ZW50cyhmaXMpOwotCQkJCQkJCWlmIChkZXN0Q29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJCQlmaXMgPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJCQkJCXNyY0NvbnRlbnRzID0gVG9tY2F0VmVyc2lvbkhlbHBlci5nZXRGaWxlQ29udGVudHMoZmlzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGVzdENvbnRlbnRzID09IG51bGwgfHwgc3JjQ29udGVudHMgPT0gbnVsbCB8fCAhc3JjQ29udGVudHMuZXF1YWxzKGRlc3RDb250ZW50cykpIHsKLQkJCQkJCQlJbnB1dFN0cmVhbSBpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQkJCQltcy5hZGQoRmlsZVV0aWwuY29weUZpbGUoaW4sIGRlc3RQYXRoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJiYWNrdXBBbmRQdWJsaXNoKCkgZXJyb3IiLCBlKTsKLQkJCQkJbXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCQkJfQotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBiYWNrdXBQYXRoKElQYXRoIHBhdGgsIElQYXRoIGNvbmZEaXIsIElQYXRoIGJhY2t1cCwgTXVsdGlTdGF0dXMgbXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlGaWxlW10gZmlsZXMgPSBwYXRoLnRvRmlsZSgpLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCQotCQlpbnQgc2l6ZSA9IGZpbGVzLmxlbmd0aDsKLQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMucHVibGlzaENvbmZpZ3VyYXRpb25UYXNrLCBzaXplICogMTAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0JCQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGVyUHVibGlzaFRhc2ssIG5ldyBTdHJpbmdbXSB7bmFtZX0pKTsKLQkJCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUHVibGlzaGluZyAiICsgbmFtZSk7Ci0KLQkJCQkvLyBiYWNrdXAgYW5kIGNvcHkgZmlsZQotCQkJCWJvb2xlYW4gY29weSA9IHRydWU7Ci0JCQkJaWYgKGJhY2t1cCAhPSBudWxsICYmICEoYmFja3VwLmFwcGVuZChuYW1lKS50b0ZpbGUoKS5leGlzdHMoKSkpIHsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBGaWxlVXRpbC5jb3B5RmlsZShjb25mRGlyLmFwcGVuZChuYW1lKS50b09TU3RyaW5nKCksIGJhY2t1cCArIEZpbGUuc2VwYXJhdG9yICsgbmFtZSk7Ci0JCQkJCW1zLmFkZChzdGF0dXMpOwotCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQkJCQljb3B5ID0gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjb3B5KQotCQkJCQltcy5hZGQoRmlsZVV0aWwuY29weUZpbGUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgY29uZkRpci5hcHBlbmQobmFtZSkudG9PU1N0cmluZygpKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgImJhY2t1cEFuZFB1Ymxpc2goKSBlcnJvciIsIGUpOwotCQkJCW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaENvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBwdWJsaXNoQ29udGV4dENvbmZpZyhJUGF0aCBiYXNlRGlyLCBJUGF0aCBkZXBsb3lEaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGFzc3VtZXMgbm90aGluZyB0byBkbwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyB1cGRhdGVDb250ZXh0c1RvU2VydmVEaXJlY3RseShJUGF0aCBiYXNlRGlyLCBTdHJpbmcgbG9hZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIG5vdGhpbmcgdG8gZG8KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXByb3RlY3RlZCBJU3RhdHVzIGNsZWFudXBTZXJ2ZXIoSVBhdGggY29uZkRpciwgSVBhdGggaW5zdGFsbERpciwgYm9vbGVhbiByZW1vdmVLZXB0Q29udGV4dEZpbGVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIG5vdGhpbmcgdG8gY2xlYW4KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCS8qKgotCSAqIE1ha2UgYW55IGxvY2FsIGNoYW5nZXMgdG8gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGF0IHRoZSBzcGVjaWZpZWQgcnVudGltZQotCSAqIGJhc2UgZGlyZWN0b3J5IG5lZWRlZCB0byBjb21wbGV0ZSBwdWJsaXNoaW5nIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcnVudGltZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBkZXBsb3lEaXIgZGVwbG95bWVudCBkaXJlY3RvcnkgZm9yIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gc2VydmVyIHNlcnZlciBiZWluZyBsb2NhbGl6ZWQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSVN0YXR1cyBsb2NhbGl6ZUNvbmZpZ3VyYXRpb24oSVBhdGggYmFzZURpciwgSVBhdGggZGVwbG95RGlyLCBUb21jYXRTZXJ2ZXIgc2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFpbiBzZXJ2ZXIgcG9ydC4KLQkgKiBAcmV0dXJuIFNlcnZlclBvcnQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU2VydmVyUG9ydCBnZXRNYWluUG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlZml4IHRoYXQgaXMgdXNlZCBpbiBmcm9udCBvZiB0aGUKLQkgKiB3ZWIgbW9kdWxlIHBhdGggcHJvcGVydHkuIChlLmcuICJ3ZWJhcHBzIikKLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jQmFzZVByZWZpeCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpYWwgVVJMIGFwcGxpY2FibGUgdG8gdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIHdlYk1vZHVsZSBhIHdlYiBtb2R1bGUKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aWFsIFVSTAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2ViTW9kdWxlVVJMKElNb2R1bGUgd2ViTW9kdWxlKSB7Ci0JCVdlYk1vZHVsZSBtb2R1bGUgPSBnZXRXZWJNb2R1bGUod2ViTW9kdWxlKTsKLQkJaWYgKG1vZHVsZSAhPSBudWxsKQotCQkJcmV0dXJuIG1vZHVsZS5nZXRQYXRoKCk7Ci0JCQotCQlJV2ViTW9kdWxlIHdlYk1vZHVsZTIgPSAoSVdlYk1vZHVsZSkgd2ViTW9kdWxlLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG51bGwpOwotCQlyZXR1cm4gIi8iICsgd2ViTW9kdWxlMi5nZXRDb250ZXh0Um9vdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdpdmVuIG1vZHVsZSBmcm9tIHRoZSBjb25maWcuCi0JICoKLQkgKiBAcGFyYW0gbW9kdWxlIGEgd2ViIG1vZHVsZQotCSAqIEByZXR1cm4gYSB3ZWIgbW9kdWxlCi0JICovCi0JcHVibGljIFdlYk1vZHVsZSBnZXRXZWJNb2R1bGUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCi0JCVN0cmluZyBtZW1lbnRvID0gbW9kdWxlLmdldElkKCk7Ci0JCi0JCUxpc3QgbW9kdWxlcyA9IGdldFdlYk1vZHVsZXMoKTsKLQkJaW50IHNpemUgPSBtb2R1bGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoV2ViTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCWlmIChtZW1lbnRvLmVxdWFscyh3ZWJNb2R1bGUuZ2V0TWVtZW50bygpKSkgewotCQkJCXJldHVybiB3ZWJNb2R1bGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2F2ZShJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eUxpc3RlbmVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQotCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl0cnkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9wZXJ0eUxpc3RlbmVycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZmlyaW5nIHByb3BlcnR5IGNoYW5nZSBldmVudCIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGluIHByb3BlcnR5IGV2ZW50IiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXByb3BlcnR5TGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcm9wZXJ0eUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIHNlcnZlci4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHByb3BlcnR5TGlzdGVuZXJzICE9IG51bGwpCi0JCQlwcm9wZXJ0eUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGltcG9ydEZyb21QYXRoKElQYXRoIHBhdGgsIGJvb2xlYW4gaXNUZXN0RW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9hZChwYXRoLCBtb25pdG9yKTsKLQl9Ci0KLQkvKnB1YmxpYyB2b2lkIGltcG9ydEZyb21SdW50aW1lKElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlsb2FkKHJ1bnRpbWUuZ2V0TG9jYXRpb24oKS5hcHBlbmQoImNvbmYiKSwgbW9uaXRvcik7Ci0JfSovCi0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbG9hZChJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxvYWQoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I2FkZFdlYk1vZHVsZShpbnQsIElUb21jYXRXZWJNb2R1bGUpCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgYWRkV2ViTW9kdWxlKGludCBpbmRleCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpOwotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSNyZW1vdmVXZWJNb2R1bGUoaW50KQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVdlYk1vZHVsZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgd29yayBkaXJlY3RvcnkgZm9yIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIGJhc2VQYXRoIHBhdGggdG8gc2VydmVyIHJ1bnRpbWUgZGlyZWN0b3J5Ci0JICogQHJldHVybiBwYXRoIGZvciB0aGUgc2VydmVyJ3Mgd29yayBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSVBhdGggZ2V0U2VydmVyV29ya0RpcmVjdG9yeShJUGF0aCBiYXNlUGF0aCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3b3JrIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUgb24gdGhlCi0JICogc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlUGF0aCBwYXRoIHRvIHNlcnZlciBydW50aW1lIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBtb2R1bGUgYSBUb21jYXQgd2ViIG1vZHVsZQotCSAqIEByZXR1cm4gcGF0aCBmb3IgdGhlIG1vZHVsZSdzIHdvcmsgZGlyZWN0b3J5IG9uIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSVBhdGggZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlRvbWNhdENvbmZpZ3VyYXRpb25bIiArIGdldEZvbGRlcigpICsgIl0iOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjU0ZjFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQcm9maWxlckRlbGVnYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIHsKLQotCXB1YmxpYyB2b2lkIGxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwgSUxhdW5jaCBsYXVuY2gsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWwuZ2V0U2VydmVyKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxhdW5jaCBjb25maWd1cmF0aW9uIGNvdWxkIG5vdCBmaW5kIHNlcnZlciIpOwotCQkJLy8gdGhyb3cgQ29yZUV4Y2VwdGlvbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoc2VydmVyLnNob3VsZFB1Ymxpc2goKSAmJiBTZXJ2ZXJDb3JlLmlzQXV0b1B1Ymxpc2hpbmcoKSkKLQkJCXNlcnZlci5wdWJsaXNoKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbW9uaXRvcik7Ci0JCQotCQlUb21jYXRTZXJ2ZXJCZWhhdmlvdXIgdG9tY2F0U2VydmVyID0gKFRvbWNhdFNlcnZlckJlaGF2aW91cikgc2VydmVyLmxvYWRBZGFwdGVyKFRvbWNhdFNlcnZlckJlaGF2aW91ci5jbGFzcywgbnVsbCk7Ci0JCQotCQlTdHJpbmcgbWFpblR5cGVOYW1lID0gdG9tY2F0U2VydmVyLmdldFJ1bnRpbWVDbGFzcygpOwotCQkKLQkJSVZNSW5zdGFsbCB2bSA9IHZlcmlmeVZNSW5zdGFsbChjb25maWd1cmF0aW9uKTsKLQkJCi0JCUlWTVJ1bm5lciBydW5uZXIgPSB2bS5nZXRWTVJ1bm5lcihtb2RlKTsKLQkJaWYgKHJ1bm5lciA9PSBudWxsKQotCQkJcnVubmVyID0gdm0uZ2V0Vk1SdW5uZXIoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotCQkKLQkJRmlsZSB3b3JraW5nRGlyID0gdmVyaWZ5V29ya2luZ0RpcmVjdG9yeShjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIHdvcmtpbmdEaXJOYW1lID0gbnVsbDsKLQkJaWYgKHdvcmtpbmdEaXIgIT0gbnVsbCkKLQkJCXdvcmtpbmdEaXJOYW1lID0gd29ya2luZ0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCi0JCS8vIFByb2dyYW0gJiBWTSBhcmdzCi0JCVN0cmluZyBwZ21BcmdzID0gZ2V0UHJvZ3JhbUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIHZtQXJncyA9IGdldFZNQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmdbXSBlbnZwID0gZ2V0RW52aXJvbm1lbnQoY29uZmlndXJhdGlvbik7Ci0JCQotCQlFeGVjdXRpb25Bcmd1bWVudHMgZXhlY0FyZ3MgPSBuZXcgRXhlY3V0aW9uQXJndW1lbnRzKHZtQXJncywgcGdtQXJncyk7Ci0JCQotCQkvLyBWTS1zcGVjaWZpYyBhdHRyaWJ1dGVzCi0JCU1hcCB2bUF0dHJpYnV0ZXNNYXAgPSBnZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcChjb25maWd1cmF0aW9uKTsKLQkJCi0JCS8vIENsYXNzcGF0aAotCQlTdHJpbmdbXSBjbGFzc3BhdGggPSBnZXRDbGFzc3BhdGgoY29uZmlndXJhdGlvbik7Ci0JCQotCQkvLyBDcmVhdGUgVk0gY29uZmlnCi0JCVZNUnVubmVyQ29uZmlndXJhdGlvbiBydW5Db25maWcgPSBuZXcgVk1SdW5uZXJDb25maWd1cmF0aW9uKG1haW5UeXBlTmFtZSwgY2xhc3NwYXRoKTsKLQkJcnVuQ29uZmlnLnNldFByb2dyYW1Bcmd1bWVudHMoZXhlY0FyZ3MuZ2V0UHJvZ3JhbUFyZ3VtZW50c0FycmF5KCkpOwotCQlydW5Db25maWcuc2V0Vk1Bcmd1bWVudHMoZXhlY0FyZ3MuZ2V0Vk1Bcmd1bWVudHNBcnJheSgpKTsKLQkJcnVuQ29uZmlnLnNldFdvcmtpbmdEaXJlY3Rvcnkod29ya2luZ0Rpck5hbWUpOwotCQlydW5Db25maWcuc2V0RW52aXJvbm1lbnQoZW52cCk7Ci0JCXJ1bkNvbmZpZy5zZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcCh2bUF0dHJpYnV0ZXNNYXApOwotCQkKLQkJLy8gQm9vdHBhdGgKLQkJU3RyaW5nW10gYm9vdHBhdGggPSBnZXRCb290cGF0aChjb25maWd1cmF0aW9uKTsKLQkJaWYgKGJvb3RwYXRoICE9IG51bGwgJiYgYm9vdHBhdGgubGVuZ3RoID4gMCkKLQkJCXJ1bkNvbmZpZy5zZXRCb290Q2xhc3NQYXRoKGJvb3RwYXRoKTsKLQkJCi0JCXNldERlZmF1bHRTb3VyY2VMb2NhdG9yKGxhdW5jaCwgY29uZmlndXJhdGlvbik7Ci0JCQotCQlpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkgewotCQkJdHJ5IHsKLQkJCQlTZXJ2ZXJQcm9maWxlckRlbGVnYXRlLmNvbmZpZ3VyZVByb2ZpbGluZyhsYXVuY2gsIHZtLCBydW5Db25maWcsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCXRvbWNhdFNlcnZlci5zdG9wSW1wbCgpOwotCQkJCXRocm93IGNlOwotCQkJfQotCQl9Ci0JCQotCQkvLyBMYXVuY2ggdGhlIGNvbmZpZ3VyYXRpb24KLQkJdG9tY2F0U2VydmVyLnNldHVwTGF1bmNoKGxhdW5jaCwgbW9kZSwgbW9uaXRvcik7Ci0JCXRyeSB7Ci0JCQlydW5uZXIucnVuKHJ1bkNvbmZpZywgbGF1bmNoLCBtb25pdG9yKTsKLQkJCXRvbWNhdFNlcnZlci5hZGRQcm9jZXNzTGlzdGVuZXIobGF1bmNoLmdldFByb2Nlc3NlcygpWzBdKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSAtIHByb2Nlc3MgZmFpbGVkCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmMzkwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklXZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5IdHRwTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5XZWJSZXNvdXJjZTsKLS8qKgotICogTGF1bmNoYWJsZSBhZGFwdGVyIGRlbGVnYXRlIGZvciBXZWIgcmVzb3VyY2VzIGluIFRvbWNhdC4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgZXh0ZW5kcyBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIHsKLQkvKgotCSAqIEBzZWUgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSNnZXRMYXVuY2hhYmxlKElTZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVPYmplY3QpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJUb21jYXRMYXVuY2hhYmxlQWRhcHRlciAiICsgc2VydmVyICsgIi0iICsgbW9kdWxlT2JqZWN0KTsKLQkJaWYgKHNlcnZlci5nZXRBZGFwdGVyKFRvbWNhdFNlcnZlci5jbGFzcykgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShtb2R1bGVPYmplY3QgaW5zdGFuY2VvZiBTZXJ2bGV0KSAmJgotCQkJIShtb2R1bGVPYmplY3QgaW5zdGFuY2VvZiBXZWJSZXNvdXJjZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG1vZHVsZU9iamVjdC5nZXRNb2R1bGUoKS5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLCBudWxsKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQl0cnkgewotCQkJVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoSVVSTFByb3ZpZGVyLmNsYXNzLCBudWxsKSkuZ2V0TW9kdWxlUm9vdFVSTChtb2R1bGVPYmplY3QuZ2V0TW9kdWxlKCkpOwotCQkJCi0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgInJvb3Q6ICIgKyB1cmwpOwotCQkJCi0JCQlpZiAobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgU2VydmxldCkgewotCQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBtb2R1bGVPYmplY3Q7Ci0JCQkJaWYgKHNlcnZsZXQuZ2V0QWxpYXMoKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gc2VydmxldC5nZXRBbGlhcygpOwotCQkJCQlpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpCi0JCQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0JCQkJCXVybCA9IG5ldyBVUkwodXJsLCBwYXRoKTsKLQkJCQl9IGVsc2UKLQkJCQkJdXJsID0gbmV3IFVSTCh1cmwsICJzZXJ2bGV0LyIgKyBzZXJ2bGV0LmdldFNlcnZsZXRDbGFzc05hbWUoKSk7Ci0JCQl9IGVsc2UgaWYgKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIFdlYlJlc291cmNlKSB7Ci0JCQkJV2ViUmVzb3VyY2UgcmVzb3VyY2UgPSAoV2ViUmVzb3VyY2UpIG1vZHVsZU9iamVjdDsKLQkJCQlTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAicGF0aDogIiArIHBhdGgpOwotCQkJCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5zdGFydHNXaXRoKCIvIikgJiYgcGF0aC5sZW5ndGgoKSA+IDApCi0JCQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLQkJCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwKQotCQkJCQl1cmwgPSBuZXcgVVJMKHVybCwgcGF0aCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEh0dHBMYXVuY2hhYmxlKHVybCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIFVSTCBmb3IgIiArIG1vZHVsZU9iamVjdCwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWVhMzQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0vKioKLSAqIFRoZSBUb21jYXQgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFRvbWNhdFBsdWdpbiBzaW5nbGV0b247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT01DQVRfMzIgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuMzIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPTUNBVF80MCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9NQ0FUXzQxID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT01DQVRfNTAgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPTUNBVF81NSA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41NSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9NQ0FUXzYwID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjYwIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUklGWV9JTlNUQUxMX0ZJTEUgPSAidmVyaWZ5SW5zdGFsbC5wcm9wZXJ0aWVzIjsKLQlwcm90ZWN0ZWQgc3RhdGljIFZlcmlmeVJlc291cmNlU3BlY1tdIHZlcmlmeTMyOwotCXByb3RlY3RlZCBzdGF0aWMgVmVyaWZ5UmVzb3VyY2VTcGVjW10gdmVyaWZ5NDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBWZXJpZnlSZXNvdXJjZVNwZWNbXSB2ZXJpZnk0MTsKLQlwcm90ZWN0ZWQgc3RhdGljIFZlcmlmeVJlc291cmNlU3BlY1tdIHZlcmlmeTUwOwotCXByb3RlY3RlZCBzdGF0aWMgVmVyaWZ5UmVzb3VyY2VTcGVjW10gdmVyaWZ5NTU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBWZXJpZnlSZXNvdXJjZVNwZWNbXSB2ZXJpZnk2MDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTdGF0dXMgZW1wdHlJbnN0YWxsRGlyU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckluc3RhbGxEaXJFbXB0eSwgbnVsbCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJU3RhdHVzIHdyb25nRGlyVmVyc2lvblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JJbnN0YWxsRGlyV3JvbmdWZXJzaW9uLCBudWxsKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTdGF0dXMgaW5zdGFsbERpckRvZXNOb3RFeGlzdCA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JJbnN0YWxsRGlyRG9lc05vdEV4aXN0LCBudWxsKTsKLQotCS8qKgotCSAqIFRvbWNhdFBsdWdpbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBUb21jYXRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNpbmdsZXRvbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuaW50ZXJuYWwuVG9tY2F0UGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBUb21jYXRQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbnN0YWxsIGxvY2F0aW9uIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGlkIGEgcnVudGltZSB0eXBlIGlkCi0JICogQHJldHVybiB0aGUgaW5zdGFsbCBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZlcmVuY2UoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKGlkKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBpbnN0YWxsIGxvY2F0aW9uIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBydW50aW10IHR5cGUgaWQKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByZWZlcmVuY2UoU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKGlkLCB2YWx1ZSk7Ci0JCWdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBsb2dnaW5nLgotCSAqCi0JICogQHBhcmFtIHN0YXR1cyBhIHN0YXR1cyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVG9tY2F0IGhvbWUgZGlyZWN0b3J5LgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFRvbWNhdFN0YXRlTG9jYXRpb24oKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFRvbWNhdCB2ZXJzaW9uIGhhbmRsZXIuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybiBhIHZlcnNpb24gaGFuZGxlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVRvbWNhdFZlcnNpb25IYW5kbGVyIGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKFN0cmluZyBpZCkgewotCQlpZiAoaWQuaW5kZXhPZigicnVudGltZSIpID4gMCkKLQkJCWlkID0gaWQuc3Vic3RyaW5nKDAsIDMwKSArIGlkLnN1YnN0cmluZygzOCk7Ci0JCS8vaWQgPSBpZC5zdWJzdHJpbmcoMCwgaWQubGVuZ3RoKCkgLSA4KTsKLQkJaWYgKFRPTUNBVF8zMi5lcXVhbHMoaWQpKQotCQkJcmV0dXJuIG5ldyBUb21jYXQzMkhhbmRsZXIoKTsKLQkJZWxzZSBpZiAoVE9NQ0FUXzQwLmVxdWFscyhpZCkpCi0JCQlyZXR1cm4gbmV3IFRvbWNhdDQwSGFuZGxlcigpOwotCQllbHNlIGlmIChUT01DQVRfNDEuZXF1YWxzKGlkKSkKLQkJCXJldHVybiBuZXcgVG9tY2F0NDFIYW5kbGVyKCk7Ci0JCWVsc2UgaWYgKFRPTUNBVF81MC5lcXVhbHMoaWQpKQotCQkJcmV0dXJuIG5ldyBUb21jYXQ1MEhhbmRsZXIoKTsKLQkJZWxzZSBpZiAoVE9NQ0FUXzU1LmVxdWFscyhpZCkpCi0JCQlyZXR1cm4gbmV3IFRvbWNhdDU1SGFuZGxlcigpOwotCQllbHNlIGlmIChUT01DQVRfNjAuZXF1YWxzKGlkKSkKLQkJCXJldHVybiBuZXcgVG9tY2F0NjBIYW5kbGVyKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBmaWxlcyB0byB2ZXJpZnkgdGhlIFRvbWNhdCBpbnN0YWxsYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRWZXJpZnlGaWxlcygpIHsKLQkJaWYgKHZlcmlmeTMyICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCS8vIGJhY2t1cCAoZW1wdHkpIHZhbHVlcwotCQl2ZXJpZnkzMiA9IG5ldyBWZXJpZnlSZXNvdXJjZVNwZWNbMF07Ci0JCXZlcmlmeTQwID0gbmV3IFZlcmlmeVJlc291cmNlU3BlY1swXTsKLQkJdmVyaWZ5NDEgPSBuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjWzBdOwotCQl2ZXJpZnk1MCA9IG5ldyBWZXJpZnlSZXNvdXJjZVNwZWNbMF07Ci0JCXZlcmlmeTU1ID0gbmV3IFZlcmlmeVJlc291cmNlU3BlY1swXTsKLQkJdmVyaWZ5NjAgPSBuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjWzBdOwotCQkKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KFZFUklGWV9JTlNUQUxMX0ZJTEUpOwotCQkJdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXAubG9hZCh1cmwub3BlblN0cmVhbSgpKTsKLQotCQkJLy8gQ2hlY2sgYmFja2Rvb3Igc3lzdGVtIHByb3BlcnR5LCB1c2UgaW50ZXJuYWwgc3BlYyBpZiBub3QgZm91bmQKLQkJCVN0cmluZyB2ZXJpZnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUExVR0lOX0lEICsgIi52ZXJpZnkzMmluc3RhbGwiKTsKLQkJCWlmICh2ZXJpZnkgPT0gbnVsbCkgewotCQkJCXZlcmlmeSA9IHAuZ2V0UHJvcGVydHkoInZlcmlmeTMyaW5zdGFsbCIpOwotCQkJfQotCQkJdmVyaWZ5LnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZlcmlmeSwgIiwiKTsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJbGlzdC5hZGQobmV3IFZlcmlmeVJlc291cmNlU3BlYyhzdC5uZXh0VG9rZW4oKSkpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiVmVyaWZ5MzI6ICIgKyBsaXN0LnRvU3RyaW5nKCkpOwotCQkJdmVyaWZ5MzIgPSBuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheSh2ZXJpZnkzMik7Ci0KLQkJCS8vIHY0LjAKLQkJCS8vIENoZWNrIGJhY2tkb29yIHN5c3RlbSBwcm9wZXJ0eSwgdXNlIGludGVybmFsIHNwZWMgaWYgbm90IGZvdW5kCi0JCQl2ZXJpZnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUExVR0lOX0lEICsgIi52ZXJpZnk0MGluc3RhbGwiKTsKLQkJCWlmICh2ZXJpZnkgPT0gbnVsbCkgewotCQkJCXZlcmlmeSA9IHAuZ2V0UHJvcGVydHkoInZlcmlmeTQwaW5zdGFsbCIpOwotCQkJfQotCQkJdmVyaWZ5LnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0JCQlzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyaWZ5LCAiLCIpOwotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJbGlzdC5hZGQobmV3IFZlcmlmeVJlc291cmNlU3BlYyhzdC5uZXh0VG9rZW4oKSkpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiVmVyaWZ5NDA6ICIgKyBsaXN0LnRvU3RyaW5nKCkpOwotCQkJdmVyaWZ5NDAgPSBuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheSh2ZXJpZnk0MCk7Ci0JCQkKLQkJCS8vIHY0LjEKLQkJCS8vIENoZWNrIGJhY2tkb29yIHN5c3RlbSBwcm9wZXJ0eSwgdXNlIGludGVybmFsIHNwZWMgaWYgbm90IGZvdW5kCi0JCQl2ZXJpZnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUExVR0lOX0lEICsgIi52ZXJpZnk0MWluc3RhbGwiKTsKLQkJCWlmICh2ZXJpZnkgPT0gbnVsbCkgewotCQkJCXZlcmlmeSA9IHAuZ2V0UHJvcGVydHkoInZlcmlmeTQxaW5zdGFsbCIpOwotCQkJfQotCQkJdmVyaWZ5LnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0JCQlzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyaWZ5LCAiLCIpOwotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJbGlzdC5hZGQobmV3IFZlcmlmeVJlc291cmNlU3BlYyhzdC5uZXh0VG9rZW4oKSkpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiVmVyaWZ5NDE6ICIgKyBsaXN0LnRvU3RyaW5nKCkpOwotCQkJdmVyaWZ5NDEgPSBuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheSh2ZXJpZnk0MSk7Ci0JCQkKLQkJCS8vIHY1LjAKLQkJCS8vIENoZWNrIGJhY2tkb29yIHN5c3RlbSBwcm9wZXJ0eSwgdXNlIGludGVybmFsIHNwZWMgaWYgbm90IGZvdW5kCi0JCQl2ZXJpZnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUExVR0lOX0lEICsgIi52ZXJpZnk1MGluc3RhbGwiKTsKLQkJCWlmICh2ZXJpZnkgPT0gbnVsbCkgewotCQkJCXZlcmlmeSA9IHAuZ2V0UHJvcGVydHkoInZlcmlmeTUwaW5zdGFsbCIpOwotCQkJfQotCQkJdmVyaWZ5LnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0JCQlzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyaWZ5LCAiLCIpOwotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJbGlzdC5hZGQobmV3IFZlcmlmeVJlc291cmNlU3BlYyhzdC5uZXh0VG9rZW4oKSkpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiVmVyaWZ5NTA6ICIgKyBsaXN0LnRvU3RyaW5nKCkpOwotCQkJdmVyaWZ5NTAgPSBuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheSh2ZXJpZnk1MCk7Ci0KLQkJCS8vIHY1LjUKLQkJCS8vIENoZWNrIGJhY2tkb29yIHN5c3RlbSBwcm9wZXJ0eSwgdXNlIGludGVybmFsIHNwZWMgaWYgbm90IGZvdW5kCi0JCQl2ZXJpZnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUExVR0lOX0lEICsgIi52ZXJpZnk1NWluc3RhbGwiKTsKLQkJCWlmICh2ZXJpZnkgPT0gbnVsbCkgewotCQkJCXZlcmlmeSA9IHAuZ2V0UHJvcGVydHkoInZlcmlmeTU1aW5zdGFsbCIpOwotCQkJfQotCQkJdmVyaWZ5LnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0JCQlzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyaWZ5LCAiLCIpOwotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJbGlzdC5hZGQobmV3IFZlcmlmeVJlc291cmNlU3BlYyhzdC5uZXh0VG9rZW4oKSkpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiVmVyaWZ5NTU6ICIgKyBsaXN0LnRvU3RyaW5nKCkpOwotCQkJdmVyaWZ5NTUgPSBuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheSh2ZXJpZnk1NSk7Ci0KLQkJCS8vIHY2LjAKLQkJCS8vIENoZWNrIGJhY2tkb29yIHN5c3RlbSBwcm9wZXJ0eSwgdXNlIGludGVybmFsIHNwZWMgaWYgbm90IGZvdW5kCi0JCQl2ZXJpZnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUExVR0lOX0lEICsgIi52ZXJpZnk2MGluc3RhbGwiKTsKLQkJCWlmICh2ZXJpZnkgPT0gbnVsbCkgewotCQkJCXZlcmlmeSA9IHAuZ2V0UHJvcGVydHkoInZlcmlmeTYwaW5zdGFsbCIpOwotCQkJfQotCQkJdmVyaWZ5LnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0JCQlzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyaWZ5LCAiLCIpOwotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJbGlzdC5hZGQobmV3IFZlcmlmeVJlc291cmNlU3BlYyhzdC5uZXh0VG9rZW4oKSkpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiVmVyaWZ5NjA6ICIgKyBsaXN0LnRvU3RyaW5nKCkpOwotCQkJdmVyaWZ5NjAgPSBuZXcgVmVyaWZ5UmVzb3VyY2VTcGVjW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheSh2ZXJpZnk2MCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbG9hZCBpbnN0YWxsYXRpb24gdmVyaWZpY2F0aW9uIHByb3BlcnRpZXMiLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHZlcmlmeSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGFjY29yZGluZyB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc2VydmVyIElELiAgVGhlIHZlcmlmaWNhdGlvbiBpbmNsdWRlcyBjaGVja2luZyB0aGUgaW5zdGFsbGF0aW9uCi0JICogZGlyZWN0b3J5IG5hbWUgdG8gc2VlIGlmIGl0IGluZGljYXRlcyBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIFRvbWNhdC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFsbFBhdGggUGF0aCB0byB2ZXJpZnkKLQkgKiBAcGFyYW0gaWQgVHlwZSBJRCBvZiB0aGUgc2VydmVyCi0JICogQHJldHVybiBTdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbi4gIFdpbGwgYmUgU3RhdHVzLk9LX1NUQVRVUywgaWYgdmVyaWZpY2F0aW9uCi0JICogICAgd2FzIHN1Y2Nlc3NmdWwsIG9yIGVycm9yIHN0YXR1cyBpZiBub3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZlcmlmeUluc3RhbGxQYXRoV2l0aEZvbGRlckNoZWNrKElQYXRoIGluc3RhbGxQYXRoLCBTdHJpbmcgaWQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSB2ZXJpZnlUb21jYXRWZXJzaW9uRnJvbVBhdGgoaW5zdGFsbFBhdGgsIGlkKTsKLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCXN0YXR1cyA9IHZlcmlmeUluc3RhbGxQYXRoKGluc3RhbGxQYXRoLCBpZCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZnkgdGhlIFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YWxsUGF0aCBQYXRoIHRvIHZlcmlmeQotCSAqIEBwYXJhbSBpZCBUeXBlIElEIG9mIHRoZSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIFN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uLiAgV2lsbCBiZSBTdGF0dXMuT0tfU1RBVFVTLCBpZiB2ZXJpZmljYXRpb24KLQkgKiAgICB3YXMgc3VjY2Vzc2Z1bCwgb3IgZXJyb3Igc3RhdHVzIGlmIG5vdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGggaW5zdGFsbFBhdGgsIFN0cmluZyBpZCkgewotCQlpZiAoaW5zdGFsbFBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBlbXB0eUluc3RhbGxEaXJTdGF0dXM7Ci0JCQotCQlTdHJpbmcgZGlyID0gaW5zdGFsbFBhdGgudG9PU1N0cmluZygpOwotCQlpZiAoZGlyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGVtcHR5SW5zdGFsbERpclN0YXR1czsKLQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gaW5zdGFsbERpckRvZXNOb3RFeGlzdDsKLQotCQlpZiAoIWRpci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQlkaXIgKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCQotCQkvLyBsb29rIGZvciB0aGUgZm9sbG93aW5nIGZpbGVzIGFuZCBkaXJlY3RvcmllcwotCQlUb21jYXRQbHVnaW4ubG9hZFZlcmlmeUZpbGVzKCk7Ci0JCQotCQlWZXJpZnlSZXNvdXJjZVNwZWNbXSBzcGVjcyA9IG51bGw7Ci0JCWlmIChUT01DQVRfMzIuZXF1YWxzKGlkKSkKLQkJCXNwZWNzID0gdmVyaWZ5MzI7Ci0JCWVsc2UgaWYgKFRPTUNBVF80MC5lcXVhbHMoaWQpKQotCQkJc3BlY3MgPSB2ZXJpZnk0MDsKLQkJZWxzZSBpZiAoVE9NQ0FUXzQxLmVxdWFscyhpZCkpCi0JCQlzcGVjcyA9IHZlcmlmeTQxOwotCQllbHNlIGlmIChUT01DQVRfNTAuZXF1YWxzKGlkKSkKLQkJCXNwZWNzID0gdmVyaWZ5NTA7Ci0JCWVsc2UgaWYgKFRPTUNBVF81NS5lcXVhbHMoaWQpKSB7Ci0JCQlzcGVjcyA9IHZlcmlmeTU1OwotCQl9Ci0JCWVsc2UgaWYgKFRPTUNBVF82MC5lcXVhbHMoaWQpKSB7Ci0JCQlzcGVjcyA9IHZlcmlmeTYwOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yVW5rbm93blZlcnNpb24sIG51bGwpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjcy5sZW5ndGg7IGkrKykgewotCQkJVmVyaWZ5UmVzb3VyY2VTcGVjIGZzID0gc3BlY3NbaV07Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGZzLmNoZWNrUmVzb3VyY2UoZGlyKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZlcmlmeVRvbWNhdFZlcnNpb25Gcm9tUGF0aChJUGF0aCBpbnN0YWxsUGF0aCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclZlcnNpb25FbXB0eSwgbnVsbCk7Ci0JCWlmIChpbnN0YWxsUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGVtcHR5SW5zdGFsbERpclN0YXR1czsKLQotCQlTdHJpbmcgcyA9IGluc3RhbGxQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKHMuaW5kZXhPZigiLTMuMiIpID4gMCB8fCBzLmluZGV4T2YoIiAzLjIiKSA+IDApCi0JCQlyZXR1cm4gVE9NQ0FUXzMyLmVxdWFscyh2ZXJzaW9uKSA/IFN0YXR1cy5PS19TVEFUVVMgOiB3cm9uZ0RpclZlcnNpb25TdGF0dXM7Ci0JCWlmIChzLmluZGV4T2YoIi00LjAiKSA+IDAgfHwgcy5pbmRleE9mKCIgNC4wIikgPiAwKQotCQkJcmV0dXJuIFRPTUNBVF80MC5lcXVhbHModmVyc2lvbikgPyBTdGF0dXMuT0tfU1RBVFVTIDogd3JvbmdEaXJWZXJzaW9uU3RhdHVzOwotCQlpZiAocy5pbmRleE9mKCItNC4xIikgPiAwIHx8IHMuaW5kZXhPZigiIDQuMSIpID4gMCkKLQkJCXJldHVybiBUT01DQVRfNDEuZXF1YWxzKHZlcnNpb24pID8gU3RhdHVzLk9LX1NUQVRVUyA6IHdyb25nRGlyVmVyc2lvblN0YXR1czsKLQkJaWYgKHMuaW5kZXhPZigiLTUuMCIpID4gMCB8fCBzLmluZGV4T2YoIiA1LjAiKSA+IDApCi0JCQlyZXR1cm4gVE9NQ0FUXzUwLmVxdWFscyh2ZXJzaW9uKSA/IFN0YXR1cy5PS19TVEFUVVMgOiB3cm9uZ0RpclZlcnNpb25TdGF0dXM7Ci0JCWlmIChzLmluZGV4T2YoIi01LjUiKSA+IDAgfHwgcy5pbmRleE9mKCIgNS41IikgPiAwKQotCQkJcmV0dXJuIFRPTUNBVF81NS5lcXVhbHModmVyc2lvbikgPyBTdGF0dXMuT0tfU1RBVFVTIDogd3JvbmdEaXJWZXJzaW9uU3RhdHVzOwotCQlpZiAocy5pbmRleE9mKCItNi4wIikgPiAwIHx8IHMuaW5kZXhPZigiIDYuMCIpID4gMCkKLQkJCXJldHVybiBUT01DQVRfNjAuZXF1YWxzKHZlcnNpb24pID8gU3RhdHVzLk9LX1NUQVRVUyA6IHdyb25nRGlyVmVyc2lvblN0YXR1czsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgPGNvZGU+amF2YS5pby5GaWxlPC9jb2RlPiBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3BlY2lmaWVkCi0JICogPGNvZGU+SVBhdGg8L2NvZGU+IGluIHRoZSBwbHVnaW4gZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gYSBmaWxlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBGaWxlIGdldFBsdWdpbigpIHsKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVVJMID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIGxvY2FsVVJMID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKGluc3RhbGxVUkwpOwotCQkJcmV0dXJuIG5ldyBGaWxlKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UHVibGlzaE1vZHVsZVZpc2l0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UHVibGlzaE1vZHVsZVZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxNzc4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFB1Ymxpc2hNb2R1bGVWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElnb3IgRmVkb3JlbmtvICYgRmFicml6aW8gR2l1c3RpbmEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwud3N0LklNb2R1bGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuU2VydmVySW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi0vKioKLSAqIEhhbmRsZXMgInB1Ymxpc2hpbmciIGZvciBzZXJ2ZXJzIHRoYXQgY2FuIGxvYWQgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIGRpcmVjdGx5Ci0gKiBmcm9tIHRoZSB3b3Jrc3BhY2UuIEluc3RlYWQgb2YgY3JlYXRpbmcgYW5kIGRlcGxveWluZyBqYXJzIHRvIHRoZSB3ZWJhcHAgdGhpcwotICogc2ltcGx5IHVwZGF0ZSB0aGUgdmlydHVhbCBjbGFzc3BhdGggaW4gdGhlIGNvbnRleHQgeG1sIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRQdWJsaXNoTW9kdWxlVmlzaXRvciBpbXBsZW1lbnRzIElNb2R1bGVWaXNpdG9yIHsKLQotICAgIC8qKgotICAgICAqIFNlcnZlciBiYXNlIHBhdGggKENhdGFsaW5hIGJhc2UpLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBJUGF0aCBiYXNlRGlyOwotICAgIAotICAgIC8qKgotICAgICAqIFNlcnZlciBpbnN0YW5jZSBpbiB3aGljaCB0byBtb2RpZnkgdGhlIGNvbnRleHQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgU2VydmVySW5zdGFuY2Ugc2VydmVySW5zdGFuY2U7Ci0KLSAgICAvKioKLSAgICAgKiBDYXRhbGluYS5wcm9wZXJ0aWVzIGxvYWRlciB0byBhZGQgZ2xvYmFsIGNsYXNzcGF0aCBlbnRyaWVzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBzaGFyZWRMb2FkZXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xhc3NwYXRoIGVudHJpZXMgYWRkZWQgYnkgZWFyIGNvbmZpZ3VyYXRpb25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0IGVhckNvbW1vblJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIExpc3Qgb2YgY2xhc3NwYXRoIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBjdXN0b20gdG9tY2F0IGxvYWRlci4KLSAgICAgKiBUaGlzIHNldCBzaG91bGQgaW5jbHVkZSBhbnkgY2xhc3MgZGlyIGZyb20gcmVmZXJlbmNlZCBwcm9qZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTZXQgdmlydHVhbENsYXNzQ2xhc3NwYXRoRWxlbWVudHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotICAgIHByb3RlY3RlZCBTZXQgdmlydHVhbEphckNsYXNzcGF0aEVsZW1lbnRzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQotICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlIGEgbmV3IFRvbWNhdFB1Ymxpc2hNb2R1bGVWaXNpdG9yCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdGFsaW5hQmFzZSBjYXRhbGluYSBiYXNlIHBhdGgKLSAgICAgKi8KLSAgICBUb21jYXRQdWJsaXNoTW9kdWxlVmlzaXRvcihJUGF0aCBjYXRhbGluYUJhc2UsIFNlcnZlckluc3RhbmNlIHNlcnZlckluc3RhbmNlLCBTdHJpbmcgc2hhcmVkTG9hZGVyKSB7Ci0gICAgICAgIHRoaXMuYmFzZURpciA9IGNhdGFsaW5hQmFzZTsKLSAgICAgICAgdGhpcy5zZXJ2ZXJJbnN0YW5jZSA9IHNlcnZlckluc3RhbmNlOwotICAgICAgICB0aGlzLnNoYXJlZExvYWRlciA9IHNoYXJlZExvYWRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElNb2R1bGVWaXNpdG9yI3Zpc2l0V2ViQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0V2ViQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbywgZXZlcnl0aGluZyBpcyBkb25lIGluIGVuZFZpc2l0V2ViQ29tcG9uZW50Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTW9kdWxlVmlzaXRvciN2aXNpdEFyY2hpdmVDb21wb25lbnQoSVBhdGgsIElQYXRoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0QXJjaGl2ZUNvbXBvbmVudChJUGF0aCBydW50aW1lUGF0aCwgSVBhdGggd29ya3NwYWNlUGF0aCkgewotICAgICAgICBhZGRWaXJ0dWFsSmFyUmVzb3VyY2UocnVudGltZVBhdGgsIHdvcmtzcGFjZVBhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSU1vZHVsZVZpc2l0b3IjdmlzaXREZXBlbmRlbnRDb21wb25lbnQoSVBhdGgsIElQYXRoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0RGVwZW5kZW50Q29tcG9uZW50KElQYXRoIHJ1bnRpbWVQYXRoLCBJUGF0aCB3b3Jrc3BhY2VQYXRoKSB7Ci0gICAgICAgIGFkZFZpcnR1YWxKYXJSZXNvdXJjZShydW50aW1lUGF0aCwgd29ya3NwYWNlUGF0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTW9kdWxlVmlzaXRvciN2aXNpdFdlYlJlc291cmNlKElQYXRoLCBJUGF0aCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFdlYlJlc291cmNlKElQYXRoIHJ1bnRpbWVQYXRoLCBJUGF0aCB3b3Jrc3BhY2VQYXRoKSB7Ci0gICAgICAgIGFkZFZpcnR1YWxDbGFzc1Jlc291cmNlKHJ1bnRpbWVQYXRoLCB3b3Jrc3BhY2VQYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIElNb2R1bGVWaXNpdG9yI3Zpc2l0RWFyUmVzb3VyY2UoSVBhdGgsIElQYXRoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0RWFyUmVzb3VyY2UoSVBhdGggcnVudGltZVBhdGgsIElQYXRoIHdvcmtzcGFjZVBhdGgpIHsKLSAgICAgICAgZWFyQ29tbW9uUmVzb3VyY2VzLmFkZCh3b3Jrc3BhY2VQYXRoLnRvT1NTdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJTW9kdWxlVmlzaXRvciNlbmRWaXNpdEVhckNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRWaXNpdEVhckNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChlYXJDb21tb25SZXNvdXJjZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDYXRhbGluYVByb3BlcnRpZXNVdGlsLmFkZEdsb2JhbENsYXNzcGF0aChiYXNlRGlyLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAJCSJjb25mL2NhdGFsaW5hLnByb3BlcnRpZXMiKS50b0ZpbGUoKSwgc2hhcmVkTG9hZGVyLAotICAgICAgICAgICAgICAgIAkJKFN0cmluZ1tdKSBlYXJDb21tb25SZXNvdXJjZXMudG9BcnJheShuZXcgU3RyaW5nW2VhckNvbW1vblJlc291cmNlcy5zaXplKCldKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlVuYWJsZSB0byBhZGQgZWFyIHBhdGggZW50cmllcyB0byBjYXRhbGluYS5wcm9wZXJ0aWVzIiwgZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGVhckNvbW1vblJlc291cmNlcy5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZFZpc2l0V2ViQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyB0cmFjayBjb250ZXh0IGNoYW5nZXMsIGRvbid0IHJld3JpdGUgaWYgbm90IG5lZWRlZAotICAgICAgICBib29sZWFuIGRpcnR5ID0gZmFsc2U7Ci0KLSAgICAgICAgSU1vZHVsZSBtb2R1bGUgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZShjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQotICAgICAgICAvLyB3ZSBuZWVkIHRoaXMgZm9yIHRoZSB1c2VyLXNwZWNpZmllZCBjb250ZXh0IHBhdGgKLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZmluZENvbnRleHQobW9kdWxlKTsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAJU3RyaW5nIG5hbWUgPSBtb2R1bGUgIT0gbnVsbCA/IG1vZHVsZS5nZXROYW1lKCkgOiBjb21wb25lbnQuZ2V0TmFtZSgpOwotICAgIAkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGZpbmQgY29udGV4dCBmb3IgbW9kdWxlICIgKyBuYW1lKTsKLSAgICAJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwKLSAgICAJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoQ29udGV4dE5vdEZvdW5kLCBuYW1lKSwgbnVsbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNvbnRleHROYW1lID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiByZWxvYWRhYmxlID0gdHJ1ZTsKLQotICAgICAgICBjb250ZXh0TmFtZSA9IGNvbnRleHQuZ2V0UGF0aCgpOwotICAgICAgICByZWxvYWRhYmxlID0gQm9vbGVhbi52YWx1ZU9mKGNvbnRleHQuZ2V0UmVsb2FkYWJsZSgpKS5ib29sZWFuVmFsdWUoKTsKLQotICAgICAgICAvLyBub3cgc3RyaXAgaW5pdGlhbCAvCi0gICAgICAgIGlmIChjb250ZXh0TmFtZS5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIGNvbnRleHROYW1lID0gY29udGV4dE5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcm9vdCBjb250ZXh0IGlzIGRlcGxveWVkIHdpdGggdGhlICJST09UIiBuYW1lIGluIHRvbWNhdAotICAgICAgICBpZiAoIiIuZXF1YWxzKGNvbnRleHROYW1lKSkgewotICAgICAgICAgICAgY29udGV4dE5hbWUgPSAiUk9PVCI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgcHJvamVjdCBjb250ZXh0LnhtbAotICAgICAgICBDb250ZXh0IHByb2plY3RDb250ZXh0ID0gZ2V0UHJvamVjdENvbnRleHRYbWwoY29tcG9uZW50KTsKLQotICAgICAgICBpZiAocHJvamVjdENvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gY29weSBjb25maWd1cmF0aW9uIHRvIHNlcnZlciBjb250ZXh0Ci0gICAgICAgICAgICBwcm9qZWN0Q29udGV4dC5jb3B5Q2hpbGRyZW5Ubyhjb250ZXh0KTsKLQotICAgICAgICAgICAgTWFwIGF0dHJzID0gcHJvamVjdENvbnRleHQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGF0dHJzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJwYXRoIikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImRvY0Jhc2UiKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic291cmNlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgYXR0cnMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0dWFsVmFsdWUgPSBjb250ZXh0LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLmVxdWFscyhhY3R1YWxWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRlVmFsdWUobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIGNoYW5nZXMgaW4gZG9jQmFzZQotICAgICAgICBTdHJpbmcgZG9jQmFzZSA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpCi0gICAgICAgICAgICAgICAgLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotICAgICAgICBpZiAoIWRvY0Jhc2UuZXF1YWxzKGNvbnRleHQuZ2V0RG9jQmFzZSgpKSkgewotICAgICAgICAgICAgZGlydHkgPSB0cnVlOwotICAgICAgICAgICAgY29udGV4dC5zZXREb2NCYXNlKGRvY0Jhc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIGNoYW5nZXMgaW4gcmVsb2FkYWJsZSBmbGFnCi0gICAgICAgIGlmIChyZWxvYWRhYmxlICE9IChCb29sZWFuLnZhbHVlT2YoKGNvbnRleHQuZ2V0UmVsb2FkYWJsZSgpKSkKLSAgICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCkpKSB7Ci0gICAgICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFJlbG9hZGFibGUoQm9vbGVhbi50b1N0cmluZyhyZWxvYWRhYmxlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcGF0aCA9IChjb250ZXh0TmFtZS5lcXVhbHMoIlJPT1QiKSA/ICIiIDogIi8iICsgY29udGV4dE5hbWUpOwotICAgICAgICAvLyBoYW5kbGUgY2hhbmdlcyBpbiB0aGUgcGF0aAotICAgICAgICAvLyBQQVRIIGlzIHJlcXVpcmVkIGZvciB0b21jYXQgNS4wLCBidXQgaWdub3JlZCBpbiB0b21jYXQgNS41Ci0gICAgICAgIGlmICghcGF0aC5lcXVhbHMoY29udGV4dC5nZXRQYXRoKCkpKSB7Ci0gICAgICAgICAgICBkaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFBhdGgocGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLnNldENsYXNzTmFtZSgKLSAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQubG9hZGVyLld0cERpckNvbnRleHQiKTsKLQotICAgICAgICBMb2FkZXIgbG9hZGVyID0gY29udGV4dC5nZXRMb2FkZXIoKTsKLQotICAgICAgICBsb2FkZXIuc2V0Q2xhc3NOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5sb2FkZXIuV3RwV2ViYXBwTG9hZGVyIik7Ci0KLSAgICAgICAgLy8gcmVxdWlyZWQgZm9yIHRvbWNhdCA1LjUuMjAgZHVlIHRvIHRoZSBjaGFuZ2UgaW4KLSAgICAgICAgLy8gaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zOTcwNAotICAgICAgICBsb2FkZXIuc2V0VXNlU3lzdGVtQ2xhc3NMb2FkZXJBc1BhcmVudChCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIHdyaXRlIGRvd24gdGhlIHZpcnR1YWwgY2xhc3NQYXRoCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB2aXJ0dWFsQ2xhc3NDbGFzc3BhdGhFbGVtZW50cy5pdGVyYXRvcigpOwotICAgICAgICAJCWl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDAgJiYgdmlydHVhbEphckNsYXNzcGF0aEVsZW1lbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgCWJ1ZmZlci5hcHBlbmQoIjsiKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdmlydHVhbEphckNsYXNzcGF0aEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgIAkJaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAJYnVmZmVyLmFwcGVuZChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICAJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAJCWJ1ZmZlci5hcHBlbmQoIjsiKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsQ2xhc3NDbGFzc3BhdGhFbGVtZW50cy5jbGVhcigpOwotICAgICAgICB2aXJ0dWFsSmFyQ2xhc3NwYXRoRWxlbWVudHMuY2xlYXIoKTsKLQotICAgICAgICBTdHJpbmcgdmNwID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgU3RyaW5nIG9sZFZjcCA9IGxvYWRlci5nZXRWaXJ0dWFsQ2xhc3NwYXRoKCk7Ci0KLSAgICAgICAgaWYgKCF2Y3AuZXF1YWxzKG9sZFZjcCkpIHsKLSAgICAgICAgICAgIC8vIHNhdmUgb25seSBpZiBuZWVkZWQKLSAgICAgICAgICAgIGRpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGxvYWRlci5zZXRWaXJ0dWFsQ2xhc3NwYXRoKHZjcCk7Ci0gICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLnNldFZpcnR1YWxDbGFzc3BhdGgodmNwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkaXJ0eSkgewotICAgICAgICAJLy9UT0RPIElmIHdyaXRpbmcgdG8gc2VwYXJhdGUgY29udGV4dCBYTUwgZmlsZXMsIHNhdmUgImRpcnR5IiBzdGF0dXMgZm9yIGxhdGVyIHVzZQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFZpcnR1YWxDbGFzc1Jlc291cmNlKElQYXRoIHJ1bnRpbWVQYXRoLCBJUGF0aCB3b3Jrc3BhY2VQYXRoKSB7Ci0gICAgICAgIHZpcnR1YWxDbGFzc0NsYXNzcGF0aEVsZW1lbnRzLmFkZCh3b3Jrc3BhY2VQYXRoLnRvT1NTdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFZpcnR1YWxKYXJSZXNvdXJjZShJUGF0aCBydW50aW1lUGF0aCwgSVBhdGggd29ya3NwYWNlUGF0aCkgewotICAgICAgICB2aXJ0dWFsSmFyQ2xhc3NwYXRoRWxlbWVudHMuYWRkKHdvcmtzcGFjZVBhdGgudG9PU1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTG9hZCBhIE1FVEEtSU5GL2NvbnRleHQueG1sIGZpbGUgZnJvbSBwcm9qZWN0LCBpZiBhdmFpbGFibGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IHdlYiBjb21wb25lbnQgY29udGFpbmluZyB0aGUgY29udGV4dC54bWwKLSAgICAgKiBAcmV0dXJuIGNvbnRleHQgZWxlbWVudCBjb250YWluaW5nIHRoZSBjb250ZXh0LnhtbAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250ZXh0IGdldFByb2plY3RDb250ZXh0WG1sKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBsb2FkIG9yIGNyZWF0ZSBtb2R1bGUncyBjb250ZXh0LnhtbCBkb2N1bWVudAotICAgICAgICBJVmlydHVhbEZpbGUgY29udGV4dEZpbGUgPSAoSVZpcnR1YWxGaWxlKSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpCi0gICAgICAgICAgICAgICAgLmZpbmRNZW1iZXIoIk1FVEEtSU5GL2NvbnRleHQueG1sIik7Ci0KLSAgICAgICAgQ29udGV4dCBjb250ZXh0RWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGNvbnRleHRGaWxlICE9IG51bGwgJiYgY29udGV4dEZpbGUuZXhpc3RzKCkpIHsKLQotICAgICAgICAgICAgRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLSAgICAgICAgICAgIGZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpcyA9IGNvbnRleHRGaWxlLmdldFVuZGVybHlpbmdGaWxlKCkuZ2V0Q29udGVudHMoKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0RWxlbWVudCA9IChDb250ZXh0KSBmYWN0b3J5LmxvYWREb2N1bWVudChmaXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFeGNlcHRpb24gcmVhZGluZyAiICsgY29udGV4dEZpbGUsIGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGV4dEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gbW9kdWxlIGZyb20gdGhlIGNvbmZpZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kdWxlIGEgd2ViIG1vZHVsZQotICAgICAqIEByZXR1cm4gYSB3ZWIgbW9kdWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnRleHQgZmluZENvbnRleHQoSU1vZHVsZSBtb2R1bGUpIHsKLSAgICAgICAgaWYgKG1vZHVsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzb3VyY2UgPSBtb2R1bGUuZ2V0SWQoKTsKLSAgICAgICAgCi0gICAgICAgIENvbnRleHQgW10gY29udGV4dHMgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIAlpZiAoc291cmNlLmVxdWFscyhjb250ZXh0c1tpXS5nZXRTb3VyY2UoKSkpCi0gICAgICAgIAkJcmV0dXJuIGNvbnRleHRzW2ldOwotCQl9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMGM3YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0cmVhbXNQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0UnVudGltZSBleHRlbmRzIFJ1bnRpbWVEZWxlZ2F0ZSBpbXBsZW1lbnRzIElUb21jYXRSdW50aW1lLCBJVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCA9ICJ2bS1pbnN0YWxsLXR5cGUtaWQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVk1fSU5TVEFMTF9JRCA9ICJ2bS1pbnN0YWxsLWlkIjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBzZGtNYXAgPSBuZXcgSGFzaE1hcCgyKTsKLQotCXB1YmxpYyBUb21jYXRSdW50aW1lKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIElUb21jYXRWZXJzaW9uSGFuZGxlciBnZXRWZXJzaW9uSGFuZGxlcigpIHsKLQkJSVJ1bnRpbWVUeXBlIHR5cGUgPSBnZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKTsKLQkJcmV0dXJuIFRvbWNhdFBsdWdpbi5nZXRUb21jYXRWZXJzaW9uSGFuZGxlcih0eXBlLmdldElkKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9UWVBFX0lELCAoU3RyaW5nKW51bGwpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Vk1JbnN0YWxsSWQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKW51bGwpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1VzaW5nRGVmYXVsdEpSRSgpIHsKLQkJcmV0dXJuIGdldFZNSW5zdGFsbFR5cGVJZCgpID09IG51bGw7Ci0JfQotCi0JcHVibGljIElWTUluc3RhbGwgZ2V0Vk1JbnN0YWxsKCkgewotCQlpZiAoZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgPT0gbnVsbCkKLQkJCXJldHVybiBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0JCXRyeSB7Ci0JCQlJVk1JbnN0YWxsVHlwZSB2bUluc3RhbGxUeXBlID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZShnZXRWTUluc3RhbGxUeXBlSWQoKSk7Ci0JCQlJVk1JbnN0YWxsW10gdm1JbnN0YWxscyA9IHZtSW5zdGFsbFR5cGUuZ2V0Vk1JbnN0YWxscygpOwotCQkJaW50IHNpemUgPSB2bUluc3RhbGxzLmxlbmd0aDsKLQkJCVN0cmluZyBpZCA9IGdldFZNSW5zdGFsbElkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChpZC5lcXVhbHModm1JbnN0YWxsc1tpXS5nZXRJZCgpKSkKLQkJCQkJcmV0dXJuIHZtSW5zdGFsbHNbaV07Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRSdW50aW1lQ2xhc3NwYXRoKCkgewotCQlJUGF0aCBpbnN0YWxsUGF0aCA9IGdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpOwotCQkvLyBJZiBpbnN0YWxsUGF0aCBpcyByZWxhdGl2ZSwgY29udmVydCB0byBjYW5vbmljYWwgcGF0aCBhbmQgaG9wZSBmb3IgdGhlIGJlc3QKLQkJaWYgKCFpbnN0YWxsUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGluc3RhbGxMb2MgPSAobmV3IEZpbGUoaW5zdGFsbFBhdGgudG9PU1N0cmluZygpKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJCWluc3RhbGxQYXRoID0gbmV3IFBhdGgoaW5zdGFsbExvYyk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlIGlmIHRoZXJlIGlzIGEgcHJvYmxlbQotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRWZXJzaW9uSGFuZGxlcigpLmdldFJ1bnRpbWVDbGFzc3BhdGgoaW5zdGFsbFBhdGgpOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoZSBUb21jYXQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gSWYgaXQgaXMKLQkgKiBjb3JyZWN0LCB0cnVlIGlzIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSB1c2VyIGlzIG5vdGlmaWVkCi0JICogYW5kIGZhbHNlIGlzIHJldHVybmVkLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZlcmlmeUxvY2F0aW9uKCkgewotCQlyZXR1cm4gZ2V0VmVyc2lvbkhhbmRsZXIoKS52ZXJpZnlJbnN0YWxsUGF0aChnZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKSk7Ci0JfQotCQotCS8qCi0JICogVmFsaWRhdGUgdGhlIHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZSgpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzOwotCQotCQlzdGF0dXMgPSB2ZXJpZnlMb2NhdGlvbigpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzOwotLy8JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckluc3RhbGxEaXIsIG51bGwpOwotCQkvLyBkb24ndCBhY2NlcHQgdHJhaWxpbmcgc3BhY2Ugc2luY2UgdGhhdCBjYW4gY2F1c2Ugc3RhcnR1cCBwcm9ibGVtcwotCQlpZiAoZ2V0UnVudGltZSgpLmdldExvY2F0aW9uKCkuaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9ySW5zdGFsbERpclRyYWlsaW5nU2xhc2gsIG51bGwpOwotCQlpZiAoZ2V0Vk1JbnN0YWxsKCkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9ySlJFLCBudWxsKTsKLQotCQkvLyBjaGVjayBmb3IgdG9vbHMuamFyIChjb250YWlucyB0aGUgamF2YWMgY29tcGlsZXIgb24gV2luZG93cyAmIExpbnV4KSB0byBzZWUgd2hldGhlcgotCQkvLyBUb21jYXQgd2lsbCBiZSBhYmxlIHRvIGNvbXBpbGUgSlNQcy4KLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlGaWxlIGZpbGUgPSBnZXRWTUluc3RhbGwoKS5nZXRJbnN0YWxsTG9jYXRpb24oKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJRmlsZSB0b29sc0phciA9IG5ldyBGaWxlKGZpbGUsICJsaWIiICsgRmlsZS5zZXBhcmF0b3IgKyAidG9vbHMuamFyIik7Ci0JCQlpZiAodG9vbHNKYXIuZXhpc3RzKCkpCi0JCQkJZm91bmQgPSB0cnVlOwotCQl9Ci0JCQotCQkvLyBvbiBUb21jYXQgNS41IGFuZCA2LjAsIHRoZSBFY2xpcHNlIEpEVCBjb21waWxlciBpcyB1c2VkIGZvciBKU1AncwotCQlTdHJpbmcgaWQgPSBnZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotCQlpZiAoIWZvdW5kKSB7Ci0JCQlpZiAoaWQgIT0gbnVsbCAmJiAoaWQuaW5kZXhPZigiNTUiKSA+IDAgfHwgaWQuaW5kZXhPZigiNjAiKSA+IDApKQotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJfQotCQkKLQkJLy8gb24gTWFjLCB0b29scy5qYXIgaXMgbWVyZ2VkIGludG8gY2xhc3Nlcy56aXAuIGlmIHRvb2xzLmphciB3YXNuJ3QgZm91bmQsCi0JCS8vIHRyeSBsb2FkaW5nIHRoZSBqYXZhYyBjbGFzcyBieSBydW5uaW5nIGEgY2hlY2sgaW5zaWRlIHRoZSBWTQotCQlpZiAoIWZvdW5kKSB7Ci0JCQlTdHJpbmcgb3MgPSBQbGF0Zm9ybS5nZXRPUygpOwotCQkJaWYgKG9zICE9IG51bGwgJiYgb3MudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJtYWMiKSA+PSAwKQotCQkJCWZvdW5kID0gY2hlY2tGb3JDb21waWxlcigpOwotCQl9Ci0JCQotCQlpZiAoIWZvdW5kKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy53YXJuaW5nSlJFLCBudWxsKTsKLQkJCi0JCUZpbGUgZiA9IGdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpLmFwcGVuZCgiY29uZiIpLnRvRmlsZSgpOwotCQlGaWxlW10gY29uZiA9IGYubGlzdEZpbGVzKCk7Ci0JCWlmIChjb25mICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY29uZi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmICghZi5jYW5SZWFkKCkpCi0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMud2FybmluZ0NhbnRSZWFkQ29uZmlnLCBudWxsKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gRm9yIFRvbWNhdCA2LjAsIGVuc3VyZSB3ZSBoYXZlIEoyU0UgNS4wCi0JCWlmIChpZCAhPSBudWxsICYmIGlkLmluZGV4T2YoIjYwIikgPiAwKSB7Ci0JCQlJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IGdldFZNSW5zdGFsbCgpOwotCQkJaWYgKHZtSW5zdGFsbCBpbnN0YW5jZW9mIElWTUluc3RhbGwyKSB7Ci0JCQkJU3RyaW5nIGphdmFWZXJzaW9uID0gKChJVk1JbnN0YWxsMil2bUluc3RhbGwpLmdldEphdmFWZXJzaW9uKCk7Ci0JCQkJaWYgKGphdmFWZXJzaW9uICE9IG51bGwgJiYgamF2YVZlcnNpb24uY29tcGFyZVRvKCIxLjUiKSA8IDApIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JKUkVUb21jYXQ2MCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJ1bnRpbWVEZWxlZ2F0ZSNzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUnVudGltZVR5cGUgdHlwZSA9IGdldFJ1bnRpbWVXb3JraW5nQ29weSgpLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCWdldFJ1bnRpbWVXb3JraW5nQ29weSgpLnNldExvY2F0aW9uKG5ldyBQYXRoKFRvbWNhdFBsdWdpbi5nZXRQcmVmZXJlbmNlKCJsb2NhdGlvbiIgKyB0eXBlLmdldElkKCkpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Vk1JbnN0YWxsKElWTUluc3RhbGwgdm1JbnN0YWxsKSB7Ci0JCWlmICh2bUluc3RhbGwgPT0gbnVsbCkgewotCQkJc2V0Vk1JbnN0YWxsKG51bGwsIG51bGwpOwotCQl9IGVsc2UKLQkJCXNldFZNSW5zdGFsbCh2bUluc3RhbGwuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCksIHZtSW5zdGFsbC5nZXRJZCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Vk1JbnN0YWxsKFN0cmluZyB0eXBlSWQsIFN0cmluZyBpZCkgewotCQlpZiAodHlwZUlkID09IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCWVsc2UKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgdHlwZUlkKTsKLQkJCi0JCWlmIChpZCA9PSBudWxsKQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgKFN0cmluZyludWxsKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgaWQpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIEphdmEgY29tcGlsZXIgaW4gdGhlIGdpdmVuIGphdmEKLQkgKiBleGVjdXRhYmxlLiBBIG1haW4gcHJvZ3JhbSBpcyBydW4gKDxjb2RlPm9yZy5lY2xpcHNlLmpzdC50b21jYXQuY29yZS4KLQkgKiBpbnRlcm5hbC5DbGFzc0RldGVjdG9yPC9jb2RlPiksIHRoYXQgZHVtcHMgYSB0cnVlIG9yIGZhbHNlIHZhbHVlCi0JICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvbXBpbGVyIGlzIGZvdW5kLiBUaGlzIG91dHB1dCBpcyB0aGVuCi0JICogcGFyc2VkIGFuZCBjYWNoZWQgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21waWxlciB3YXMgZm91bmQKLQkgKi8JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tGb3JDb21waWxlcigpIHsKLQkJLy8gZmlyc3QgdHJ5IHRoZSBjYWNoZQotCQlGaWxlIGphdmFIb21lID0gZ2V0Vk1JbnN0YWxsKCkuZ2V0SW5zdGFsbExvY2F0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgc2RrTWFwLmdldChqYXZhSG9tZSk7Ci0JCQlyZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0KLQkJLy8gbG9jYXRlIHRvbWNhdGNvcmUuamFyIC0gaXQgY29udGFpbnMgdGhlIGNsYXNzIGRldGVjdG9yIG1haW4gcHJvZ3JhbQotCQlGaWxlIGZpbGUgPSBUb21jYXRQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJSVZNUnVubmVyIHZtUnVubmVyID0gZ2V0Vk1JbnN0YWxsKCkuZ2V0Vk1SdW5uZXIoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotCQkJVk1SdW5uZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBWTVJ1bm5lckNvbmZpZ3VyYXRpb24oIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuQ2xhc3NEZXRlY3RvciIsIG5ldyBTdHJpbmdbXSB7IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgfSk7Ci0JCQljb25maWcuc2V0UHJvZ3JhbUFyZ3VtZW50cyhuZXcgU3RyaW5nW10geyAiY29tLnN1bi50b29scy5qYXZhYy5NYWluIiB9KTsKLQkJCUlMYXVuY2ggbGF1bmNoID0gbmV3IExhdW5jaChudWxsLCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgbnVsbCk7Ci0JCQl0cnkgewotCQkJCXZtUnVubmVyLnJ1bihjb25maWcsIGxhdW5jaCwgbnVsbCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA2MDA7IGkrKykgewotCQkJCQkvLyB3YWl0IG5vIG1vcmUgdGhhbiAzMCBzZWNvbmRzICg2MDAgKiA1MCBtaWxzKQotCQkJCQlpZiAobGF1bmNoLmlzVGVybWluYXRlZCgpKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKDUwKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQkJSVN0cmVhbXNQcm94eSBzdHJlYW1zUHJveHkgPSBsYXVuY2guZ2V0UHJvY2Vzc2VzKClbMF0uZ2V0U3RyZWFtc1Byb3h5KCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkJCWlmIChzdHJlYW1zUHJveHkgIT0gbnVsbCkgewotCQkJCQl0ZXh0ID0gc3RyZWFtc1Byb3h5LmdldE91dHB1dFN0cmVhbU1vbml0b3IoKS5nZXRDb250ZW50cygpOwotCQkJCQotCQkJCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQlpZiAoInRydWUiLmVxdWFscyh0ZXh0KSkKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkKLQkJCQkJCXNka01hcC5wdXQoamF2YUhvbWUsIG5ldyBCb29sZWFuKGZvdW5kKSk7Ci0JCQkJCQlyZXR1cm4gZm91bmQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNoZWNraW5nIGZvciBKREsiLCBlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKCFsYXVuY2guaXNUZXJtaW5hdGVkKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxhdW5jaC50ZXJtaW5hdGUoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gbG9nIGVycm9yIHRoYXQgd2Ugd2VyZSB1bmFibGUgdG8gY2hlY2sgZm9yIHRoZSBjb21waWxlcgotCQlUb21jYXRQbHVnaW4ubG9nKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJGYWlsZWQgY29tcGlsZXIgY2hlY2sgZm9yIHswfSIsIG5ldyBTdHJpbmdbXSB7IGphdmFIb21lLmdldEFic29sdXRlUGF0aCgpIH0pKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTY2NDlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLS8qKgotICogQ2xhc3NwYXRoIHByb3ZpZGVyIGZvciB0aGUgVG9tY2F0IHJ1bnRpbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIgZXh0ZW5kcyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSB7Ci0JLyoqCi0JICogQHNlZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSNyZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElQcm9qZWN0LCBJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lKSB7Ci0JCUlQYXRoIGluc3RhbGxQYXRoID0gcnVudGltZS5nZXRMb2NhdGlvbigpOwotCQkKLQkJaWYgKGluc3RhbGxQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLQkJCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nIHJ1bnRpbWVJZCA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotCQlpZiAocnVudGltZUlkLmluZGV4T2YoIjMyIikgPiAwKSB7Ci0JCQlJUGF0aCBwYXRoID0gaW5zdGFsbFBhdGguYXBwZW5kKCJsaWIiKTsKLQkJCWFkZExpYnJhcnlFbnRyaWVzKGxpc3QsIHBhdGgudG9GaWxlKCksIHRydWUpOwotCQl9IGVsc2UgaWYgKHJ1bnRpbWVJZC5pbmRleE9mKCI2MCIpID4gMCkgewotCQkJLy8gVE9ETyBNYXkgbmVlZCBzb21lIGZsZXhpYmlsaXR5IGluIGNhc2UgdGhlIGluc3RhbGxhdGlvbiBoYXMgYmVlbiBjb25maWd1cmVkIGRpZmZlcmVudGx5Ci0JCQkvLyBUaGlzIGxpYiAic2ltcGxpZmljYXRpb24iIG1heSBjYXVzZSBpc3N1ZXMgZm9yIHNvbWUuCi0JCQkvLyBOb3Qga25vd24geWV0IHdoZXRoZXIgcGFja2FnZWQgTGludXggaW5zdGFsbHMgd2lsbCBnbyBhbG9uZy4KLQkJCUlQYXRoIHBhdGggPSBpbnN0YWxsUGF0aC5hcHBlbmQoImxpYiIpOwotCQkJYWRkTGlicmFyeUVudHJpZXMobGlzdCwgcGF0aC50b0ZpbGUoKSwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlJUGF0aCBwYXRoID0gaW5zdGFsbFBhdGguYXBwZW5kKCJjb21tb24iKTsKLQkJCWFkZExpYnJhcnlFbnRyaWVzKGxpc3QsIHBhdGguYXBwZW5kKCJsaWIiKS50b0ZpbGUoKSwgdHJ1ZSk7Ci0JCQlhZGRMaWJyYXJ5RW50cmllcyhsaXN0LCBwYXRoLmFwcGVuZCgiZW5kb3JzZWQiKS50b0ZpbGUoKSwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIChJQ2xhc3NwYXRoRW50cnlbXSlsaXN0LnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtsaXN0LnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UnVudGltZUxvY2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UnVudGltZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQxNGE2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFJ1bnRpbWVMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVMb2NhdG9yRGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0UnVudGltZUxvY2F0b3IgZXh0ZW5kcyBSdW50aW1lTG9jYXRvckRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHJ1bnRpbWVUeXBlcyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjMyIiwKLQkJIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDAiLAotCQkib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MSIsCi0JCSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwIiwKLQkJIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTUiLAotCQkib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS42MCJ9OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklSdW50aW1lRmFjdG9yeURlbGVnYXRlI2dldEtub3duUnVudGltZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaEZvclJ1bnRpbWVzKElQYXRoIHBhdGgsIElSdW50aW1lU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzZWFyY2hGb3JSdW50aW1lczIocGF0aCwgbGlzdGVuZXIsIG1vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZWFyY2hGb3JSdW50aW1lczIoSVBhdGggcGF0aCwgSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUZpbGVbXSBmaWxlcyA9IG51bGw7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCUZpbGUgZiA9IHBhdGgudG9GaWxlKCk7Ci0JCQlpZiAoZi5leGlzdHMoKSkKLQkJCQlmaWxlcyA9IGYubGlzdEZpbGVzKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuOwotCQl9IGVsc2UKLQkJCWZpbGVzID0gRmlsZS5saXN0Um9vdHMoKTsKLQotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmaWxlcy5sZW5ndGg7Ci0JCQlpbnQgd29yayA9IDEwMCAvIHNpemU7Ci0JCQlpbnQgd29ya0xlZnQgPSAxMDAgLSAod29yayAqIHNpemUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoZmlsZXNbaV0gIT0gbnVsbCAmJiBmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKQotCQkJCQlzZWFyY2hEaXIobGlzdGVuZXIsIGZpbGVzW2ldLCA0LCBtb25pdG9yKTsKLQkJCQltb25pdG9yLndvcmtlZCh3b3JrKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKHdvcmtMZWZ0KTsKLQkJfSBlbHNlCi0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZWFyY2hEaXIoSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lciwgRmlsZSBkaXIsIGludCBkZXB0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICgiY29uZiIuZXF1YWxzKGRpci5nZXROYW1lKCkpKSB7Ci0JCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSBnZXRSdW50aW1lRnJvbURpcihkaXIuZ2V0UGFyZW50RmlsZSgpLCBtb25pdG9yKTsKLQkJCWlmIChydW50aW1lICE9IG51bGwpIHsKLQkJCQlsaXN0ZW5lci5ydW50aW1lRm91bmQocnVudGltZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoZGVwdGggPT0gMCkKLQkJCXJldHVybjsKLQkJCi0JCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7Ci0JCQkJcmV0dXJuIGZpbGUuaXNEaXJlY3RvcnkoKTsKLQkJCX0KLQkJfSk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGZpbGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQkJc2VhcmNoRGlyKGxpc3RlbmVyLCBmaWxlc1tpXSwgZGVwdGggLSAxLCBtb25pdG9yKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSVJ1bnRpbWVXb3JraW5nQ29weSBnZXRSdW50aW1lRnJvbURpcihGaWxlIGRpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcnVudGltZVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKHJ1bnRpbWVUeXBlc1tpXSk7Ci0JCQkJU3RyaW5nIGFic29sdXRlUGF0aCA9IGRpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQlTdHJpbmcgaWQgPSBhYnNvbHV0ZVBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsJ18nKS5yZXBsYWNlKCc6JywnLScpOwotCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUoaWQsIG1vbml0b3IpOwotCQkJCXJ1bnRpbWUuc2V0TmFtZShkaXIuZ2V0TmFtZSgpKTsKLQkJCQlydW50aW1lLnNldExvY2F0aW9uKG5ldyBQYXRoKGFic29sdXRlUGF0aCkpOwotCQkJCUlUb21jYXRSdW50aW1lV29ya2luZ0NvcHkgd2MgPSAoSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weSkgcnVudGltZS5sb2FkQWRhcHRlcihJVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5LmNsYXNzLCBudWxsKTsKLQkJCQl3Yy5zZXRWTUluc3RhbGwoSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHJ1bnRpbWUudmFsaWRhdGUobW9uaXRvcik7Ci0JCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpCi0JCQkJCXJldHVybiBydW50aW1lOwotCQkJCQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiRmFsc2UgcnVudGltZSBmb3VuZCBhdCAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpICsgIjogIiArIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZmluZCBydW50aW1lIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTZlMzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuRmFjZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KMkVFVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLio7Ci0vKioKLSAqIEdlbmVyaWMgVG9tY2F0IHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdFNlcnZlciBleHRlbmRzIFNlcnZlckRlbGVnYXRlIGltcGxlbWVudHMgSVRvbWNhdFNlcnZlciwgSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TRUNVUkUgPSAic2VjdXJlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERUJVRyA9ICJkZWJ1ZyI7Ci0KLQotCXByb3RlY3RlZCB0cmFuc2llbnQgVG9tY2F0Q29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOwotCXByb3RlY3RlZCB0cmFuc2llbnQgSVRvbWNhdFZlcnNpb25IYW5kbGVyIHZlcnNpb25IYW5kbGVyOwotCi0JLyoqCi0JICogVG9tY2F0U2VydmVyLgotCSAqLwotCXB1YmxpYyBUb21jYXRTZXJ2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBUb21jYXQgcnVudGltZSBmb3IgdGhpcyBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiBUb21jYXQgcnVudGltZSBmb3IgdGhpcyBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgVG9tY2F0UnVudGltZSBnZXRUb21jYXRSdW50aW1lKCkgewotCQlpZiAoZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiAoVG9tY2F0UnVudGltZSkgZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmxvYWRBZGFwdGVyKFRvbWNhdFJ1bnRpbWUuY2xhc3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFRvbWNhdCB2ZXJzaW9uIGhhbmRsZXIgZm9yIHRoaXMgc2VydmVyLgotCSAqIAotCSAqIEByZXR1cm4gdmVyc2lvbiBoYW5kbGVyIGZvciB0aGlzIHNlcnZlcgotCSAqLwotCXB1YmxpYyBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoKSB7Ci0JCWlmICh2ZXJzaW9uSGFuZGxlciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwgfHwgZ2V0VG9tY2F0UnVudGltZSgpID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCXZlcnNpb25IYW5kbGVyID0gZ2V0VG9tY2F0UnVudGltZSgpLmdldFZlcnNpb25IYW5kbGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb25IYW5kbGVyOwotCX0KLQotCXB1YmxpYyBJVG9tY2F0Q29uZmlndXJhdGlvbiBnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBUb21jYXRDb25maWd1cmF0aW9uIGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCUlGb2xkZXIgZm9sZGVyID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGZvbGRlciA9PSBudWxsIHx8ICFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCQkJaWYgKGZvbGRlciAhPSBudWxsKQotCQkJCQlwYXRoID0gZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpOwotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JOb0NvbmZpZ3VyYXRpb24sIHBhdGgpLCBudWxsKSk7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBpZCA9IGdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCQkJaWYgKGlkLmluZGV4T2YoIjMyIikgPiAwKQotCQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgVG9tY2F0MzJDb25maWd1cmF0aW9uKGZvbGRlcik7Ci0JCQllbHNlIGlmIChpZC5pbmRleE9mKCI0MCIpID4gMCkKLQkJCQljb25maWd1cmF0aW9uID0gbmV3IFRvbWNhdDQwQ29uZmlndXJhdGlvbihmb2xkZXIpOwotCQkJZWxzZSBpZiAoaWQuaW5kZXhPZigiNDEiKSA+IDApCi0JCQkJY29uZmlndXJhdGlvbiA9IG5ldyBUb21jYXQ0MUNvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJCWVsc2UgaWYgKGlkLmluZGV4T2YoIjUwIikgPiAwKQotCQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgVG9tY2F0NTBDb25maWd1cmF0aW9uKGZvbGRlcik7Ci0JCQllbHNlIGlmIChpZC5pbmRleE9mKCI1NSIpID4gMCkKLQkJCQljb25maWd1cmF0aW9uID0gbmV3IFRvbWNhdDU1Q29uZmlndXJhdGlvbihmb2xkZXIpOwotCQkJZWxzZSBpZiAoaWQuaW5kZXhPZigiNjAiKSA+IDApCi0JCQkJY29uZmlndXJhdGlvbiA9IG5ldyBUb21jYXQ2MENvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJCXRyeSB7Ci0JCQkJY29uZmlndXJhdGlvbi5sb2FkKGZvbGRlciwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQkJY29uZmlndXJhdGlvbiA9IG51bGw7Ci0JCQkJdGhyb3cgY2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgaW1wb3J0UnVudGltZUNvbmZpZ3VyYXRpb24oSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChydW50aW1lID09IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb24gPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlQYXRoIHBhdGggPSBydW50aW1lLmdldExvY2F0aW9uKCkuYXBwZW5kKCJjb25mIik7Ci0JCQotCQlTdHJpbmcgaWQgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLQkJSUZvbGRlciBmb2xkZXIgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChpZC5pbmRleE9mKCIzMiIpID4gMCkKLQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgVG9tY2F0MzJDb25maWd1cmF0aW9uKGZvbGRlcik7Ci0JCWVsc2UgaWYgKGlkLmluZGV4T2YoIjQwIikgPiAwKQotCQkJY29uZmlndXJhdGlvbiA9IG5ldyBUb21jYXQ0MENvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJZWxzZSBpZiAoaWQuaW5kZXhPZigiNDEiKSA+IDApCi0JCQljb25maWd1cmF0aW9uID0gbmV3IFRvbWNhdDQxQ29uZmlndXJhdGlvbihmb2xkZXIpOwotCQllbHNlIGlmIChpZC5pbmRleE9mKCI1MCIpID4gMCkKLQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgVG9tY2F0NTBDb25maWd1cmF0aW9uKGZvbGRlcik7Ci0JCWVsc2UgaWYgKGlkLmluZGV4T2YoIjU1IikgPiAwKQotCQkJY29uZmlndXJhdGlvbiA9IG5ldyBUb21jYXQ1NUNvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJZWxzZSBpZiAoaWQuaW5kZXhPZigiNjAiKSA+IDApCi0JCQljb25maWd1cmF0aW9uID0gbmV3IFRvbWNhdDYwQ29uZmlndXJhdGlvbihmb2xkZXIpOwotCQl0cnkgewotCQkJY29uZmlndXJhdGlvbi5pbXBvcnRGcm9tUGF0aChwYXRoLCBpc1Rlc3RFbnZpcm9ubWVudCgpLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gaWdub3JlCi0JCQljb25maWd1cmF0aW9uID0gbnVsbDsKLQkJCXRocm93IGNlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZUNvbmZpZ3VyYXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb25maWd1cmF0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbmZpZ3VyYXRpb24uc2F2ZShnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCksIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkgewotCQljb25maWd1cmF0aW9uID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvb3QgVVJMIG9mIHRoaXMgbW9kdWxlLgotCSAqIEBwYXJhbSBtb2R1bGUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGUKLQkgKiBAcmV0dXJuIGphdmEubmV0LlVSTAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TW9kdWxlUm9vdFVSTChJTW9kdWxlIG1vZHVsZSkgewotCQl0cnkgewotCQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlUb21jYXRDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJU3RyaW5nIHVybCA9ICJodHRwOi8vIiArIGdldFNlcnZlcigpLmdldEhvc3QoKTsKLQkJCWludCBwb3J0ID0gY29uZmlnLmdldE1haW5Qb3J0KCkuZ2V0UG9ydCgpOwotCQkJcG9ydCA9IFNlcnZlclV0aWwuZ2V0TW9uaXRvcmVkUG9ydChnZXRTZXJ2ZXIoKSwgcG9ydCwgIndlYiIpOwotCQkJaWYgKHBvcnQgIT0gODApCi0JCQkJdXJsICs9ICI6IiArIHBvcnQ7Ci0JCQkKLQkJCXVybCArPSBjb25maWcuZ2V0V2ViTW9kdWxlVVJMKG1vZHVsZSk7Ci0JCQkKLQkJCWlmICghdXJsLmVuZHNXaXRoKCIvIikpCi0JCQkJdXJsICs9ICIvIjsKLQkJCQotCQkJcmV0dXJuIG5ldyBVUkwodXJsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgcm9vdCBVUkwiLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9jZXNzIGlzIHNldCB0byBydW4gaW4gZGVidWcgbW9kZS4KLQkgKiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcyB3aXRoIFRvbWNhdCB2NC4wLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9ERUJVRywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgdGVzdCAocnVuIGNvZGUgb3V0IG9mIHRoZSB3b3JrYmVuY2gpIHNlcnZlci4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGVzdEVudmlyb25tZW50KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX1RFU1RfRU5WSVJPTk1FTlQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3MgaXMgc2V0IHRvIHJ1biBpbiBzZWN1cmUgbW9kZS4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX1NFQ1VSRSwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRTZXJ2ZXIjZ2V0SW5zdGFuY2VEaXJlY3RvcnkoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFuY2VEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfSU5TVEFOQ0VfRElSLCAoU3RyaW5nKW51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRTZXJ2ZXIjZ2V0RGVwbG95RGlyZWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlcGxveURpcmVjdG9yeSgpIHsKLQkJLy8gRGVmYXVsdCB0byB2YWx1ZSB1c2VkIGJ5IHByaW9yIFdUUCB2ZXJzaW9ucwotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX0RFUExPWV9ESVIsIExFR0FDWV9ERVBMT1lESVIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBtb2R1bGVzIHNob3VsZCBiZSBzZXJ2ZWQgd2l0aG91dCBwdWJsaXNoaW5nLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKSB7Ci0JCS8vIElmIGZlYXR1cmUgaXMgc3VwcG9ydGVkLCByZXR1cm4gY3VycmVudCBzZXR0aW5nCi0JCUlUb21jYXRWZXJzaW9uSGFuZGxlciB0dmggPSBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpOwotCQlpZiAodHZoICE9IG51bGwgJiYgdHZoLnN1cHBvcnRzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfU0VSVkVfTU9EVUxFU19XSVRIT1VUX1BVQkxJU0gsIGZhbHNlKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgY29udGV4dHMgc2hvdWxkIGJlIHNhdmVkIGluIHNlcGFyYXRlIGZpbGVzCi0JICogZHVyaW5nIHNlcnZlciBwdWJsaXNoLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZVNlcGFyYXRlQ29udGV4dEZpbGVzKCkgewotCQkvLyBJZiBmZWF0dXJlIGlzIHN1cHBvcnRlZCwgcmV0dXJuIGN1cnJlbnQgc2V0dGluZwotCQlJVG9tY2F0VmVyc2lvbkhhbmRsZXIgdHZoID0gZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoKTsKLQkJaWYgKHR2aCAhPSBudWxsICYmIHR2aC5zdXBwb3J0c1NlcGFyYXRlQ29udGV4dEZpbGVzKCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX1NBVkVfU0VQQVJBVEVfQ09OVEVYVF9GSUxFUywgZmFsc2UpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgYmFzZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHNlcnZlciBpbnN0YW5jZSBydW5zLiAgVGhpcwotCSAqIHBhdGggY2FuIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmF0aW9uLiBOdWxsIG1heSBiZSByZXR1cm5lZAotCSAqIGlmIGEgcnVudGltZSBoYXNuJ3QgYmVlbiBzcGVjaWZpZWQgZm9yIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiBwYXRoIHRvIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyIG9yIG51bGwgaWYKLQkgKiBydW50aW1lIGhhc24ndCBiZWVuIHNwZWNpZmllZC4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKSB7Ci0JCUlUb21jYXRWZXJzaW9uSGFuZGxlciB0dmggPSBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpOwotCQlpZiAodHZoICE9IG51bGwpCi0JCQlyZXR1cm4gdHZoLmdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KHRoaXMpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXJlY3RvcnkgdG8gd2hpY2ggbW9kdWxlcyBzaG91bGQgYmUgZGVwbG95ZWQgZm9yCi0JICogdGhpcyBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiBmdWxsIHBhdGggdG8gZGVwbG95bWVudCBkaXJlY3RvcnkgZm9yIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCkgewotCQlTdHJpbmcgZGVwbG95RGlyID0gZ2V0RGVwbG95RGlyZWN0b3J5KCk7Ci0JCUlQYXRoIGRlcGxveVBhdGggPSBuZXcgUGF0aChkZXBsb3lEaXIpOwotCQlpZiAoIWRlcGxveVBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlJUGF0aCBiYXNlID0gZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKLQkJCWRlcGxveVBhdGggPSBiYXNlLmFwcGVuZChkZXBsb3lQYXRoKTsKLQkJfQotCQlyZXR1cm4gZGVwbG95UGF0aDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcmVuZGVyQ29tbWFuZExpbmUoU3RyaW5nW10gY29tbWFuZExpbmUsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJaWYgKGNvbW1hbmRMaW5lID09IG51bGwgfHwgY29tbWFuZExpbmUubGVuZ3RoIDwgMSkKLQkJCXJldHVybiAiIjsKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcihjb21tYW5kTGluZVswXSk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgY29tbWFuZExpbmUubGVuZ3RoOyBpKyspIHsKLQkJCWJ1Zi5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJCWJ1Zi5hcHBlbmQoY29tbWFuZExpbmVbaV0pOwotCQl9CQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlKHMpIG9mIHRoaXMgbW9kdWxlLgotCSAqIEBwYXJhbSBtb2R1bGUgbW9kdWxlIGZyb20gd2hpY2ggdG8gZ2V0IGNoaWxkIG1vZHVsZShzKQotCSAqIEByZXR1cm4gYXJyYXkgb2YgY2hpbGQgbW9kdWxlKHMpCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlNb2R1bGVUeXBlIG1vZHVsZVR5cGUgPSBtb2R1bGVbMF0uZ2V0TW9kdWxlVHlwZSgpOwotCQkKLQkJaWYgKG1vZHVsZS5sZW5ndGggPT0gMSAmJiBtb2R1bGVUeXBlICE9IG51bGwgJiYgImpzdC53ZWIiLmVxdWFscyhtb2R1bGVUeXBlLmdldElkKCkpKSB7Ci0JCQlJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChJV2ViTW9kdWxlKSBtb2R1bGVbMF0ubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQlpZiAod2ViTW9kdWxlICE9IG51bGwpIHsKLQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IHdlYk1vZHVsZS5nZXRNb2R1bGVzKCk7Ci0JCQkJLy9pZiAobW9kdWxlcyAhPSBudWxsKQotCQkJCS8vCVN5c3RlbS5vdXQucHJpbnRsbihtb2R1bGVzLmxlbmd0aCk7Ci0JCQkJcmV0dXJuIG1vZHVsZXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgbW9kdWxlKHMpIG9mIHRoaXMgbW9kdWxlLgotCSAqIEBwYXJhbSBtb2R1bGUgbW9kdWxlIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSByb290IG1vZHVsZQotCSAqIEByZXR1cm4gcm9vdCBtb2R1bGUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRSb290TW9kdWxlcyhJTW9kdWxlIG1vZHVsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoImpzdC53ZWIiLmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsKTsKLQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCAhc3RhdHVzLmlzT0soKSkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkJcmV0dXJuIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfTsKLQkJfQotCQkKLQkJcmV0dXJuIEoyRUVVdGlsLmdldFdlYk1vZHVsZXMobW9kdWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHByb2plY3QgaXMgc3VwcG9ydGVkIGJ5IHRoaXMKLQkgKiBzZXJ2ZXIsIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0JICoKLQkgKiBAcGFyYW0gYWRkIG1vZHVsZXMKLQkgKiBAcGFyYW0gcmVtb3ZlIG1vZHVsZXMKLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5Nb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUpIHsKLQkJaWYgKGFkZCAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGFkZC5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGUgbW9kdWxlID0gYWRkW2ldOwotCQkJCWlmICghImpzdC53ZWIiLmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpKQotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvcldlYk1vZHVsZXNPbmx5LCBudWxsKTsKLQkJCQkKLQkJCQlpZiAoZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoKSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck5vUnVudGltZSwgbnVsbCk7Ci0JCQkJCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpLmNhbkFkZE1vZHVsZShtb2R1bGUpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQkKLQkJCQlpZiAobW9kdWxlLmdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQkJCXN0YXR1cyA9IEZhY2V0VXRpbC52ZXJpZnlGYWNldHMobW9kdWxlLmdldFByb2plY3QoKSwgZ2V0U2VydmVyKCkpOwotCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpCi0JCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIFNlcnZlclBvcnRbXSBnZXRTZXJ2ZXJQb3J0cygpIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTZXJ2ZXJQb3J0WzBdOwotCQkKLQkJdHJ5IHsKLQkJCUxpc3QgbGlzdCA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2ZXJQb3J0cygpOwotCQkJU2VydmVyUG9ydFtdIHNwID0gbmV3IFNlcnZlclBvcnRbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHNwKTsKLQkJCXJldHVybiBzcDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgU2VydmVyUG9ydFswXTsgCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc2V0VGVzdEVudmlyb25tZW50KHRydWUpOwotCQlzZXRBdHRyaWJ1dGUoImF1dG8tcHVibGlzaC1zZXR0aW5nIiwgMik7Ci0JCXNldEF0dHJpYnV0ZSgiYXV0by1wdWJsaXNoLXRpbWUiLCAxKTsKLQkJc2V0RGVwbG95RGlyZWN0b3J5KERFRkFVTFRfREVQTE9ZRElSKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoaXMgcHJvY2VzcyB0byBkZWJ1ZyBtb2RlLiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcwotCSAqIHdpdGggVG9tY2F0IHY0LjAuCi0JICoKLQkgKiBAcGFyYW0gYiBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBiKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9ERUJVRywgYik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGlzIHByb2Nlc3MgdG8gc2VjdXJlIG1vZGUuCi0JICogQHBhcmFtIGIgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3VyZShib29sZWFuIGIpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BFUlRZX1NFQ1VSRSwgYik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGlzIHNlcnZlciB0byB0ZXN0IGVudmlyb25tZW50IG1vZGUuCi0JICogCi0JICogQHBhcmFtIGIgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRlc3RFbnZpcm9ubWVudChib29sZWFuIGIpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BFUlRZX1RFU1RfRU5WSVJPTk1FTlQsIGIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSNzZXRJbnN0YW5jZURpcmVjdG9yeShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5zdGFuY2VEaXJlY3RvcnkoU3RyaW5nIGluc3RhbmNlRGlyKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9JTlNUQU5DRV9ESVIsIGluc3RhbmNlRGlyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkjc2V0RGVwbG95RGlyZWN0b3J5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBsb3lEaXJlY3RvcnkoU3RyaW5nIGRlcGxveURpcikgewotCQkvLyBSZW1vdmUgYXR0cmlidXRlIGlmIHNldHRpbmcgdG8gbGVnYWN5IHZhbHVlIGFzc3VtZWQgaW4gcHJpb3IgdmVyc2lvbnMgb2YgV1RQLgotCQkvLyBBbGxvd2luZyB2YWx1ZXMgdGhhdCBkaWZmZXIgb25seSBpbiBjYXNlIGlzIGFza2luZyBmb3IgbW9yZSB0cm91YmxlIHRoYXQgaXQgaXMgd29ydGguCi0JCWlmIChMRUdBQ1lfREVQTE9ZRElSLmVxdWFsc0lnbm9yZUNhc2UoZGVwbG95RGlyKSkKLQkJCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9ERVBMT1lfRElSLCAoU3RyaW5nKW51bGwpOwotCQllbHNlCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfREVQTE9ZX0RJUiwgZGVwbG95RGlyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkjc2V0U2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaChib29sZWFuIGIpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BFUlRZX1NFUlZFX01PRFVMRVNfV0lUSE9VVF9QVUJMSVNILCBiKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSNzZXRTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXMoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXMoYm9vbGVhbiBiKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9TQVZFX1NFUEFSQVRFX0NPTlRFWFRfRklMRVMsIGIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VydmVyRGVsZWdhdGUjbW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10sIElNb2R1bGVbXSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9IGNhbk1vZGlmeU1vZHVsZXMoYWRkLCByZW1vdmUpOwotCQlpZiAoc3RhdHVzID09IG51bGwgfHwgIXN0YXR1cy5pc09LKCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkKLQkJVG9tY2F0Q29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRUb21jYXRDb25maWd1cmF0aW9uKCk7Ci0JCQotCQlpZiAoYWRkICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gYWRkLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUzID0gYWRkW2ldOwotCQkJCUlXZWJNb2R1bGUgbW9kdWxlID0gKElXZWJNb2R1bGUpIG1vZHVsZTMubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbW9uaXRvcik7Ci0JCQkJU3RyaW5nIGNvbnRleHRSb290ID0gbW9kdWxlLmdldENvbnRleHRSb290KCk7Ci0JCQkJaWYgKGNvbnRleHRSb290ICE9IG51bGwgJiYgIWNvbnRleHRSb290LnN0YXJ0c1dpdGgoIi8iKSAmJiBjb250ZXh0Um9vdC5sZW5ndGgoKSA+IDApCi0JCQkJCWNvbnRleHRSb290ID0gIi8iICsgY29udGV4dFJvb3Q7Ci0JCQkJU3RyaW5nIGRvY0Jhc2UgPSBjb25maWcuZ2V0RG9jQmFzZVByZWZpeCgpICsgbW9kdWxlMy5nZXROYW1lKCk7Ci0JCQkJV2ViTW9kdWxlIG1vZHVsZTIgPSBuZXcgV2ViTW9kdWxlKGNvbnRleHRSb290LCBkb2NCYXNlLCBtb2R1bGUzLmdldElkKCksIHRydWUpOwotCQkJCWNvbmZpZy5hZGRXZWJNb2R1bGUoLTEsIG1vZHVsZTIpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocmVtb3ZlICE9IG51bGwpIHsKLQkJCWludCBzaXplMiA9IHJlbW92ZS5sZW5ndGg7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQlJTW9kdWxlIG1vZHVsZTMgPSByZW1vdmVbal07Ci0JCQkJU3RyaW5nIG1lbWVudG8gPSBtb2R1bGUzLmdldElkKCk7Ci0JCQkJTGlzdCBtb2R1bGVzID0gZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpLmdldFdlYk1vZHVsZXMoKTsKLQkJCQlpbnQgc2l6ZSA9IG1vZHVsZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCVdlYk1vZHVsZSBtb2R1bGUgPSAoV2ViTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCQkJaWYgKG1lbWVudG8uZXF1YWxzKG1vZHVsZS5nZXRNZW1lbnRvKCkpKQotCQkJCQkJY29uZmlnLnJlbW92ZVdlYk1vZHVsZShpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy9jb25maWcuc2F2ZShjb25maWcuZ2V0Rm9sZGVyKCksIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlRvbWNhdFNlcnZlciI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXJCZWhhdmlvdXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0U2VydmVyQmVoYXZpb3VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZDNjMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXJCZWhhdmlvdXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JTW9kdWxlUHVibGlzaEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLS8qKgotICogR2VuZXJpYyBUb21jYXQgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0U2VydmVyQmVoYXZpb3VyIGV4dGVuZHMgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUgaW1wbGVtZW50cyBJVG9tY2F0U2VydmVyQmVoYXZpb3VyLCBJTW9kdWxlUHVibGlzaEhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1RPUCA9ICJzdG9wLXNlcnZlciI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSk1YX0VYQ0xVREVfQVJHUyA9IG5ldyBTdHJpbmcgW10gewotCQkiLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlIiwKLQkJIi1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5wb3J0PSIsCi0JCSItRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsPSIsCi0JCSItRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuYXV0aGVudGljYXRlPSIKLQl9OwotCi0JLy8gdGhlIHRocmVhZCB1c2VkIHRvIHBpbmcgdGhlIHNlcnZlciB0byBjaGVjayBmb3Igc3RhcnR1cAotCXByb3RlY3RlZCB0cmFuc2llbnQgUGluZ1RocmVhZCBwaW5nID0gbnVsbDsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIgcHJvY2Vzc0xpc3RlbmVyOwotCi0JLyoqCi0JICogVG9tY2F0U2VydmVyQmVoYXZpb3VyLgotCSAqLwotCXB1YmxpYyBUb21jYXRTZXJ2ZXJCZWhhdmlvdXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBUb21jYXRSdW50aW1lIGdldFRvbWNhdFJ1bnRpbWUoKSB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIChUb21jYXRSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoVG9tY2F0UnVudGltZS5jbGFzcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUb21jYXRWZXJzaW9uSGFuZGxlciBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpIHsKLQkJcmV0dXJuIGdldFRvbWNhdFNlcnZlcigpLmdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCk7Ci0JfQotCi0JcHVibGljIFRvbWNhdENvbmZpZ3VyYXRpb24gZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRvbWNhdFNlcnZlcigpLmdldFRvbWNhdENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVG9tY2F0U2VydmVyIGdldFRvbWNhdFNlcnZlcigpIHsKLQkJcmV0dXJuIChUb21jYXRTZXJ2ZXIpIGdldFNlcnZlcigpLmxvYWRBZGFwdGVyKFRvbWNhdFNlcnZlci5jbGFzcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBydW50aW1lIGNsYXNzIG5hbWUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ2xhc3MoKSB7Ci0JCXJldHVybiBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpLmdldFJ1bnRpbWVDbGFzcygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGJhc2UgcGF0aCBmb3IgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIHNlcnZlcgotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBwYXRoCi0JICovCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZ2V0VG9tY2F0U2VydmVyKCkuZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2dyYW0ncyBydW50aW1lIGFyZ3VtZW50cyB0byBzdGFydCBvciBzdG9wLgotCSAqCi0JICogQHBhcmFtIHN0YXJ0aW5nIHRydWUgaWYgc3RhcnRpbmcKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJ1bnRpbWUgcHJvZ3JhbSBhcmd1bWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoYm9vbGVhbiBzdGFydGluZykgewotCQlJUGF0aCBjb25maWdQYXRoID0gbnVsbDsKLQkJaWYgKGdldFRvbWNhdFNlcnZlcigpLmlzVGVzdEVudmlyb25tZW50KCkpCi0JCQljb25maWdQYXRoID0gZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKLQkJcmV0dXJuIGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoY29uZmlnUGF0aCwgZ2V0VG9tY2F0U2VydmVyKCkuaXNEZWJ1ZygpLCBzdGFydGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoYm9vbGVhbiBzdGFydGluZykgewotCQlyZXR1cm4gZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoKS5nZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGdldFRvbWNhdFNlcnZlcigpLmlzRGVidWcoKSwgc3RhcnRpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcnVudGltZSAoVk0pIGFyZ3VtZW50cy4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcnVudGltZSBhcmd1bWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UnVudGltZVZNQXJndW1lbnRzKCkgewotCQlJUGF0aCBpbnN0YWxsUGF0aCA9IGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpOwotCQkvLyBJZiBpbnN0YWxsUGF0aCBpcyByZWxhdGl2ZSwgY29udmVydCB0byBjYW5vbmljYWwgcGF0aCBhbmQgaG9wZSBmb3IgdGhlIGJlc3QKLQkJaWYgKCFpbnN0YWxsUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGluc3RhbGxMb2MgPSAobmV3IEZpbGUoaW5zdGFsbFBhdGgudG9PU1N0cmluZygpKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJCWluc3RhbGxQYXRoID0gbmV3IFBhdGgoaW5zdGFsbExvYyk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlIGlmIHRoZXJlIGlzIGEgcHJvYmxlbQotCQkJfQotCQl9Ci0JCUlQYXRoIGNvbmZpZ1BhdGggPSBnZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCQlJUGF0aCBkZXBsb3lQYXRoOwotCQkvLyBJZiBzZXJ2aW5nIG1vZHVsZXMgd2l0aG91dCBwdWJsaXNoaW5nLCB1c2Ugd29ya3NwYWNlIHBhdGggYXMgdGhlIGRlcGxveSBwYXRoCi0JCWlmIChnZXRUb21jYXRTZXJ2ZXIoKS5pc1NlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKCkpIHsKLQkJCWRlcGxveVBhdGggPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJLy8gRWxzZSBub3JtYWwgcHVibGlzaGluZyBmb3IgbW9kdWxlcwotCQllbHNlIHsKLQkJCWRlcGxveVBhdGggPSBnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKTsKLQkJCS8vIElmIGRlcGxveVBhdGggaXMgcmVsYXRpdmUsIGNvbnZlcnQgdG8gY2Fub25pY2FsIHBhdGggYW5kIGhvcGUgZm9yIHRoZSBiZXN0Ci0JCQlpZiAoIWRlcGxveVBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGRlcGxveUxvYyA9IChuZXcgRmlsZShkZXBsb3lQYXRoLnRvT1NTdHJpbmcoKSkpLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCQkJZGVwbG95UGF0aCA9IG5ldyBQYXRoKGRlcGxveUxvYyk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBJZ25vcmUgaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpLmdldFJ1bnRpbWVWTUFyZ3VtZW50cyhpbnN0YWxsUGF0aCwgY29uZmlnUGF0aCwKLQkJCQlkZXBsb3lQYXRoLCBnZXRUb21jYXRTZXJ2ZXIoKS5pc1Rlc3RFbnZpcm9ubWVudCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSdW50aW1lUG9saWN5RmlsZSgpIHsKLQkJSVBhdGggY29uZmlnUGF0aCA9IGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCk7Ci0JCXJldHVybiBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpLmdldFJ1bnRpbWVQb2xpY3lGaWxlKGNvbmZpZ1BhdGgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyByZW5kZXJDb21tYW5kTGluZShTdHJpbmdbXSBjb21tYW5kTGluZSwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlpZiAoY29tbWFuZExpbmUgPT0gbnVsbCB8fCBjb21tYW5kTGluZS5sZW5ndGggPCAxKQotCQkJcmV0dXJuICIiOwotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKGNvbW1hbmRMaW5lWzBdKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBjb21tYW5kTGluZS5sZW5ndGg7IGkrKykgewotCQkJYnVmLmFwcGVuZChzZXBhcmF0b3IpOwotCQkJYnVmLmFwcGVuZChjb21tYW5kTGluZVtpXSk7Ci0JCX0JCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9jZXNzTGlzdGVuZXIoZmluYWwgSVByb2Nlc3MgbmV3UHJvY2VzcykgewotCQlpZiAocHJvY2Vzc0xpc3RlbmVyICE9IG51bGwgfHwgbmV3UHJvY2VzcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJcHJvY2Vzc0xpc3RlbmVyID0gbmV3IElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10gZXZlbnRzKSB7Ci0JCQkJaWYgKGV2ZW50cyAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplID0gZXZlbnRzLmxlbmd0aDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCWlmIChuZXdQcm9jZXNzICE9IG51bGwgJiYgbmV3UHJvY2Vzcy5lcXVhbHMoZXZlbnRzW2ldLmdldFNvdXJjZSgpKSAmJiBldmVudHNbaV0uZ2V0S2luZCgpID09IERlYnVnRXZlbnQuVEVSTUlOQVRFKSB7Ci0JCQkJCQkJc3RvcEltcGwoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZERlYnVnRXZlbnRMaXN0ZW5lcihwcm9jZXNzTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNlcnZlclN0YXJ0ZWQoKSB7Ci0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcEltcGwoKSB7Ci0JCWlmIChwaW5nICE9IG51bGwpIHsKLQkJCXBpbmcuc3RvcCgpOwotCQkJcGluZyA9IG51bGw7Ci0JCX0KLQkJaWYgKHByb2Nlc3NMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0JCQlwcm9jZXNzTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaFNlcnZlcihpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJUGF0aCBpbnN0YWxsRGlyID0gZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmdldExvY2F0aW9uKCk7Ci0JCUlQYXRoIGNvbmZEaXIgPSBudWxsOwotCQlpZiAoZ2V0VG9tY2F0U2VydmVyKCkuaXNUZXN0RW52aXJvbm1lbnQoKSkgewotCQkJY29uZkRpciA9IGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkucHJlcGFyZVJ1bnRpbWVEaXJlY3RvcnkoY29uZkRpcik7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfSBlbHNlCi0JCQljb25mRGlyID0gaW5zdGFsbERpcjsKLQkJSVN0YXR1cyBzdGF0dXMgPSBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpLnByZXBhcmVEZXBsb3lEaXJlY3RvcnkoZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCkpOwotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCi0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMucHVibGlzaFNlcnZlclRhc2ssIDYwMCk7Ci0JCQotCQlzdGF0dXMgPSBnZXRUb21jYXRDb25maWd1cmF0aW9uKCkuY2xlYW51cFNlcnZlcihjb25mRGlyLCBpbnN0YWxsRGlyLAotCQkJCSFnZXRUb21jYXRTZXJ2ZXIoKS5pc1NhdmVTZXBhcmF0ZUNvbnRleHRGaWxlcygpLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDApKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCi0JCXN0YXR1cyA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKS5iYWNrdXBBbmRQdWJsaXNoKGNvbmZEaXIsICFnZXRUb21jYXRTZXJ2ZXIoKS5pc1Rlc3RFbnZpcm9ubWVudCgpLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCA0MDApKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCi0JCXN0YXR1cyA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKS5sb2NhbGl6ZUNvbmZpZ3VyYXRpb24oY29uZkRpciwgZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCksCi0JCQkJZ2V0VG9tY2F0U2VydmVyKCksIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMCkpOwotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkKLQkJbW9uaXRvci5kb25lKCk7Ci0JCQotCQlzZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotCX0KLQotCS8qCi0JICogUHVibGlzaGVzIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIHNlcnZlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoTW9kdWxlKGludCBraW5kLCBpbnQgZGVsdGFLaW5kLCBJTW9kdWxlW10gbW9kdWxlVHJlZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJaWYgKGRlbHRhS2luZCA9PSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5BRERFRCB8fCBkZWx0YUtpbmQgPT0gU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuUkVNT1ZFRCkKLQkJCQlzZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUodHJ1ZSk7Ci0JCX0KLQkJaWYgKGdldFRvbWNhdFNlcnZlcigpLmlzVGVzdEVudmlyb25tZW50KCkpCi0JCQlyZXR1cm47Ci0KLQkJSVBhdGggcGF0aCA9IGdldFRlbXBEaXJlY3RvcnkoKS5hcHBlbmQoInB1Ymxpc2gudHh0Iik7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCUZpbGVJbnB1dFN0cmVhbSBmaW4gPSBudWxsOwotCQl0cnkgewotCQkJZmluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLnRvRmlsZSgpKTsKLQkJCXAubG9hZChmaW4pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWZpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJCi0JCVB1Ymxpc2hIZWxwZXIgaGVscGVyID0gbmV3IFB1Ymxpc2hIZWxwZXIoZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKS5hcHBlbmQoInRlbXAiKS50b0ZpbGUoKSk7Ci0JCWlmIChtb2R1bGVUcmVlLmxlbmd0aCA9PSAxKSAvLyB3ZWIgbW9kdWxlCi0JCQlwdWJsaXNoRGlyKGRlbHRhS2luZCwgcCwgbW9kdWxlVHJlZSwgaGVscGVyLCBtb25pdG9yKTsKLQkJZWxzZSAvLyB1dGlsaXR5IGphcgotCQkJcHVibGlzaEphcihraW5kLCBkZWx0YUtpbmQsIHAsIG1vZHVsZVRyZWUsIGhlbHBlciwgbW9uaXRvcik7Ci0JCQotCQlzZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlVHJlZSwgSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotCQkKLQkJdHJ5IHsKLQkJCXAuc3RvcmUobmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aC50b0ZpbGUoKSksICJUb21jYXQgcHVibGlzaCBkYXRhIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2ggYSB3ZWIgbW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YUtpbmQKLQkgKiBAcGFyYW0gcAotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBwdWJsaXNoRGlyKGludCBkZWx0YUtpbmQsIFByb3BlcnRpZXMgcCwgSU1vZHVsZSBtb2R1bGVbXSwgUHVibGlzaEhlbHBlciBoZWxwZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gUmVtb3ZlIGlmIHJlcXVlc3RlZCBvciBpZiBwcmV2aW91c2x5IHB1Ymxpc2hlZCBhbmQgYXJlIG5vdyBzZXJ2aW5nIHdpdGhvdXQgcHVibGlzaGluZwotCQlpZiAoZGVsdGFLaW5kID09IFJFTU9WRUQgfHwgZ2V0VG9tY2F0U2VydmVyKCkuaXNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpKSB7Ci0JCQlTdHJpbmcgcHVibGlzaFBhdGggPSAoU3RyaW5nKSBwLmdldChtb2R1bGVbMF0uZ2V0SWQoKSk7Ci0JCQlpZiAocHVibGlzaFBhdGggIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGUgZiA9IG5ldyBGaWxlKHB1Ymxpc2hQYXRoKTsKLQkJCQkJaWYgKGYuZXhpc3RzKCkpIHsKLQkJCQkJCUlTdGF0dXNbXSBzdGF0ID0gUHVibGlzaEhlbHBlci5kZWxldGVEaXJlY3RvcnkoZiwgbW9uaXRvcik7Ci0JCQkJCQlQdWJsaXNoT3BlcmF0aW9uMi5hZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoQ291bGROb3RSZW1vdmVNb2R1bGUsbW9kdWxlWzBdLmdldE5hbWUoKSksIGUpKTsKLQkJCQl9Ci0JCQkJcC5yZW1vdmUobW9kdWxlWzBdLmdldElkKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSVBhdGggcGF0aCA9IGdldE1vZHVsZURlcGxveURpcmVjdG9yeShtb2R1bGVbMF0pOwotCQkJSU1vZHVsZVJlc291cmNlW10gbXIgPSBnZXRSZXNvdXJjZXMobW9kdWxlKTsKLQkJCUlQYXRoIFtdIGphclBhdGhzID0gbnVsbDsKLQkJCUlNb2R1bGUgW10gY2hpbGRNb2R1bGVzID0gZ2V0U2VydmVyKCkuZ2V0Q2hpbGRNb2R1bGVzKG1vZHVsZSwgbW9uaXRvcik7Ci0JCQlpZiAoY2hpbGRNb2R1bGVzICE9IG51bGwgJiYgY2hpbGRNb2R1bGVzLmxlbmd0aCA+IDApIHsKLQkJCQlqYXJQYXRocyA9IG5ldyBJUGF0aFtjaGlsZE1vZHVsZXMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTW9kdWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlqYXJQYXRoc1tpXSA9IG5ldyBQYXRoKCJXRUItSU5GL2xpYiIpLmFwcGVuZChjaGlsZE1vZHVsZXNbaV0uZ2V0TmFtZSgpICsgIi5qYXIiKTsKLQkJCQl9Ci0JCQl9Ci0JCQlJU3RhdHVzW10gc3RhdCA9IGhlbHBlci5wdWJsaXNoU21hcnQobXIsIHBhdGgsIGphclBhdGhzLCBtb25pdG9yKTsKLQkJCVB1Ymxpc2hPcGVyYXRpb24yLmFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7Ci0JCQlwLnB1dChtb2R1bGVbMF0uZ2V0SWQoKSwgcGF0aC50b09TU3RyaW5nKCkpOwotCQl9Ci0JCVB1Ymxpc2hPcGVyYXRpb24yLnRocm93RXhjZXB0aW9uKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogUHVibGlzaCBhIGphciBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YUtpbmQKLQkgKiBAcGFyYW0gcAotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBwdWJsaXNoSmFyKGludCBraW5kLCBpbnQgZGVsdGFLaW5kLCBQcm9wZXJ0aWVzIHAsIElNb2R1bGVbXSBtb2R1bGUsIFB1Ymxpc2hIZWxwZXIgaGVscGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gUmVtb3ZlIGlmIHJlcXVlc3RlZCBvciBpZiBwcmV2aW91c2x5IHB1Ymxpc2hlZCBhbmQgYXJlIG5vdyBzZXJ2aW5nIHdpdGhvdXQgcHVibGlzaGluZwotCQlpZiAoZGVsdGFLaW5kID09IFJFTU9WRUQgfHwgZ2V0VG9tY2F0U2VydmVyKCkuaXNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBwdWJsaXNoUGF0aCA9IChTdHJpbmcpIHAuZ2V0KG1vZHVsZVsxXS5nZXRJZCgpKTsKLQkJCQlpZiAocHVibGlzaFBhdGggIT0gbnVsbCkgewotCQkJCQluZXcgRmlsZShwdWJsaXNoUGF0aCkuZGVsZXRlKCk7Ci0JCQkJCXAucmVtb3ZlKG1vZHVsZVsxXS5nZXRJZCgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCAiQ291bGQgbm90IHJlbW92ZSBtb2R1bGUiLCBlKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJUGF0aCBwYXRoID0gZ2V0TW9kdWxlRGVwbG95RGlyZWN0b3J5KG1vZHVsZVswXSk7Ci0JCQlwYXRoID0gcGF0aC5hcHBlbmQoIldFQi1JTkYiKS5hcHBlbmQoImxpYiIpOwotCQkJSVBhdGggamFyUGF0aCA9IHBhdGguYXBwZW5kKG1vZHVsZVsxXS5nZXROYW1lKCkgKyAiLmphciIpOwotCQkJaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJcGF0aC50b0ZpbGUoKS5ta2RpcnMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSWYgZmlsZSBzdGlsbCBleGlzdHMgYW5kIHdlIGFyZSBub3QgZm9yY2luZyBhIG5ldyBvbmUgdG8gYmUgYnVpbHQKLQkJCQlpZiAoamFyUGF0aC50b0ZpbGUoKS5leGlzdHMoKSAmJiBraW5kICE9IElTZXJ2ZXIuUFVCTElTSF9DTEVBTiAmJiBraW5kICE9IElTZXJ2ZXIuUFVCTElTSF9GVUxMKSB7Ci0JCQkJCS8vIGF2b2lkIGNoYW5nZXMgaWYgbm8gY2hhbmdlcyB0byBtb2R1bGUgc2luY2UgbGFzdCBwdWJsaXNoCi0JCQkJCUlNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEgPSBnZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSk7Ci0JCQkJCWlmIChkZWx0YSA9PSBudWxsIHx8IGRlbHRhLmxlbmd0aCA9PSAwKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJSU1vZHVsZVJlc291cmNlW10gbXIgPSBnZXRSZXNvdXJjZXMobW9kdWxlKTsKLQkJCUlTdGF0dXNbXSBzdGF0ID0gaGVscGVyLnB1Ymxpc2haaXAobXIsIGphclBhdGgsIG1vbml0b3IpOwotCQkJTGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlQdWJsaXNoT3BlcmF0aW9uMi5hZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOwotCQkJUHVibGlzaE9wZXJhdGlvbjIudGhyb3dFeGNlcHRpb24oc3RhdHVzKTsKLQkJCXAucHV0KG1vZHVsZVsxXS5nZXRJZCgpLCBqYXJQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1czsKLQkJSVBhdGggYmFzZURpciA9IGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCk7Ci0JCVRvbWNhdFNlcnZlciB0cyA9IGdldFRvbWNhdFNlcnZlcigpOwotCQlJVG9tY2F0VmVyc2lvbkhhbmRsZXIgdHZoID0gZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoKTsKLQkJLy8gSW5jbHVkZSBvciByZW1vdmUgbG9hZGVyIGphciBkZXBlbmRpbmcgb24gc3RhdGUgb2Ygc2VydmluZyBkaXJlY3RseSAKLQkJc3RhdHVzID0gdHZoLnByZXBhcmVGb3JTZXJ2aW5nRGlyZWN0bHkoYmFzZURpciwgZ2V0VG9tY2F0U2VydmVyKCkpOwotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJLy8gSWYgc2VydmluZyBtb2R1bGVzIGRpcmVjdGx5LCB1cGRhdGUgc2VydmVyLnhtbCBhY2NvcmRpbmdseSAoaW5jbHVkZXMgcHJvamVjdCBjb250ZXh0LnhtbHMpCi0JCQlpZiAodHMuaXNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpKSB7Ci0JCQkJc3RhdHVzID0gZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpLnVwZGF0ZUNvbnRleHRzVG9TZXJ2ZURpcmVjdGx5KAotCQkJCQkJYmFzZURpciwgdHZoLmdldFNoYXJlZExvYWRlcihiYXNlRGlyKSwgbW9uaXRvcik7Ci0JCQl9Ci0JCQkvLyBFbHNlIHNlcnZpbmcgbm9ybWFsbHkuIEFkZCBwcm9qZWN0IGNvbnRleHQueG1scyB0byBzZXJ2ZXIueG1sCi0JCQllbHNlIHsKLQkJCQkvLyBQdWJsaXNoIGNvbnRleHQgY29uZmlndXJhdGlvbiBmb3Igc2VydmVycyB0aGF0IHN1cHBvcnQgTUVUQS1JTkYvY29udGV4dC54bWwKLQkJCQlzdGF0dXMgPSBnZXRUb21jYXRDb25maWd1cmF0aW9uKCkucHVibGlzaENvbnRleHRDb25maWcoCi0JCQkJCQliYXNlRGlyLCBnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKSwgbW9uaXRvcik7Ci0JCQl9Ci0JCQlpZiAoc3RhdHVzLmlzT0soKSAmJiB0cy5pc1NhdmVTZXBhcmF0ZUNvbnRleHRGaWxlcygpKSB7Ci0JCQkJLy8gRGV0ZXJtaW5lIGlmIGNvbnRleHQncyBwYXRoIGF0dHJpYnV0ZSBzaG91bGQgYmUgcmVtb3ZlZAotCQkJCVN0cmluZyBpZCA9IGdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCQkJCWJvb2xlYW4gbm9QYXRoID0gaWQuaW5kZXhPZigiNTUiKSA+IDAgfHwgaWQuaW5kZXhPZigiNjAiKSA+IDA7Ci0JCQkJYm9vbGVhbiBzZXJ2ZXJTdG9wcGVkID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQ7Ci0JCQkJLy8gVE9ETyBBZGQgYSBtb25pdG9yCi0JCQkJVG9tY2F0VmVyc2lvbkhlbHBlci5tb3ZlQ29udGV4dHNUb1NlcGFyYXRlRmlsZXMoYmFzZURpciwgbm9QYXRoLCBzZXJ2ZXJTdG9wcGVkLCBudWxsKTsKLQkJCX0KLQkJfQotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIFNldHVwIGZvciBzdGFydGluZyB0aGUgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2ggSUxhdW5jaAotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIFN0cmluZwotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldHVwTGF1bmNoKElMYXVuY2ggbGF1bmNoLCBTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgidHJ1ZSIuZXF1YWxzKGxhdW5jaC5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKEFUVFJfU1RPUCwgImZhbHNlIikpKQotCQkJcmV0dXJuOwotCQkvL2lmIChnZXRUb21jYXRSdW50aW1lKCkgPT0gbnVsbCkKLQkJLy8JdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oKTsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gZ2V0VG9tY2F0UnVudGltZSgpLnZhbGlkYXRlKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCi0JCS8vc2V0UmVzdGFydE5lZWRlZChmYWxzZSk7Ci0JCVRvbWNhdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCS8vIGNoZWNrIHRoYXQgcG9ydHMgYXJlIGZyZWUKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25maWd1cmF0aW9uLmdldFNlcnZlclBvcnRzKCkuaXRlcmF0b3IoKTsKLQkJTGlzdCB1c2VkUG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclBvcnQgc3AgPSAoU2VydmVyUG9ydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHNwLmdldFBvcnQoKSA8IDApCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclBvcnRJbnZhbGlkLCBudWxsKSk7Ci0JCQlpZiAoU29ja2V0VXRpbC5pc1BvcnRJblVzZShzcC5nZXRQb3J0KCksIDUpKSB7Ci0JCQkJdXNlZFBvcnRzLmFkZChzcCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHVzZWRQb3J0cy5zaXplKCkgPT0gMSkgewotCQkJU2VydmVyUG9ydCBwb3J0ID0gKFNlcnZlclBvcnQpIHVzZWRQb3J0cy5nZXQoMCk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUG9ydEluVXNlLCBuZXcgU3RyaW5nW10ge3BvcnQuZ2V0UG9ydCgpICsgIiIsIGdldFNlcnZlcigpLmdldE5hbWUoKX0pLCBudWxsKSk7Ci0JCX0gZWxzZSBpZiAodXNlZFBvcnRzLnNpemUoKSA+IDEpIHsKLQkJCVN0cmluZyBwb3J0U3RyID0gIiI7Ci0JCQlpdGVyYXRvciA9IHVzZWRQb3J0cy5pdGVyYXRvcigpOwotCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCFmaXJzdCkKLQkJCQkJcG9ydFN0ciArPSAiLCAiOwotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJU2VydmVyUG9ydCBzcCA9IChTZXJ2ZXJQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJcG9ydFN0ciArPSAiIiArIHNwLmdldFBvcnQoKTsKLQkJCX0KLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQb3J0c0luVXNlLCBuZXcgU3RyaW5nW10ge3BvcnRTdHIsIGdldFNlcnZlcigpLmdldE5hbWUoKX0pLCBudWxsKSk7Ci0JCX0KLQkJCi0JCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgYXBwIGZvciBlYWNoIGNvbnRleHQgcm9vdAotCQlpdGVyYXRvciA9IGNvbmZpZ3VyYXRpb24uZ2V0V2ViTW9kdWxlcygpLml0ZXJhdG9yKCk7Ci0JCUxpc3QgY29udGV4dFJvb3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlXZWJNb2R1bGUgbW9kdWxlID0gKFdlYk1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIGNvbnRleHRSb290ID0gbW9kdWxlLmdldFBhdGgoKTsKLQkJCWlmIChjb250ZXh0Um9vdHMuY29udGFpbnMoY29udGV4dFJvb3QpKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JEdXBsaWNhdGVDb250ZXh0Um9vdCwgbmV3IFN0cmluZ1tdIHsgY29udGV4dFJvb3QgfSksIG51bGwpKTsKLQkJCQotCQkJY29udGV4dFJvb3RzLmFkZChjb250ZXh0Um9vdCk7Ci0JCX0KLQkJCi0JCXNldFNlcnZlclJlc3RhcnRTdGF0ZShmYWxzZSk7Ci0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpOwotCQlzZXRNb2RlKGxhdW5jaE1vZGUpOwotCQkKLQkJLy8gcGluZyBzZXJ2ZXIgdG8gY2hlY2sgZm9yIHN0YXJ0dXAKLQkJdHJ5IHsKLQkJCVN0cmluZyB1cmwgPSAiaHR0cDovL2xvY2FsaG9zdCI7Ci0JCQlpbnQgcG9ydCA9IGNvbmZpZ3VyYXRpb24uZ2V0TWFpblBvcnQoKS5nZXRQb3J0KCk7Ci0JCQlpZiAocG9ydCAhPSA4MCkKLQkJCQl1cmwgKz0gIjoiICsgcG9ydDsKLQkJCXBpbmcgPSBuZXcgUGluZ1RocmVhZChnZXRTZXJ2ZXIoKSwgdXJsLCAtMSwgdGhpcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDYW4ndCBwaW5nIGZvciBUb21jYXQgc3RhcnR1cC4iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsZWFubHkgc2h1dHMgZG93biBhbmQgdGVybWluYXRlcyB0aGUgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBraWxsIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKGJvb2xlYW4gZm9yY2UpIHsKLQkJaWYgKGZvcmNlKSB7Ci0JCQl0ZXJtaW5hdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgc3RhdGUgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQkvLyBJZiBzdG9wcGVkIG9yIHN0b3BwaW5nLCBubyBuZWVkIHRvIHJ1biBzdG9wIGNvbW1hbmQgYWdhaW4KLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCB8fCAgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKLQkJCXJldHVybjsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykgewotCQkJdGVybWluYXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIlN0b3BwaW5nIFRvbWNhdCIpOwotCQkJaWYgKHN0YXRlICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQSU5HKTsKLQkKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZyA9ICgoU2VydmVyKWdldFNlcnZlcigpKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uKHRydWUsIG51bGwpOwotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IGxhdW5jaENvbmZpZy5nZXRXb3JraW5nQ29weSgpOwotCQkJCi0JCQlTdHJpbmcgYXJncyA9IHJlbmRlckNvbW1hbmRMaW5lKGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGZhbHNlKSwgIiAiKTsKLQkJCS8vIFJlbW92ZSBKTVggYXJndW1lbnRzIGlmIHByZXNlbnQKLQkJCVN0cmluZyBleGlzdGluZ1ZNQXJncyA9IHdjLmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9BUkdVTUVOVFMsIChTdHJpbmcpbnVsbCk7Ci0JCQlpZiAoZXhpc3RpbmdWTUFyZ3MuaW5kZXhPZihKTVhfRVhDTFVERV9BUkdTWzBdKSA+PSAwKSB7Ci0JCQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywgCi0JCQkJCQltZXJnZUFyZ3VtZW50cyhleGlzdGluZ1ZNQXJncywgbmV3IFN0cmluZyBbXSB7fSwgSk1YX0VYQ0xVREVfQVJHUywgZmFsc2UpKTsKLQkJCX0KLQkJCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywgYXJncyk7Ci0JCQl3Yy5zZXRBdHRyaWJ1dGUoIm9yZy5lY2xpcHNlLmRlYnVnLnVpLnByaXZhdGUiLCB0cnVlKTsKLQkJCXdjLnNldEF0dHJpYnV0ZShBVFRSX1NUT1AsICJ0cnVlIik7Ci0JCQl3Yy5sYXVuY2goSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc3RvcHBpbmcgVG9tY2F0IiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXJtaW5hdGVzIHRoZSBzZXJ2ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVybWluYXRlKCkgewotCQlpZiAoZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVE9QUElORyk7Ci0JCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIktpbGxpbmcgdGhlIFRvbWNhdCBwcm9jZXNzIik7Ci0JCQlJTGF1bmNoIGxhdW5jaCA9IGdldFNlcnZlcigpLmdldExhdW5jaCgpOwotCQkJaWYgKGxhdW5jaCAhPSBudWxsKSB7Ci0JCQkJbGF1bmNoLnRlcm1pbmF0ZSgpOwotCQkJCXN0b3BJbXBsKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBraWxsaW5nIHRoZSBwcm9jZXNzIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0VGVtcERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFRlbXBEaXJlY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJUb21jYXRTZXJ2ZXIiOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXROZXh0VG9rZW4oU3RyaW5nIHMsIGludCBzdGFydCkgewotCQlpbnQgaSA9IHN0YXJ0OwotCQlpbnQgbGVuZ3RoID0gcy5sZW5ndGgoKTsKLQkJY2hhciBsb29rRm9yID0gJyAnOwotCQkKLQkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKLQkJCWNoYXIgYyA9IHMuY2hhckF0KGkpOwotCQkJaWYgKGxvb2tGb3IgPT0gYykgewotCQkJCWlmIChsb29rRm9yID09ICciJykKLQkJCQkJcmV0dXJuIGkrMTsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJCWlmIChjID09ICciJykKLQkJCQlsb29rRm9yID0gJyInOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JLyoqCi0JICogTWVyZ2UgdGhlIGdpdmVuIGFyZ3VtZW50cyBpbnRvIHRoZSBvcmlnaW5hbCBhcmd1bWVudCBzdHJpbmcsIHJlcGxhY2luZwotCSAqIGludmFsaWQgdmFsdWVzIGlmIHRoZXkgaGF2ZSBiZWVuIGNoYW5nZWQuICBTcGVjaWFsIGhhbmRsaW5nIGlzIHByb3ZpZGVkCi0JICogaWYgdGhlIGtlZXBBY3Rpb25MYXN0IGFyZ3VtZW50IGlzIHRydWUgYW5kIHRoZSBsYXN0IHZtQXJnIGlzIGEgc2ltcGxlCi0JICogc3RyaW5nLiAgVGhlIHZtQXJncyB3aWxsIGJlIG1lcmdlZCBzdWNoIHRoYXQgdGhlIGxhc3Qgdm1BcmcgaXMgZ3VhcmFudGVlZAotCSAqIHRvIGJlIHRoZSBsYXN0IGFyZ3VtZW50IGluIHRoZSBtZXJnZWQgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW5hbEFyZyBTdHJpbmcgb2Ygb3JpZ2luYWwgYXJndW1lbnRzLgotCSAqIEBwYXJhbSB2bUFyZ3MgQXJndW1lbnRzIHRvIG1lcmdlIGludG8gdGhlIG9yaWdpbmFsIGFyZ3VtZW50cyBzdHJpbmcKLQkgKiBAcGFyYW0gZXhjbHVkZUFyZ3MgQXJndW1lbnRzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgb3JpZ2luYWwgYXJndW1lbnRzIHN0cmluZwotCSAqIEBwYXJhbSBrZWVwQWN0aW9uTGFzdCBJZiA8Yj50cnVlPC9iPiB0aGUgdm1Bcmd1bWVudHMgYXJlIGFzc3VtZWQgdG8gYmUgVG9tY2F0Ci0JICogcHJvZ3JhbSBhcmd1bWVudHMsIHRoZSBsYXN0IG9mIHdoaWNoIGlzIHRoZSBhY3Rpb24gdG8gcGVyZm9ybSB3aGljaCBtdXN0Ci0JICogcmVtYWluIHRoZSBsYXN0IGFyZ3VtZW50LiAgVGhpcyBvbmx5IGhhcyBhbiBpbXBhY3QgaWYgdGhlIGxhc3Qgdm1BcmcgaXMKLQkgKiBhIHNpbXBsZSBzdHJpbmcgYXJndW1lbnQsIGxpa2UgJnF1b3Q7c3RhcnQmcXVvdDsuCi0JICogQHJldHVybiBtZXJnZWQgYXJndW1lbnQgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVyZ2VBcmd1bWVudHMoU3RyaW5nIG9yaWdpbmFsQXJnLCBTdHJpbmdbXSB2bUFyZ3MsIFN0cmluZ1tdIGV4Y2x1ZGVBcmdzLCBib29sZWFuIGtlZXBBY3Rpb25MYXN0KSB7Ci0JCWlmICh2bUFyZ3MgPT0gbnVsbCkKLQkJCXJldHVybiBvcmlnaW5hbEFyZzsKLQkJCi0JCWlmIChvcmlnaW5hbEFyZyA9PSBudWxsKQotCQkJb3JpZ2luYWxBcmcgPSAiIjsKLQkJCi0JCS8vIHJlcGxhY2UgYW5kIG51bGwgb3V0IGFsbCB2bWFyZ3MgdGhhdCBhbHJlYWR5IGV4aXN0Ci0JCWludCBzaXplID0gdm1BcmdzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWludCBpbmQgPSB2bUFyZ3NbaV0uaW5kZXhPZigiICIpOwotCQkJaW50IGluZDIgPSB2bUFyZ3NbaV0uaW5kZXhPZigiPSIpOwotCQkJaWYgKGluZCA+PSAwICYmIChpbmQyID09IC0xIHx8IGluZCA8IGluZDIpKSB7IC8vIC1hIGJjIHN0eWxlCi0JCQkJaW50IGluZGV4ID0gb3JpZ2luYWxBcmcuaW5kZXhPZih2bUFyZ3NbaV0uc3Vic3RyaW5nKDAsIGluZCArIDEpKTsKLQkJCQlpZiAoaW5kZXggPT0gMCB8fCAoaW5kZXggPiAwICYmIG9yaWdpbmFsQXJnLmNoYXJBdChpbmRleCAtIDEpID09ICcgJykpIHsKLQkJCQkJLy8gcmVwbGFjZQotCQkJCQlTdHJpbmcgcyA9IG9yaWdpbmFsQXJnLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCWludCBpbmRleDIgPSBnZXROZXh0VG9rZW4ob3JpZ2luYWxBcmcsIGluZGV4ICsgaW5kICsgMSk7Ci0JCQkJCWlmIChpbmRleDIgPj0gMCkKLQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXSArIG9yaWdpbmFsQXJnLnN1YnN0cmluZyhpbmRleDIpOwotCQkJCQllbHNlCi0JCQkJCQlvcmlnaW5hbEFyZyA9IHMgKyB2bUFyZ3NbaV07Ci0JCQkJCXZtQXJnc1tpXSA9IG51bGw7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChpbmQyID49IDApIHsgLy8gYT1iIHN0eWxlCi0JCQkJaW50IGluZGV4ID0gb3JpZ2luYWxBcmcuaW5kZXhPZih2bUFyZ3NbaV0uc3Vic3RyaW5nKDAsIGluZDIgKyAxKSk7Ci0JCQkJaWYgKGluZGV4ID09IDAgfHwgKGluZGV4ID4gMCAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXggLSAxKSA9PSAnICcpKSB7Ci0JCQkJCS8vIHJlcGxhY2UKLQkJCQkJU3RyaW5nIHMgPSBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQlpbnQgaW5kZXgyID0gZ2V0TmV4dFRva2VuKG9yaWdpbmFsQXJnLCBpbmRleCk7Ci0JCQkJCWlmIChpbmRleDIgPj0gMCkKLQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXSArIG9yaWdpbmFsQXJnLnN1YnN0cmluZyhpbmRleDIpOwotCQkJCQllbHNlCi0JCQkJCQlvcmlnaW5hbEFyZyA9IHMgKyB2bUFyZ3NbaV07Ci0JCQkJCXZtQXJnc1tpXSA9IG51bGw7Ci0JCQkJfQotCQkJfSBlbHNlIHsgLy8gYWJjIHN0eWxlCi0JCQkJaW50IGluZGV4ID0gb3JpZ2luYWxBcmcuaW5kZXhPZih2bUFyZ3NbaV0pOwotCQkJCWlmIChpbmRleCA9PSAwIHx8IChpbmRleCA+IDAgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4LTEpID09ICcgJykpIHsKLQkJCQkJLy8gcmVwbGFjZQotCQkJCQlTdHJpbmcgcyA9IG9yaWdpbmFsQXJnLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCWludCBpbmRleDIgPSBnZXROZXh0VG9rZW4ob3JpZ2luYWxBcmcsIGluZGV4KTsKLQkJCQkJaWYgKCFrZWVwQWN0aW9uTGFzdCB8fCBpIDwgKHNpemUgLSAxKSkgewotCQkJCQkJaWYgKGluZGV4MiA+PSAwKQotCQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXSArIG9yaWdpbmFsQXJnLnN1YnN0cmluZyhpbmRleDIpOwotCQkJCQkJZWxzZQotCQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXTsKLQkJCQkJCXZtQXJnc1tpXSA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBUaGUgbGFzdCBWTSBhcmd1bWVudCBuZWVkcyB0byByZW1haW4gbGFzdCwKLQkJCQkJCS8vIHJlbW92ZSBvcmlnaW5hbCBhcmcgYW5kIGFwcGVuZCB0aGUgdm1BcmcgbGF0ZXIKLQkJCQkJCWlmIChpbmRleDIgPj0gMCkKLQkJCQkJCQlvcmlnaW5hbEFyZyA9IHMgKyBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoaW5kZXgyKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlvcmlnaW5hbEFyZyA9IHM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyByZW1vdmUgZXhjbHVkZWQgYXJndW1lbnRzCi0JCWlmIChleGNsdWRlQXJncyAhPSBudWxsICYmIGV4Y2x1ZGVBcmdzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZUFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgaW5kID0gZXhjbHVkZUFyZ3NbaV0uaW5kZXhPZigiICIpOwotCQkJCWludCBpbmQyID0gZXhjbHVkZUFyZ3NbaV0uaW5kZXhPZigiPSIpOwotCQkJCWlmIChpbmQgPj0gMCAmJiAoaW5kMiA9PSAtMSB8fCBpbmQgPCBpbmQyKSkgeyAvLyAtYSBiYyBzdHlsZQotCQkJCQlpbnQgaW5kZXggPSBvcmlnaW5hbEFyZy5pbmRleE9mKGV4Y2x1ZGVBcmdzW2ldLnN1YnN0cmluZygwLCBpbmQgKyAxKSk7Ci0JCQkJCWlmIChpbmRleCA9PSAwIHx8IChpbmRleCA+IDAgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4IC0gMSkgPT0gJyAnKSkgewotCQkJCQkJLy8gcmVtb3ZlCi0JCQkJCQlTdHJpbmcgcyA9IG9yaWdpbmFsQXJnLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCQlpbnQgaW5kZXgyID0gZ2V0TmV4dFRva2VuKG9yaWdpbmFsQXJnLCBpbmRleCArIGluZCArIDEpOwotCQkJCQkJaWYgKGluZGV4MiA+PSAwKSB7Ci0JCQkJCQkJLy8gSWYgcmVtYWluZGVyIHdpbGwgYmVjb21lIHRoZSBmaXJzdCBhcmd1bWVudCwgcmVtb3ZlIGxlYWRpbmcgYmxhbmtzCi0JCQkJCQkJd2hpbGUgKGluZGV4MiA8IG9yaWdpbmFsQXJnLmxlbmd0aCgpICYmIG9yaWdpbmFsQXJnLmNoYXJBdChpbmRleDIpID09ICcgJykKLQkJCQkJCQkJaW5kZXgyICs9IDE7Ci0JCQkJCQkJb3JpZ2luYWxBcmcgPSBzICsgb3JpZ2luYWxBcmcuc3Vic3RyaW5nKGluZGV4Mik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJb3JpZ2luYWxBcmcgPSBzOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChpbmQyID49IDApIHsgLy8gYT1iIHN0eWxlCi0JCQkJCWludCBpbmRleCA9IG9yaWdpbmFsQXJnLmluZGV4T2YoZXhjbHVkZUFyZ3NbaV0uc3Vic3RyaW5nKDAsIGluZDIgKyAxKSk7Ci0JCQkJCWlmIChpbmRleCA9PSAwIHx8IChpbmRleCA+IDAgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4IC0gMSkgPT0gJyAnKSkgewotCQkJCQkJLy8gcmVtb3ZlCi0JCQkJCQlTdHJpbmcgcyA9IG9yaWdpbmFsQXJnLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCQlpbnQgaW5kZXgyID0gZ2V0TmV4dFRva2VuKG9yaWdpbmFsQXJnLCBpbmRleCk7Ci0JCQkJCQlpZiAoaW5kZXgyID49IDApIHsKLQkJCQkJCQkvLyBJZiByZW1haW5kZXIgd2lsbCBiZWNvbWUgdGhlIGZpcnN0IGFyZ3VtZW50LCByZW1vdmUgbGVhZGluZyBibGFua3MKLQkJCQkJCQl3aGlsZSAoaW5kZXgyIDwgb3JpZ2luYWxBcmcubGVuZ3RoKCkgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4MikgPT0gJyAnKQotCQkJCQkJCQlpbmRleDIgKz0gMTsKLQkJCQkJCQlvcmlnaW5hbEFyZyA9IHMgKyBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoaW5kZXgyKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlvcmlnaW5hbEFyZyA9IHM7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgeyAvLyBhYmMgc3R5bGUKLQkJCQkJaW50IGluZGV4ID0gb3JpZ2luYWxBcmcuaW5kZXhPZihleGNsdWRlQXJnc1tpXSk7Ci0JCQkJCWlmIChpbmRleCA9PSAwIHx8IChpbmRleCA+IDAgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4LTEpID09ICcgJykpIHsKLQkJCQkJCS8vIHJlbW92ZQotCQkJCQkJU3RyaW5nIHMgPSBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQkJaW50IGluZGV4MiA9IGdldE5leHRUb2tlbihvcmlnaW5hbEFyZywgaW5kZXgpOwotCQkJCQkJaWYgKGluZGV4MiA+PSAwKSB7Ci0JCQkJCQkJLy8gUmVtb3ZlIGxlYWRpbmcgYmxhbmtzCi0JCQkJCQkJd2hpbGUgKGluZGV4MiA8IG9yaWdpbmFsQXJnLmxlbmd0aCgpICYmIG9yaWdpbmFsQXJnLmNoYXJBdChpbmRleDIpID09ICcgJykKLQkJCQkJCQkJaW5kZXgyICs9IDE7Ci0JCQkJCQkJb3JpZ2luYWxBcmcgPSBzICsgb3JpZ2luYWxBcmcuc3Vic3RyaW5nKGluZGV4Mik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJb3JpZ2luYWxBcmcgPSBzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIHJlbWFpbmluZyB2bWFyZ3MgdG8gdGhlIGVuZAotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHZtQXJnc1tpXSAhPSBudWxsKSB7Ci0JCQkJaWYgKG9yaWdpbmFsQXJnLmxlbmd0aCgpID4gMCAmJiAhb3JpZ2luYWxBcmcuZW5kc1dpdGgoIiAiKSkKLQkJCQkJb3JpZ2luYWxBcmcgKz0gIiAiOwotCQkJCW9yaWdpbmFsQXJnICs9IHZtQXJnc1tpXTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG9yaWdpbmFsQXJnOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgdGhlIGN1cnJlbnQgSlJFIGNvbnRhaW5lciBjbGFzc3BhdGggd2l0aCB0aGUgZ2l2ZW4gZW50cnkuCi0JICogCi0JICogQHBhcmFtIGNwCi0JICogQHBhcmFtIGVudHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VKUkVDb250YWluZXIoTGlzdCBjcCwgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlpbnQgc2l6ZSA9IGNwLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkyID0gKElSdW50aW1lQ2xhc3NwYXRoRW50cnkpIGNwLmdldChpKTsKLQkJCWlmIChlbnRyeTIuZ2V0UGF0aCgpLnVwdG9TZWdtZW50KDIpLmlzUHJlZml4T2YoZW50cnkuZ2V0UGF0aCgpKSkgewotCQkJCWNwLnNldChpLCBlbnRyeSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQljcC5hZGQoMCwgZW50cnkpOwotCX0KLQotCS8qKgotCSAqIE1lcmdlIGEgc2luZ2xlIGNsYXNzcGF0aCBlbnRyeSBpbnRvIHRoZSBjbGFzc3BhdGggbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gY3AKLQkgKiBAcGFyYW0gZW50cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2VDbGFzc3BhdGgoTGlzdCBjcCwgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNwLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkyID0gKElSdW50aW1lQ2xhc3NwYXRoRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQotCQkJaWYgKGVudHJ5Mi5nZXRQYXRoKCkuZXF1YWxzKGVudHJ5LmdldFBhdGgoKSkpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCQotCQljcC5hZGQoZW50cnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldHVwTGF1bmNoQ29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGV4aXN0aW5nUHJvZ0FyZ3MgPSB3b3JraW5nQ29weS5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsIChTdHJpbmcpbnVsbCk7Ci0JCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywKLQkJCQltZXJnZUFyZ3VtZW50cyhleGlzdGluZ1Byb2dBcmdzLCBnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyh0cnVlKSwgZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyh0cnVlKSwgdHJ1ZSkpOwotCQkKLQkJU3RyaW5nIGV4aXN0aW5nVk1BcmdzID0gd29ya2luZ0NvcHkuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywgKFN0cmluZyludWxsKTsKLQkJU3RyaW5nW10gcGFyc2VkVk1BcmdzID0gbnVsbDsKLQkJaWYgKG51bGwgIT0gZXhpc3RpbmdWTUFyZ3MpIHsKLQkJCXBhcnNlZFZNQXJncyA9IERlYnVnUGx1Z2luLnBhcnNlQXJndW1lbnRzKGV4aXN0aW5nVk1BcmdzKTsKLQkJfQotCQlTdHJpbmcgW10gY29uZmlnVk1BcmdzID0gZ2V0UnVudGltZVZNQXJndW1lbnRzKCk7Ci0JCWlmIChnZXRUb21jYXRTZXJ2ZXIoKS5pc1NlY3VyZSgpKSB7Ci0JCQlib29sZWFuIGFkZFNlY3VyaXR5QXJncyA9IHRydWU7Ci0JCQlpZiAobnVsbCAhPSBwYXJzZWRWTUFyZ3MpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZFZNQXJncy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAocGFyc2VkVk1BcmdzW2ldLnN0YXJ0c1dpdGgoInd0cC5jb25maWd1cmVkLnNlY3VyaXR5IikpIHsKLQkJCQkJCWFkZFNlY3VyaXR5QXJncyA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkU2VjdXJpdHlBcmdzKSB7Ci0JCQkJU3RyaW5nIFtdIG5ld1ZNQXJncyA9IG5ldyBTdHJpbmcgW2NvbmZpZ1ZNQXJncy5sZW5ndGggKyAzXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbmZpZ1ZNQXJncywgMCwgbmV3Vk1BcmdzLCAwLCBjb25maWdWTUFyZ3MubGVuZ3RoKTsKLQkJCQluZXdWTUFyZ3NbY29uZmlnVk1BcmdzLmxlbmd0aF0gPSAiLURqYXZhLnNlY3VyaXR5Lm1hbmFnZXIiOwotCQkJCW5ld1ZNQXJnc1tjb25maWdWTUFyZ3MubGVuZ3RoICsgMV0gPSAiLURqYXZhLnNlY3VyaXR5LnBvbGljeT1cIiIKLQkJCQkJCSsgZ2V0UnVudGltZVBvbGljeUZpbGUoKSArIlwiIjsKLQkJCQluZXdWTUFyZ3NbY29uZmlnVk1BcmdzLmxlbmd0aCArIDJdID0gIi1Ed3RwLmNvbmZpZ3VyZWQuc2VjdXJpdHk9dHJ1ZSI7Ci0JCQkJY29uZmlnVk1BcmdzID0gbmV3Vk1BcmdzOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG51bGwgIT0gcGFyc2VkVk1BcmdzKXsKLQkJCWJvb2xlYW4gcmVtb3ZlU2VjdXJpdHlBcmdzID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZFZNQXJncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChwYXJzZWRWTUFyZ3NbaV0uc3RhcnRzV2l0aCgiLUR3dHAuY29uZmlndXJlZC5zZWN1cml0eSIpKSB7Ci0JCQkJCXJlbW92ZVNlY3VyaXR5QXJncyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyZW1vdmVTZWN1cml0eUFyZ3MpIHsKLQkJCQlTdHJpbmdCdWZmZXIgZmlsdGVyZWRWTUFyZ3MgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRWTUFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIGFyZyA9IHBhcnNlZFZNQXJnc1tpXTsKLQkJCQkJaWYgKCFhcmcuc3RhcnRzV2l0aCgiLURqYXZhLnNlY3VyaXR5Lm1hbmFnZXIiKQotCQkJCQkJCSYmICFhcmcuc3RhcnRzV2l0aCgiLURqYXZhLnNlY3VyaXR5LnBvbGljeT0iKQotCQkJCQkJCSYmICFhcmcuc3RhcnRzV2l0aCgiLUR3dHAuY29uZmlndXJlZC5zZWN1cml0eT0iKSkgewotCQkJCQkJaWYgKGZpbHRlcmVkVk1BcmdzLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCWZpbHRlcmVkVk1BcmdzLmFwcGVuZCgnICcpOwotCQkJCQkJfQotCQkJCQkJZmlsdGVyZWRWTUFyZ3MuYXBwZW5kKGFyZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZXhpc3RpbmdWTUFyZ3MgPSBmaWx0ZXJlZFZNQXJncy50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9BUkdVTUVOVFMsCi0JCQkJbWVyZ2VBcmd1bWVudHMoZXhpc3RpbmdWTUFyZ3MsIGNvbmZpZ1ZNQXJncywgbnVsbCwgZmFsc2UpKTsKLQkJCi0JCUlUb21jYXRSdW50aW1lIHJ1bnRpbWUgPSBnZXRUb21jYXRSdW50aW1lKCk7Ci0JCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gcnVudGltZS5nZXRWTUluc3RhbGwoKTsKLQkJaWYgKHZtSW5zdGFsbCAhPSBudWxsKQotCQkJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0pSRV9DT05UQUlORVJfUEFUSCwgSmF2YVJ1bnRpbWUubmV3SlJFQ29udGFpbmVyUGF0aCh2bUluc3RhbGwpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQotCQkvLyB1cGRhdGUgY2xhc3NwYXRoCi0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENsYXNzcGF0aCA9IEphdmFSdW50aW1lLmNvbXB1dGVVbnJlc29sdmVkUnVudGltZUNsYXNzcGF0aCh3b3JraW5nQ29weSk7Ci0JCWludCBzaXplID0gb3JpZ2luYWxDbGFzc3BhdGgubGVuZ3RoOwotCQlMaXN0IG9sZENwID0gbmV3IEFycmF5TGlzdChvcmlnaW5hbENsYXNzcGF0aC5sZW5ndGggKyAyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQlvbGRDcC5hZGQob3JpZ2luYWxDbGFzc3BhdGhbaV0pOwotCQkKLQkJTGlzdCBjcDIgPSBydW50aW1lLmdldFJ1bnRpbWVDbGFzc3BhdGgoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjcDIuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJUnVudGltZUNsYXNzcGF0aEVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQltZXJnZUNsYXNzcGF0aChvbGRDcCwgZW50cnkpOwotCQl9Ci0JCQotCQlpZiAodm1JbnN0YWxsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHR5cGVJZCA9IHZtSW5zdGFsbC5nZXRWTUluc3RhbGxUeXBlKCkuZ2V0SWQoKTsKLQkJCQlyZXBsYWNlSlJFQ29udGFpbmVyKG9sZENwLCBKYXZhUnVudGltZS5uZXdSdW50aW1lQ29udGFpbmVyQ2xhc3NwYXRoRW50cnkobmV3IFBhdGgoSmF2YVJ1bnRpbWUuSlJFX0NPTlRBSU5FUikuYXBwZW5kKHR5cGVJZCkuYXBwZW5kKHZtSW5zdGFsbC5nZXROYW1lKCkpLCBJUnVudGltZUNsYXNzcGF0aEVudHJ5LkJPT1RTVFJBUF9DTEFTU0VTKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJCi0JCQlJUGF0aCBqcmVQYXRoID0gbmV3IFBhdGgodm1JbnN0YWxsLmdldEluc3RhbGxMb2NhdGlvbigpLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWlmIChqcmVQYXRoICE9IG51bGwpIHsKLQkJCQlJUGF0aCB0b29sc1BhdGggPSBqcmVQYXRoLmFwcGVuZCgibGliIikuYXBwZW5kKCJ0b29scy5qYXIiKTsKLQkJCQlpZiAodG9vbHNQYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgdG9vbHNKYXIgPSBKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KHRvb2xzUGF0aCk7Ci0JCQkJCS8vIFNlYXJjaCBmb3IgaW5kZXggdG8gYW55IGV4aXN0aW5nIHRvb2xzLmphciBlbnRyeQotCQkJCQlpbnQgdG9vbHNJbmRleDsKLQkJCQkJZm9yICh0b29sc0luZGV4ID0gMDsgdG9vbHNJbmRleCA8IG9sZENwLnNpemUoKTsgdG9vbHNJbmRleCsrICkgewotCQkJCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJUnVudGltZUNsYXNzcGF0aEVudHJ5KSBvbGRDcC5nZXQodG9vbHNJbmRleCk7Ci0JCQkJCQlpZiAoZW50cnkuZ2V0VHlwZSgpID09IElSdW50aW1lQ2xhc3NwYXRoRW50cnkuQVJDSElWRQotCQkJCQkJCQkmJiBlbnRyeS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKS5lcXVhbHMoInRvb2xzLmphciIpKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gSWYgZXhpc3RpbmcgdG9vbHMuamFyIGZvdW5kLCByZXBsYWNlIGluIGNhc2UgaXQncyBkaWZmZXJlbnQuICBPdGhlcndpc2UgYWRkLgotCQkJCQlpZiAodG9vbHNJbmRleCA8IG9sZENwLnNpemUoKSkKLQkJCQkJCW9sZENwLnNldCh0b29sc0luZGV4LCB0b29sc0phcik7IAotCQkJCQllbHNlCi0JCQkJCQltZXJnZUNsYXNzcGF0aChvbGRDcCwgdG9vbHNKYXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaXRlcmF0b3IgPSBvbGRDcC5pdGVyYXRvcigpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSAoSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlsaXN0LmFkZChlbnRyeS5nZXRNZW1lbnRvKCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgcmVzb2x2ZSBjbGFzc3BhdGggZW50cnk6ICIgKyBlbnRyeSwgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9DTEFTU1BBVEgsIGxpc3QpOwotCQl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVGQVVMVF9DTEFTU1BBVEgsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gZ2V0UmVzb3VyY2VzKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlcyhtb2R1bGUpOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShtb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUjaGFuZGxlUmVzb3VyY2VDaGFuZ2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZVJlc291cmNlQ2hhbmdlKCkgewotCQlpZiAoZ2V0U2VydmVyKCkuZ2V0U2VydmVyUmVzdGFydFN0YXRlKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldEFsbE1vZHVsZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9kdWxlW10gbW9kdWxlID0gKElNb2R1bGVbXSkgaXRlcmF0b3IubmV4dCgpOwotCQkJSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSA9IGdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEobW9kdWxlKTsKLQkJCWlmIChkZWx0YSA9PSBudWxsIHx8IGRlbHRhLmxlbmd0aCA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQlpZiAoY29udGFpbnNOb25SZXNvdXJjZUNoYW5nZShkZWx0YSkpIHsKLQkJCQlzZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUodHJ1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNOb25SZXNvdXJjZUNoYW5nZShJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGRlbHRhKSB7Ci0JCWludCBzaXplID0gZGVsdGEubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSU1vZHVsZVJlc291cmNlRGVsdGEgZCA9IGRlbHRhW2ldOwotCQkJaWYgKGQuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCkgPT0gMCkgewotCQkJCWlmICgiV0VCLUlORiIuZXF1YWxzKGQuZ2V0TW9kdWxlUmVzb3VyY2UoKS5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiBjb250YWluc05vblJlc291cmNlQ2hhbmdlKGQuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZC5nZXRNb2R1bGVSZXNvdXJjZSgpIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJCWJvb2xlYW4gYiA9IGNvbnRhaW5zTm9uQWRkQ2hhbmdlKGQuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKTsKLQkJCWlmIChiKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc05vbkFkZENoYW5nZShJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGRlbHRhKSB7Ci0JCWlmIChkZWx0YSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgc2l6ZSA9IGRlbHRhLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlNb2R1bGVSZXNvdXJjZURlbHRhIGQgPSBkZWx0YVtpXTsKLQkJCWlmIChkLmdldE1vZHVsZVJlc291cmNlKCkgaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgewotCQkJCWlmIChkLmdldEtpbmQoKSAhPSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5BRERFRCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkKLQkJCWJvb2xlYW4gYiA9IGNvbnRhaW5zTm9uQWRkQ2hhbmdlKGQuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKTsKLQkJCWlmIChiKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2xlYW5zIHRoZSBlbnRpcmUgd29yayBkaXJlY3RvcnkgZm9yIHRoaXMgc2VydmVyLiAgVGhpcyBpbnZvbHZlcwotCSAqIGRlbGV0aW5nIGFsbCBzdWJkaXJlY3RvcmllcyBvZiB0aGUgc2VydmVyJ3Mgd29yayBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiByZXN1bHRzIG9mIHRoZSBjbGVhbiBvcGVyYXRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjbGVhblNlcnZlcldvcmtEaXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXMgcmVzdWx0OwotCQlJUGF0aCBiYXNlUGF0aCA9IGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCk7Ci0JCUlQYXRoIHdvcmtQYXRoID0gZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpLmdldFNlcnZlcldvcmtEaXJlY3RvcnkoYmFzZVBhdGgpOwotCQlpZiAod29ya1BhdGggIT0gbnVsbCkgewotCQkJRmlsZSB3b3JrRGlyID0gd29ya1BhdGgudG9GaWxlKCk7Ci0JCQlyZXN1bHQgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJaWYgKHdvcmtEaXIuZXhpc3RzKCkgJiYgd29ya0Rpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJLy8gRGVsZXRlIHN1YmRpcmVjdG9yaWVzIG9mIHRoZSBzZXJ2ZXIncyB3b3JrIGRpcgotCQkJCUZpbGVbXSBmaWxlcyA9IHdvcmtEaXIubGlzdEZpbGVzKCk7Ci0JCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQlNdWx0aVN0YXR1cyBtcyA9IG5ldyBNdWx0aVN0YXR1cyhUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCAiUHJvYmxlbSBvY2N1cnJlZCBkZWxldGluZyB3b3JrIGRpcmVjdG9yeSBmb3IgbW9kdWxlLiIsIG51bGwpOwotCQkJCQlpbnQgc2l6ZSA9IGZpbGVzLmxlbmd0aDsKLQkJCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJCQltb25pdG9yLmJlZ2luVGFzayhOTFMuYmluZCgiQ2xlYW5pbmcgU2VydmVyIFdvcmsgRGlyZWN0b3J5IiwgbmV3IFN0cmluZ1tdIHsgd29ya0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSB9KSwgc2l6ZSAqIDEwKTsKLQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJRmlsZSBjdXJyZW50ID0gZmlsZXNbaV07Ci0JCQkJCQlpZiAoY3VycmVudC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQkJSVN0YXR1cyBbXSByZXN1bHRzID0gUHVibGlzaEhlbHBlci5kZWxldGVEaXJlY3RvcnkoY3VycmVudCwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTApKTsKLQkJCQkJCQlpZiAocmVzdWx0cyAhPSBudWxsICYmIHJlc3VsdHMubGVuZ3RoID4gMCkgewotCQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJCW1zLmFkZChyZXN1bHRzW2pdKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJcmVzdWx0ID0gbXM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCAiQ291bGQgbm90IGRldGVybWluZSB3b3JrIGRpcmVjdG9yeSBmb3IgbW9kdWxlIiwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogQ2xlYW5zIHRoZSB3b3JrIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBtb2R1bGUgb24gdGhpcwotCSAqIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIG1vZHVsZSB3aG9zZSB3b3JrIGRpcmVjdG9yeSBzaG91bGQgYmUgY2xlYW5lZAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjbGVhbiBvcGVyYXRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjbGVhbkNvbnRleHRXb3JrRGlyKElUb21jYXRXZWJNb2R1bGUgbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyByZXN1bHQ7Ci0JCUlQYXRoIGJhc2VQYXRoID0gZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKLQkJSVBhdGggd29ya1BhdGggPSBnZXRUb21jYXRDb25maWd1cmF0aW9uKCkuZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoYmFzZVBhdGgsIG1vZHVsZSk7Ci0JCWlmICh3b3JrUGF0aCAhPSBudWxsKSB7Ci0JCQlGaWxlIHdvcmtEaXIgPSB3b3JrUGF0aC50b0ZpbGUoKTsKLQkJCXJlc3VsdCA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQlpZiAod29ya0Rpci5leGlzdHMoKSAmJiB3b3JrRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlJU3RhdHVzIFtdIHJlc3VsdHMgPSBQdWJsaXNoSGVscGVyLmRlbGV0ZURpcmVjdG9yeSh3b3JrRGlyLCBtb25pdG9yKTsKLQkJCQlNdWx0aVN0YXR1cyBtcyA9IG5ldyBNdWx0aVN0YXR1cyhUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCAiUHJvYmxlbSBvY2N1cnJlZCBkZWxldGluZyB3b3JrIGRpcmVjdG9yeSBmb3IgbW9kdWxlLiIsIG51bGwpOwotCQkJCWlmIChyZXN1bHRzICE9IG51bGwgJiYgcmVzdWx0cy5sZW5ndGggPiAwKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJbXMuYWRkKHJlc3VsdHNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJlc3VsdCA9IG1zOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCAiQ291bGQgbm90IGRldGVybWluZSB3b3JrIGRpcmVjdG9yeSBmb3IgbW9kdWxlIiwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGlyZWN0b3J5IHRvIHdoaWNoIG1vZHVsZXMgc2hvdWxkIGJlIGRlcGxveWVkIGZvcgotCSAqIHRoaXMgc2VydmVyLgotCSAqIAotCSAqIEByZXR1cm4gZnVsbCBwYXRoIHRvIGRlcGxveW1lbnQgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIElQYXRoIGdldFNlcnZlckRlcGxveURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGdldFRvbWNhdFNlcnZlcigpLmdldFNlcnZlckRlcGxveURpcmVjdG9yeSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkaXJlY3RvcnkgdG8gd2hpY2ggdG8gZGVwbG95IGEgbW9kdWxlJ3Mgd2ViIGFwcGxpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIGZ1bGwgcGF0aCB0byBkZXBsb3ltZW50IGRpcmVjdG9yeSBmb3IgdGhlIG1vZHVsZQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRNb2R1bGVEZXBsb3lEaXJlY3RvcnkoSU1vZHVsZSBtb2R1bGUpIHsKLQkJcmV0dXJuIGdldFNlcnZlckRlcGxveURpcmVjdG9yeSgpLmFwcGVuZChtb2R1bGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVtcG9yYXJ5IG1ldGhvZCB0byBoZWxwIHdlYiBzZXJ2aWNlcyB0ZWFtLiBSZXR1cm5zIHRoZSBwYXRoIHRoYXQgdGhlIG1vZHVsZSBpcwotCSAqIHB1Ymxpc2hlZCB0by4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgCi0JICogQHJldHVybiB0aGUgcGF0aCB0aGF0IHRoZSBtb2R1bGUgaXMgcHVibGlzaGVkIHRvIHdoZW4gaW4gdGVzdCBlbnZpcm9ubWVudCBtb2RlLAotCSAqICAgIG9yIG51bGwgaWYgdGhlIG1vZHVsZSBpcyBub3QgYSB3ZWIgbW9kdWxlCi0JICovCi0JcHVibGljIElQYXRoIGdldFB1Ymxpc2hEaXJlY3RvcnkoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCAhPSAxKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gZ2V0TW9kdWxlRGVwbG95RGlyZWN0b3J5KG1vZHVsZVswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlUHVibGlzaFN0YXRlMihJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUpIHsKLQkJc2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSwgc3RhdGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0U2VydmVyTG9jYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXJMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODc2MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXJMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5TZXJ2ZXJMb2NhdG9yRGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0U2VydmVyTG9jYXRvciBleHRlbmRzIFNlcnZlckxvY2F0b3JEZWxlZ2F0ZSB7Ci0JcHVibGljIHZvaWQgc2VhcmNoRm9yU2VydmVycyhTdHJpbmcgaG9zdCwgZmluYWwgSVNlcnZlclNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVG9tY2F0UnVudGltZUxvY2F0b3IuSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgVG9tY2F0UnVudGltZUxvY2F0b3IuSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVGb3VuZChJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUpIHsKLQkJCQlTdHJpbmcgcnVudGltZVR5cGVJZCA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotCQkJCVN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBydW50aW1lVHlwZUlkLnN1YnN0cmluZygwLCBydW50aW1lVHlwZUlkLmxlbmd0aCgpIC0gOCk7Ci0JCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyVHlwZUlkKTsKLQkJCQl0cnkgewotCQkJCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gc2VydmVyVHlwZS5jcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZUlkLCBudWxsLCBydW50aW1lLCBtb25pdG9yKTsKLQkJCQkJbGlzdGVuZXIuc2VydmVyRm91bmQoc2VydmVyKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGNyZWF0ZSBUb21jYXQgc2VydmVyIiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlUb21jYXRSdW50aW1lTG9jYXRvci5zZWFyY2hGb3JSdW50aW1lczIobnVsbCwgbGlzdGVuZXIyLCBtb25pdG9yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3MjBlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBsb2FkIGFuZCBzYXZlIFRvbWNhdCBzZXJ2ZXIgYW5kIGlkZW50aWZ5IGNvbmZpZ3VyYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0U2VydmVyVXRpbCB7Ci0JLyoqCi0JICogVG9tY2F0U2VydmVyU2VyaWFsaXplciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBUb21jYXRTZXJ2ZXJVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGEgPGNvZGU+UGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4gZnJvbSBpdHMgPGNvZGU+U3RyaW5nPC9jb2RlPiBmb3JtLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdldENsYXNzcGF0aEtpbmRGcm9tU3RyaW5nKFN0cmluZyBraW5kU3RyKSB7Ci0JCS8vaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgicHJqIikpCi0JCS8vCXJldHVybiBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1Q7Ci0JCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoInZhciIpKQotCQkJcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU7Ci0JCS8vaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgic3JjIikpCi0JCS8vCXJldHVybiBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRTsKLQkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgibGliIikpCi0JCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gZm9yIHRoZSBraW5kIG9mIGEgY2xhc3MgcGF0aCBlbnRyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRDbGFzc3BhdGhLaW5kVG9TdHJpbmcoaW50IGtpbmQpIHsKLQkJc3dpdGNoIChraW5kKSB7Ci0JCQkvL2Nhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoKLQkJCS8vCXJldHVybiAicHJqIjsKLQkJCS8vY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkvLwlyZXR1cm4gInNyYyI7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6Ci0JCQkJcmV0dXJuICJsaWIiOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKLQkJCQlyZXR1cm4gInZhciI7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gInVua25vd24iOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSdzIGEgY2xhc3NwYXRoIGVudHJ5IG9mIHRoZSBzcGVjaWZpZWQga2luZC4KLQkgKgotCSAqIFJldHVybnMgbnVsbCBpZiB1bmFibGUgdG8gY3JlYXRlIGEgdmFsaWQgZW50cnkuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgY3JlYXRlQ2xhc3NwYXRoRW50cnkoSVBhdGggcGF0aCwgaW50IGtpbmQsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpIHsKLQkJc3dpdGNoIChraW5kKSB7Ci0JCQkvKmNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOgotCQkJCWlmICghcGF0aC5pc0Fic29sdXRlKCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwYXRoKTsqLwotCQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6Ci0JCQkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShwYXRoLCBzb3VyY2VBdHRhY2htZW50UGF0aCwgc291cmNlQXR0YWNobWVudFJvb3RQYXRoKTsKLQkKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRToKLQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShwYXRoLCBzb3VyY2VBdHRhY2htZW50UGF0aCwgc291cmNlQXR0YWNobWVudFJvb3RQYXRoKTsKLQkKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDk3Y2I0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0U291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLndzdC5JTW9kdWxlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLndzdC5Nb2R1bGVUcmF2ZXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIGltcGxlbWVudHMKLQkJSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIHsKLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSVNvdXJjZUNvbnRhaW5lcltdIGNvbXB1dGVTb3VyY2VDb250YWluZXJzKAotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWwuZ2V0U2VydmVyKGNvbmZpZ3VyYXRpb24pOwotCi0JCVNvdXJjZVBhdGhDb21wdXRlclZpc2l0b3IgdmlzaXRvciA9IG5ldyBTb3VyY2VQYXRoQ29tcHV0ZXJWaXNpdG9yKAotCQkJCWNvbmZpZ3VyYXRpb24pOwotCi0JCUlNb2R1bGVbXSBtb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNb2R1bGVUcmF2ZXJzZXIudHJhdmVyc2UobW9kdWxlc1tpXSwgdmlzaXRvciwgbW9uaXRvcik7Ci0JCX0KLQotCQlyZXR1cm4gdmlzaXRvci5nZXRTb3VyY2VDb250YWluZXJzKCk7Ci0JfQotCi0JY2xhc3MgU291cmNlUGF0aENvbXB1dGVyVmlzaXRvciBpbXBsZW1lbnRzIElNb2R1bGVWaXNpdG9yIHsKLQotCQlmaW5hbCBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOwotCi0JCS8qKgotCQkgKiBMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+IG9mIHVucmVzb2x2ZWQgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyaWVzCi0JCSAqLwotCQlMaXN0IHJ1bnRpbWVDbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJU291cmNlUGF0aENvbXB1dGVyVmlzaXRvcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCQl0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHtAaW5oZXJpdERvY30KLQkJICovCi0JCXB1YmxpYyB2b2lkIHZpc2l0V2ViQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkKLQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCXJ1bnRpbWVDbGFzc3BhdGguYWRkKEphdmFSdW50aW1lCi0JCQkJCQkubmV3RGVmYXVsdFByb2plY3RDbGFzc3BhdGhFbnRyeShqYXZhUHJvamVjdCkpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIHtAaW5oZXJpdERvY30KLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0V2ViQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkKLQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICoge0Bpbmhlcml0RG9jfQotCQkgKi8KLQkJcHVibGljIHZvaWQgdmlzaXRBcmNoaXZlQ29tcG9uZW50KElQYXRoIHJ1bnRpbWVQYXRoLCBJUGF0aCB3b3Jrc3BhY2VQYXRoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICoge0Bpbmhlcml0RG9jfQotCQkgKi8KLQkJcHVibGljIHZvaWQgdmlzaXREZXBlbmRlbnRDb21wb25lbnQoSVBhdGggcnVudGltZVBhdGgsCi0JCQkJSVBhdGggd29ya3NwYWNlUGF0aCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqCi0JCSAqIHtAaW5oZXJpdERvY30KLQkJICovCi0JCXB1YmxpYyB2b2lkIHZpc2l0V2ViUmVzb3VyY2UoSVBhdGggcnVudGltZVBhdGgsIElQYXRoIHdvcmtzcGFjZVBhdGgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCS8qKgotCQkgKiB7QGluaGVyaXREb2N9Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCB2aXNpdEVhclJlc291cmNlKElQYXRoIHJ1bnRpbWVQYXRoLCBJUGF0aCB3b3Jrc3BhY2VQYXRoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICoge0Bpbmhlcml0RG9jfQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5kVmlzaXRFYXJDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KQotCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCS8qKgotCQkgKiB7QGluaGVyaXREb2N9Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCB2aXNpdENsYXNzcGF0aEVudHJ5KElQYXRoIHJ0Rm9sZGVyLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCUlTb3VyY2VDb250YWluZXJbXSBnZXRTb3VyY2VDb250YWluZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJcnVudGltZUNsYXNzcGF0aC5hZGRBbGwoQXJyYXlzLmFzTGlzdChKYXZhUnVudGltZQotCQkJCQkuY29tcHV0ZVVucmVzb2x2ZWRTb3VyY2VMb29rdXBQYXRoKGNvbmZpZ3VyYXRpb24pKSk7Ci0JCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IChJUnVudGltZUNsYXNzcGF0aEVudHJ5W10pIHJ1bnRpbWVDbGFzc3BhdGgKLQkJCQkJLnRvQXJyYXkobmV3IElSdW50aW1lQ2xhc3NwYXRoRW50cnlbcnVudGltZUNsYXNzcGF0aC5zaXplKCldKTsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZCA9IEphdmFSdW50aW1lCi0JCQkJCS5yZXNvbHZlU291cmNlTG9va3VwUGF0aChlbnRyaWVzLCBjb25maWd1cmF0aW9uKTsKLQkJCXJldHVybiBKYXZhUnVudGltZS5nZXRTb3VyY2VDb250YWluZXJzKHJlc29sdmVkKTsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRWZXJzaW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFZlcnNpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjZGQ3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFZlcnNpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVMgSW5zdGl0dXRlLCBJbmMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNBUyBJbnN0aXR1dGUsIEluYyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwud3N0Lk1vZHVsZVRyYXZlcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5Ib3N0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC5TZXJ2ZXJJbnN0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIG1ldGhvZHMgdGhhdCBhcmUgdXNlZCBieSBtb3JlIHRoYXQgb25lIHZlcnNpb24KLSAqIG9mIFRvbWNhdC4gIFVzZSBvZiB0aGVzZSBtZXRob2RzIG1ha2VzIGl0IGNsZWFyIHRoYXQgbW9yZSB0aGFuCi0gKiBvbmUgdmVyc2lvbiB3aWxsIGJlIGltcGFjdGVkIGJ5IGNoYW5nZXMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0VmVyc2lvbkhlbHBlciB7Ci0KLQkvKioKLQkgKiBTdGluZyBjb250YWluaW5nIGNvbnRlbnRzIGZvciBhIGRlZmF1bHQgd2ViLnhtbCBmb3IgU2VydmxldCAyLjIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XRUJYTUxfU0VSVkxFVDIyID0gCi0JCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJJU08tODg1OS0xXCI/PlxuIiArCi0JCSI8IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMgXCItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMi8vRU5cIiBcImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1hcHBfMl8yLmR0ZFwiPlxuIiArCi0JCSI8d2ViLWFwcD5cbjwvd2ViLWFwcD4iOwotCi0JLyoqCi0JICogRGVmYXVsdCB3ZWIueG1sIGNvbnRlbnRzIGZvciBhIFNlcnZsZXQgMi4zIHdlYiBhcHBsaWNhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1dFQlhNTF9TRVJWTEVUMjMgPSAKLQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIklTTy04ODU5LTFcIj8+XG4iICsKLQkJIjwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQyBcIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTlwiIFwiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkXCI+XG4iICsKLQkJIjx3ZWItYXBwPlxuPC93ZWItYXBwPiI7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IHdlYi54bWwgY29udGVudHMgZm9yIGEgU2VydmxldCAyLjQgd2ViIGFwcGxpY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0VCWE1MX1NFUlZMRVQyNCA9IAotCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiSVNPLTg4NTktMVwiPz5cbiIgKwotCQkiPHdlYi1hcHAgeG1sbnM9XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiB4c2k6c2NoZW1hTG9jYXRpb249XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkXCIgdmVyc2lvbj1cIjIuNFwiPlxuIiArCi0JCSI8L3dlYi1hcHA+IjsKLQotCS8qKgotCSAqIERlZmF1bHQgd2ViLnhtbCBjb250ZW50cyBmb3IgYSBTZXJ2bGV0IDIuNSB3ZWIgYXBwbGljYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XRUJYTUxfU0VSVkxFVDI1ID0KLQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIklTTy04ODU5LTFcIj8+XG4iICsKLQkJIjx3ZWItYXBwIHhtbG5zPVwiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZVwiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeHNpOnNjaGVtYUxvY2F0aW9uPVwiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl81LnhzZFwiIHZlcnNpb249XCIyLjVcIj5cbiIgKwotCQkiPC93ZWItYXBwPiI7Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgZnJvbSB0aGUgc3BlY2lmaWVkIElucHV0U3RyZWFtIGFuZCByZXR1cm5zCi0JICogdGhlIHJlc3VsdCBhcyBhIFN0cmluZy4gRWFjaCBsaW5lIGlzIHRlcm1pbmF0ZWQgYnkKLQkgKiAmcXVvdDtcbiZxdW90Oy4gIFJldHVybnMgd2hhdGV2ZXIgaXMgcmVhZCByZWdhcmRsZXNzCi0JICogb2YgYW55IGVycm9ycyB0aGF0IG9jY3VycyB3aGlsZSByZWFkaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHJlYW0gSW5wdXRTdHJlYW0gZm9yIHRoZSBjb250ZW50cyB0byBiZSByZWFkCi0JICogQHJldHVybiBjb250ZW50cyByZWFkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBlcnJvciBvY2N1cnMgY2xvc2luZyB0aGUgc3RyZWFtCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUNvbnRlbnRzKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRyeSB7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKSk7Ci0JCQlTdHJpbmcgdGVtcCA9IGJyLnJlYWRMaW5lKCk7Ci0JCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKHRlbXApLmFwcGVuZCgiXG4iKTsKLQkJCQl0ZW1wID0gYnIucmVhZExpbmUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBmaWxlIGNvbnRlbnRzLiIsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGJyICE9IG51bGwpCi0JCQkJYnIuY2xvc2UoKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoaXMgc2VydmVyLiBUaGlzIGRpcmVjdG9yeQotCSAqIGlzIHVzZWQgYXMgdGhlICJiYXNlIiBwcm9wZXJ0eSBmb3IgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gdHMgVG9tY2F0U2VydmVyIGZyb20gd2hpY2ggdG8gZGVyaXZlIHRoZSBiYXNlIGRpcmVjdG9yeSAKLQkgKiBkaXJlY3RvcnkuICBPbmx5IHVzZWQgdG8gZ2V0IHRoZSB0ZW1wIGRpcmVjdG9yeSBpZiBuZWVkZWQuCi0JICogQHJldHVybiBwYXRoIHRvIGJhc2UgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRTdGFuZGFyZEJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyIHRzKSB7Ci0JCWlmICh0cy5pc1Rlc3RFbnZpcm9ubWVudCgpKSB7Ci0JCQlTdHJpbmcgYmFzZURpciA9IHRzLmdldEluc3RhbmNlRGlyZWN0b3J5KCk7Ci0JCQkvLyBJZiB0ZXN0IG1vZGUgYW5kIG5vIGluc3RhbmNlIGRpcmVjdG9yeSBzcGVjaWZpZWQsIHVzZSB0ZW1wb3JhcnkgZGlyZWN0b3J5Ci0JCQlpZiAoYmFzZURpciA9PSBudWxsKSB7Ci0JCQkJVG9tY2F0U2VydmVyQmVoYXZpb3VyIHRzYiA9IChUb21jYXRTZXJ2ZXJCZWhhdmlvdXIpdHMuZ2V0U2VydmVyKCkubG9hZEFkYXB0ZXIoVG9tY2F0U2VydmVyQmVoYXZpb3VyLmNsYXNzLCBudWxsKTsKLQkJCQlyZXR1cm4gdHNiLmdldFRlbXBEaXJlY3RvcnkoKTsKLQkJCX0KLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChiYXNlRGlyKTsKLQkJCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQlJUGF0aCByb290UGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJCQlwYXRoID0gcm9vdFBhdGguYXBwZW5kKHBhdGgpOwotCQkJfQotCQkJLy8gUmV0dXJuIHNwZWNpZmllZCBpbnN0YW5jZSBkaXJlY3RvcnkKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0JCS8vIFJldHVybiBydW50aW1lIHBhdGgKLQkJcmV0dXJuIHRzLmdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN0YXJ0dXAgVk0gYXJndW1lbnRzIGZvciB0aGUgQ2F0YWxpbmEgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YWxsUGF0aCBpbnN0YWxsYXRpb24gcGF0aCBmb3IgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBpbnN0YW5jZVBhdGggaW5zdGFuY2UgcGF0aCBmb3IgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBkZXBsb3lQYXRoIGRlcGxveSBwYXRoIGZvciB0aGUgc2VydmVyCi0JICogQHBhcmFtIGlzVGVzdEVudiB0ZXN0IGVudmlyb25tZW50IGZsYWcKLQkgKiBAcmV0dXJuIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyBWTSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENhdGFsaW5hVk1Bcmd1bWVudHMoSVBhdGggaW5zdGFsbFBhdGgsIElQYXRoIGluc3RhbmNlUGF0aCwgSVBhdGggZGVwbG95UGF0aCwgU3RyaW5nIGVuZG9yc2VkRGlycywgYm9vbGVhbiBpc1Rlc3RFbnYpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoaXNUZXN0RW52KQotCQkJbGlzdC5hZGQoIi1EY2F0YWxpbmEuYmFzZT1cIiIgKyBpbnN0YW5jZVBhdGgudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCWVsc2UgCi0JCQlsaXN0LmFkZCgiLURjYXRhbGluYS5iYXNlPVwiIiArIGluc3RhbGxQYXRoLnRvT1NTdHJpbmcoKSArICJcIiIpOwotCQlsaXN0LmFkZCgiLURjYXRhbGluYS5ob21lPVwiIiArIGluc3RhbGxQYXRoLnRvT1NTdHJpbmcoKSArICJcIiIpOwotCQkvLyBJbmNsdWRlIGEgc3lzdGVtIHByb3BlcnR5IGZvciB0aGUgY29uZmlndXJhYmxlIGRlcGxveSBsb2NhdGlvbgotCQlsaXN0LmFkZCgiLUR3dHAuZGVwbG95PVwiIiArIGRlcGxveVBhdGgudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCWxpc3QuYWRkKCItRGphdmEuZW5kb3JzZWQuZGlycz1cIiIgKyBlbmRvcnNlZERpcnMgKyAiXCIiKTsKLQkJCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQkKLQkvKioKLQkgKiBHZXRzIGEgU2VydmVySW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgc2VydmVyLnhtbCwgU2VydmljZSBuYW1lLAotCSAqIGFuZCBIb3N0IG5hbWUuICBSZXR1cm5zIG51bGwgaWYgc2VydmVyLnhtbCBkb2VzIG5vdCBleGlzdAotCSAqIG9yIGFuIGVycm9yIG9jY3Vycy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyWG1sIHBhdGggdG8gcHJldmlvdXNseSBwdWJsaXNoZWQgc2VydmVyLnhtbCAKLQkgKiBAcGFyYW0gc2VydmljZU5hbWUgbmFtZSBvZiBTZXJ2aWNlIHRvIGJlIHVzZWQgYnkgdGhpcyBpbnN0YW5jZSBvciBudWxsCi0JICogQHBhcmFtIGhvc3ROYW1lIG5hbWUgb2YgSG9zdCB0byBiZSB1c2VkIGJ5IHRoaXMgaW5zdGFuY2Ugb3IgbnVsbAotCSAqIEByZXR1cm4gU2VydmVySW5zdGFuY2UgZm9yIHNwZWNpZmllZCBzZXJ2ZXIueG1sIHVzaW5nIHNwZWNpZmllZAotCSAqIFNlcnZpY2UgYW5kIEhvc3QgbmFtZXMuICBudWxsIGlmIHNlcnZlci54bWwgZG9lcyBub3QgZXhpc3QuCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gc2hvdWxkIG5vdCBvY2N1ciBzaW5jZSBleGlzdGVuY2UgaXMgdGVzdGVkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciByZWFkaW5nIHNlcnZlci54bWwKLQkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHN5bnRheCBlcnJvciBpbiBzZXJ2ZXIueG1sCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJJbnN0YW5jZSBnZXRDYXRhbGluYVNlcnZlckluc3RhbmNlKElQYXRoIHNlcnZlclhtbCwgU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgaG9zdE5hbWUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlTZXJ2ZXJJbnN0YW5jZSBzZXJ2ZXJJbnN0YW5jZSA9IG51bGw7Ci0JCUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCWZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCUZpbGUgc2VydmVyRmlsZSA9IHNlcnZlclhtbC50b0ZpbGUoKTsKLQkJaWYgKHNlcnZlckZpbGUuZXhpc3RzKCkpIHsKLQkJCVNlcnZlciBzZXJ2ZXIgPSAoU2VydmVyKSBmYWN0b3J5LmxvYWREb2N1bWVudChuZXcgRmlsZUlucHV0U3RyZWFtKHNlcnZlckZpbGUpKTsKLQkJCXNlcnZlckluc3RhbmNlID0gbmV3IFNlcnZlckluc3RhbmNlKHNlcnZlciwgc2VydmljZU5hbWUsIGhvc3ROYW1lKTsKLQkJCQotCQkJSVBhdGggY29udGV4dFBhdGggPSBzZXJ2ZXJJbnN0YW5jZS5nZXRDb250ZXh0WG1sRGlyZWN0b3J5KHNlcnZlclhtbC5yZW1vdmVMYXN0U2VnbWVudHMoMSkpOwotCQkJRmlsZSBjb250ZXh0RGlyID0gY29udGV4dFBhdGgudG9GaWxlKCk7Ci0JCQlpZiAoY29udGV4dERpci5leGlzdHMoKSkgewotCQkJCU1hcCBwcm9qZWN0Q29udGV4dHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWxvYWRTZXBhcmF0ZUNvbnRleHRGaWxlcyhjb250ZXh0UGF0aC50b0ZpbGUoKSwgZmFjdG9yeSwgcHJvamVjdENvbnRleHRzKTsKLQkJCQkKLQkJCQkvLyBhZGQgYW55IHNlcGFyYXRlbHkgc2F2ZWQgY29udGV4dHMKLQkJCQlIb3N0IGhvc3QgPSBzZXJ2ZXJJbnN0YW5jZS5nZXRIb3N0KCk7Ci0JCQkJQ29sbGVjdGlvbiBjb250ZXh0cyA9IHByb2plY3RDb250ZXh0cy52YWx1ZXMoKTsKLQkJCQlJdGVyYXRvciBpdGVyID0gY29udGV4dHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpaXRlci5uZXh0KCk7Ci0JCQkJCWhvc3QuaW1wb3J0Tm9kZShjb250ZXh0LmdldEVsZW1lbnROb2RlKCksIHRydWUpOwotCQkJCX0KLQkJCQkvLyBUT0RPIEFkZCBoYW5kbGluZyBmb3Igbm9uLXByb2plY3QgY29udGV4dHMgd2hlbiB0aGVyZSByZW1vdmFsIGNhbiBiZSBhZGRyZXNzZWQgIAotCQkJfQotCQl9Ci0JCXJldHVybiBzZXJ2ZXJJbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXRocyBmb3IgQ29udGV4dHMgdGhhdCBhcmUgYmVpbmcgcmVtb3ZlZCBpbiB0aGUKLQkgKiBuZXh0IHNlcnZlciBwdWJsaXNoLiBSZWFkcyB0aGUgb2xkIHNlcnZlci54bWwgdG8gZGV0ZXJtaW5lCi0JICogd2hhdCBDb250ZXh0cyB3ZXJlIHByZXZpb3VzbHkgc2VydmVyZWQgYW5kIHJldHVybnMgdGhvc2UKLQkgKiB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHNwZWNpZmllZCBsaXN0IG9mIG1vZHVsZXMuCi0JICogCi0JICogQHBhcmFtIG9sZFNlcnZlckluc3RhbmNlIGZvciBzZXJ2ZXIueG1sIGZyb20gcHJldmlvdXMgc2VydmVyIHB1Ymxpc2gKLQkgKiBAcGFyYW0gbW9kdWxlcyBsaXN0IG9mIGN1cnJlbnRseSBhZGRlZCBtb2R1bGVzCi0JICogQHBhcmFtIHJlbW92ZWRDb250ZXh0c01hcCBNYXAgdG8gcmVjZWl2ZSByZW1vdmVkIGNvbnRleHRzIG1hcHBlZCBieSBwYXRoCi0JICogQHBhcmFtIGtlcHRDb250ZXh0c01hcCBNYXAgdG8gcmVjZWl2ZSBrZXB0IGNvbnRleHRzIG1hcHBlZCBieSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFJlbW92ZWRLZXB0Q2F0YWxpbmFDb250ZXh0cyhTZXJ2ZXJJbnN0YW5jZSBvbGRTZXJ2ZXJJbnN0YW5jZSwKLQkJCUxpc3QgbW9kdWxlcywgTWFwIHJlbW92ZWRDb250ZXh0c01hcCwgTWFwIGtlcHRDb250ZXh0c01hcCkgewotCQkvLyBDb2xsZWN0IHBhdGhzIG9mIG9sZCB3ZWIgbW9kdWxlcyBtYW5hZ2VkIGJ5IFdUUAotCQlDb250ZXh0IFtdIGNvbnRleHRzID0gb2xkU2VydmVySW5zdGFuY2UuZ2V0Q29udGV4dHMoKTsKLQkJaWYgKGNvbnRleHRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgc291cmNlID0gY29udGV4dHNbaV0uZ2V0U291cmNlKCk7Ci0JCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5sZW5ndGgoKSA+IDAgKQl7Ci0JCQkJCXJlbW92ZWRDb250ZXh0c01hcC5wdXQoY29udGV4dHNbaV0uZ2V0UGF0aCgpLCBjb250ZXh0c1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gUmVtb3ZlIHBhdGhzIGZvciB3ZWIgbW9kdWxlcyB0aGF0IGFyZSBzdGF5aW5nIGFyb3VuZAotCQlpbnQgc2l6ZSA9IG1vZHVsZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJV2ViTW9kdWxlIG1vZHVsZSA9IChXZWJNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpcmVtb3ZlZENvbnRleHRzTWFwLnJlbW92ZShtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJCWlmIChjb250ZXh0ICE9IG51bGwpCi0JCQkJa2VwdENvbnRleHRzTWFwLnB1dChjb250ZXh0LmdldFBhdGgoKSwgY29udGV4dCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2xlYW51cCBzZXJ2ZXIgaW5zdGFuY2UgbG9jYXRpb24gaW4gcHJlcGFyYXRpb24gZm9yIG5leHQgc2VydmVyIHB1Ymxpc2guCi0JICogVGhpcyBjdXJyZW50bHkgaW52b2x2ZXMgZGVsZXRpbmcgd29yayBkaXJlY3RvcmllcyBmb3IgY3VycmVudGx5Ci0JICogZXhpc3RpbmcgQ29udGV4dHMgd2hpY2ggd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG5leHQgcHVibGlzaC4KLQkgKiBJbiBhZGRpdGlvbiwgQ29udGV4dCBYTUwgZmlsZXMgd2hpY2ggbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGZvciB0aGVzZQotCSAqIENvbnRleHRzIGFyZSBhbHNvIGRlbGV0ZWQuIElmIHJlcXVlc3RlZCwgQ29udGV4dCBYTUwgZmlsZXMgZm9yCi0JICoga2VwdCBDb250ZXh0cyB3aWxsIGJlIGRlbGV0ZWQgc2luY2UgdGhleSB3aWxsIGJlIGtlcHQgaW4gc2VydmVyLnhtbC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBwYXRoIHRvIHNlcnZlciBpbnN0YW5jZSBkaXJlY3RvcnksIGkuZS4gY2F0YWxpbmEuYmFzZQotCSAqIEBwYXJhbSBpbnN0YWxsRGlyIHBhdGggdG8gc2VydmVyIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKG5vdCBjdXJyZW50bHkgdXNlZCkKLQkgKiBAcGFyYW0gcmVtb3ZlS2VwdENvbnRleHRGaWxlcyB0cnVlIGlmIGtlcHQgY29udGV4dHMgc2hvdWxkIGhhdmUgYSBzZXBhcmF0ZQotCSAqICBjb250ZXh0IFhNTCBmaWxlIHJlbW92ZWQgCi0JICogQHBhcmFtIG1vZHVsZXMgbGlzdCBvZiBjdXJyZW50bHkgYWRkZWQgbW9kdWxlcwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciBvciBudWxsCi0JICogQHJldHVybiBNdWx0aVN0YXR1cyBjb250YWluaW5nIHJlc3VsdHMgb2YgdGhlIGNsZWFudXAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNsZWFudXBDYXRhbGluYVNlcnZlcihJUGF0aCBiYXNlRGlyLCBJUGF0aCBpbnN0YWxsRGlyLCBib29sZWFuIHJlbW92ZUtlcHRDb250ZXh0RmlsZXMsIExpc3QgbW9kdWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCU11bHRpU3RhdHVzIG1zID0gbmV3IE11bHRpU3RhdHVzKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmNsZWFudXBTZXJ2ZXJUYXNrLCBudWxsKTsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmNsZWFudXBTZXJ2ZXJUYXNrLCAyMDApOwotCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmRldGVjdGluZ1JlbW92ZWRQcm9qZWN0cyk7Ci0KLQkJCUlQYXRoIHNlcnZlclhtbCA9IGJhc2VEaXIuYXBwZW5kKCJjb25mIikuYXBwZW5kKCJzZXJ2ZXIueG1sIik7Ci0JCQlTZXJ2ZXJJbnN0YW5jZSBvbGRJbnN0YW5jZSA9IFRvbWNhdFZlcnNpb25IZWxwZXIuZ2V0Q2F0YWxpbmFTZXJ2ZXJJbnN0YW5jZShzZXJ2ZXJYbWwsIG51bGwsIG51bGwpOwotCQkJaWYgKG9sZEluc3RhbmNlICE9IG51bGwpIHsKLQkJCQlNYXAgcmVtb3ZlZENvbnRleHRzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlNYXAga2VwdENvbnRleHRzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlUb21jYXRWZXJzaW9uSGVscGVyLmdldFJlbW92ZWRLZXB0Q2F0YWxpbmFDb250ZXh0cyhvbGRJbnN0YW5jZSwgbW9kdWxlcywgcmVtb3ZlZENvbnRleHRzTWFwLCBrZXB0Q29udGV4dHNNYXApOwotCQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQkJaWYgKHJlbW92ZWRDb250ZXh0c01hcC5zaXplKCkgPiAwKSB7Ci0JCQkJCS8vIERlbGV0ZSBjb250ZXh0IGZpbGVzIGFuZCB3b3JrIGRpcmVjdG9yaWVzIGZvciBtYW5hZ2VkIHdlYiBtb2R1bGVzIHRoYXQgaGF2ZSBnb25lIGF3YXkKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwKTsKLQkJCQkJc3ViTW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZGVsZXRpbmdDb250ZXh0RmlsZXNUYXNrLCByZW1vdmVkQ29udGV4dHNNYXAuc2l6ZSgpICogMjAwKTsKLQkJCQkJCi0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkQ29udGV4dHNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlTdHJpbmcgb2xkUGF0aCA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCQkJCQlDb250ZXh0IGN0eCA9IChDb250ZXh0KXJlbW92ZWRDb250ZXh0c01hcC5nZXQob2xkUGF0aCk7Ci0JCQkJCQkKLQkJCQkJCS8vIERlbGV0ZSB0aGUgY29ycmVzcG9uZGluZyBjb250ZXh0IGZpbGUsIGlmIGl0IGV4aXN0cwotCQkJCQkJSVBhdGggY3R4RmlsZVBhdGggPSBvbGRJbnN0YW5jZS5nZXRDb250ZXh0RmlsZVBhdGgoYmFzZURpciwgY3R4KTsKLQkJCQkJCWlmIChjdHhGaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJRmlsZSBjdHhGaWxlID0gY3R4RmlsZVBhdGgudG9GaWxlKCk7Ci0JCQkJCQkJaWYgKGN0eEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkJc3ViTW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0aW5nQ29udGV4dEZpbGUsIGN0eEZpbGUuZ2V0TmFtZSgpKSk7Ci0JCQkJCQkJCWlmIChjdHhGaWxlLmRlbGV0ZSgpKSB7Ci0JCQkJCQkJCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkxlZnRvdmVyIGNvbnRleHQgZmlsZSAiICsgY3R4RmlsZS5nZXROYW1lKCkgKyAiIGRlbGV0ZWQuIik7Ci0JCQkJCQkJCQltcy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5kZWxldGVkQ29udGV4dEZpbGUsIGN0eEZpbGUuZ2V0TmFtZSgpKSwgbnVsbCkpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGRlbGV0ZSBvYnNvbGV0ZSBjb250ZXh0IGZpbGUgIiArIGN0eEZpbGVQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCQkJCQltcy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90RGVsZXRlQ29udGV4dEZpbGUsIGN0eEZpbGVQYXRoLnRvT1NTdHJpbmcoKSksIG51bGwpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXN1Yk1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQkJCQkKLQkJCQkJCS8vIERlbGV0ZSB3b3JrIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbW92ZWQgY29udGV4dCBpZiBpdCBpcyB3aXRoaW4gY29uZkRpci4KLQkJCQkJCS8vIElmIGl0IGlzIG91dHNpZGUgb2YgY29uZkRpciwgYXNzdW1lIHVzZXIgaXMgZ29pbmcgdG8gbWFuYWdlIGl0LgotCQkJCQkJSVBhdGggY3R4V29ya1BhdGggPSBvbGRJbnN0YW5jZS5nZXRDb250ZXh0V29ya0RpcmVjdG9yeShiYXNlRGlyLCBjdHgpOwotCQkJCQkJaWYgKGJhc2VEaXIuaXNQcmVmaXhPZihjdHhXb3JrUGF0aCkpIHsKLQkJCQkJCQlGaWxlIGN0eFdvcmtEaXIgPSBjdHhXb3JrUGF0aC50b0ZpbGUoKTsKLQkJCQkJCQlpZiAoY3R4V29ya0Rpci5leGlzdHMoKSAmJiBjdHhXb3JrRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCQkJSVN0YXR1cyBbXSByZXN1bHRzID0gUHVibGlzaEhlbHBlci5kZWxldGVEaXJlY3RvcnkoY3R4V29ya0RpciwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwKSk7Ci0JCQkJCQkJCWlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBkZWxldGUgd29yayBkaXJlY3RvcnkgIiArIGN0eFdvcmtEaXIuZ2V0UGF0aCgpICsgIiBmb3IgcmVtb3ZlZCBjb250ZXh0ICIgKyBvbGRQYXRoKTsKLQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCW1zLmFkZChyZXN1bHRzW2ldKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJCXN1Yk1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJc3ViTW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCQkJfQotCQkJCQlzdWJNb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCQkKLQkJCQkvLyBJZiByZXF1ZXN0ZWQsIHJlbW92ZSBhbnkgc2VwYXJhdGUgY29udGV4dCBYTUwgZmlsZXMgZm9yIGNvbnRleHRzIGJlaW5nIGtlcHQKLQkJCQlpZiAocmVtb3ZlS2VwdENvbnRleHRGaWxlcyAmJiBrZXB0Q29udGV4dHNNYXAuc2l6ZSgpID4gMCkgewotCQkJCQkvLyBEZWxldGUgY29udGV4dCBmaWxlcyBhbmQgd29yayBkaXJlY3RvcmllcyBmb3IgbWFuYWdlZCB3ZWIgbW9kdWxlcyB0aGF0IGhhdmUgZ29uZSBhd2F5Ci0JCQkJCUlQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMCk7Ci0JCQkJCS8vIFRPRE8gSW1wcm92ZSB0YXNrIG5hbWUKLQkJCQkJc3ViTW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZGVsZXRpbmdDb250ZXh0RmlsZXNUYXNrLCBrZXB0Q29udGV4dHNNYXAuc2l6ZSgpICogMTAwKTsKLQkJCQkJCi0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBrZXB0Q29udGV4dHNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlTdHJpbmcga2VwdFBhdGggPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQkJCQkJQ29udGV4dCBjdHggPSAoQ29udGV4dClrZXB0Q29udGV4dHNNYXAuZ2V0KGtlcHRQYXRoKTsKLQkJCQkJCQotCQkJCQkJLy8gRGVsZXRlIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRleHQgZmlsZSwgaWYgaXQgZXhpc3RzCi0JCQkJCQlJUGF0aCBjdHhGaWxlUGF0aCA9IG9sZEluc3RhbmNlLmdldENvbnRleHRGaWxlUGF0aChiYXNlRGlyLCBjdHgpOwotCQkJCQkJaWYgKGN0eEZpbGVQYXRoICE9IG51bGwpIHsKLQkJCQkJCQlGaWxlIGN0eEZpbGUgPSBjdHhGaWxlUGF0aC50b0ZpbGUoKTsKLQkJCQkJCQlpZiAoY3R4RmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQlzdWJNb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRpbmdDb250ZXh0RmlsZSwgY3R4RmlsZS5nZXROYW1lKCkpKTsKLQkJCQkJCQkJaWYgKGN0eEZpbGUuZGVsZXRlKCkpIHsKLQkJCQkJCQkJCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiTGVmdG92ZXIgY29udGV4dCBmaWxlICIgKyBjdHhGaWxlLmdldE5hbWUoKSArICIgZGVsZXRlZC4iKTsKLQkJCQkJCQkJCW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0ZWRDb250ZXh0RmlsZSwgY3R4RmlsZS5nZXROYW1lKCkpLCBudWxsKSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZGVsZXRlIG9ic29sZXRlIGNvbnRleHQgZmlsZSAiICsgY3R4RmlsZVBhdGgudG9PU1N0cmluZygpKTsKLQkJCQkJCQkJCW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3REZWxldGVDb250ZXh0RmlsZSwgY3R4RmlsZVBhdGgudG9PU1N0cmluZygpKSwgbnVsbCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc3ViTW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCQkJfQotCQkJCQlzdWJNb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBFbHNlIG5vIHNlcnZlci54bWwuICBBc3N1bWUgZmlyc3QgcHVibGlzaCB0byBuZXcgdGVtcCBkaXJlY3RvcnkKLQkJCWVsc2UgewotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQl9Ci0JCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIlNlcnZlciBjbGVhbmVkIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY2xlYW51cCBzZXJ2ZXIgYXQgIiArIGJhc2VEaXIudG9PU1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ2xlYW51cFNlcnZlciwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG1zOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBDYXRhbGluYSBpbnN0YW5jZSBkaXJlY3RvcnkgYXQgdGhlIHNwZWNpZmllZAotCSAqIHBhdGguICBUaGlzIGludm9sdmVzIGNyZWF0aW5nIHRoZSBzZXQgb2Ygc3ViZGlyZWN0b3JpZXMKLQkgKiB1c2VzIGJ5IGEgQ2F0YWxpbmEgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgZGlyZWN0b3J5IGF0IHdoaWNoIHRvIGNyZWF0ZSBDYXRhbGluYSBpbnN0YW5jZQotCSAqIGRpcmVjdG9yaWVzLgotCSAqIEByZXR1cm4gcmVzdWx0IHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUNhdGFsaW5hSW5zdGFuY2VEaXJlY3RvcnkoSVBhdGggYmFzZURpcikgewotCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQ3JlYXRpbmcgcnVudGltZSBkaXJlY3RvcnkgYXQgIiArIGJhc2VEaXIudG9PU1N0cmluZygpKTsKLQkJLy8gVE9ETyBBZGQgbW9yZSBlcnJvciBoYW5kbGluZy4KLQkJLy8gUHJlcGFyZSBhIGNhdGFsaW5hLmJhc2UgZGlyZWN0b3J5IHN0cnVjdHVyZQotCQlGaWxlIHRlbXAgPSBiYXNlRGlyLmFwcGVuZCgiY29uZiIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCQl0ZW1wID0gYmFzZURpci5hcHBlbmQoImxvZ3MiKS50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJdGVtcC5ta2RpcnMoKTsKLQkJdGVtcCA9IGJhc2VEaXIuYXBwZW5kKCJ0ZW1wIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0JCXRlbXAgPSBiYXNlRGlyLmFwcGVuZCgid2ViYXBwcyIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCQl0ZW1wID0gYmFzZURpci5hcHBlbmQoIndvcmsiKS50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJdGVtcC5ta2RpcnMoKTsKLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsJCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzcGVjaWZpZWQgZGVwbG95bWVudCBkaXJlY3RvcnkgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KLQkgKiBJdCB3aWxsIGluY2x1ZGUgYSBkZWZhdWx0IFJPT1Qgd2ViIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgd2ViLnhtbC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVwbG95RGlyIHBhdGggdG8gZGVwbG95bWVudCBkaXJlY3RvcnkgdG8gY3JlYXRlCi0JICogQHBhcmFtIHdlYnhtbCB3ZWIueG1sIGNvbnRleHQgdG8gdXNlIGZvciB0aGUgUk9PVCB3ZWIgYXBwbGljYXRpb24uCi0JICogQHJldHVybiByZXN1bHQgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRGVwbG95bWVudERpcmVjdG9yeShJUGF0aCBkZXBsb3lEaXIsIFN0cmluZyB3ZWJ4bWwpIHsKLQkJaWYgKFRyYWNlLmlzVHJhY2VFbmFibGVkKCkpCi0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkNyZWF0aW5nIGRlcGxveW1lbnQgZGlyZWN0b3J5IGF0ICIgKyBkZXBsb3lEaXIudG9PU1N0cmluZygpKTsKLQotCQkvLyBUT0RPIEFkZCBtb3JlIGVycm9yIGhhbmRsaW5nLgotCQlGaWxlIHRlbXAgPSBkZXBsb3lEaXIudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0KLQkJSVBhdGggdGVtcFBhdGggPSBkZXBsb3lEaXIuYXBwZW5kKCJST09UL1dFQi1JTkYiKTsKLQkJdGVtcCA9IHRlbXBQYXRoLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCQl0ZW1wID0gdGVtcFBhdGguYXBwZW5kKCJ3ZWIueG1sIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkgewotCQkJRmlsZVdyaXRlciBmdzsKLQkJCXRyeSB7Ci0JCQkJZncgPSBuZXcgRmlsZVdyaXRlcih0ZW1wKTsKLQkJCQlmdy53cml0ZSh3ZWJ4bWwpOwotCQkJCWZ3LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlVuYWJsZSB0byBjcmVhdGUgd2ViLnhtbCBmb3IgUk9PVCBjb250ZXh0LiIsIGUpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsJCQotCX0KLQotCS8qKgotCSAqIEFkZCBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gTUVUQS1JTkYvY29udGV4dC54bWwgZmlsZXMKLQkgKiBwcmVzZW50IGluIHByb2plY3RzIHRvIHB1Ymxpc2hlZCBzZXJ2ZXIueG1sLiAgVXNlZCBieQotCSAqIFRvbWNhdCA0LjEsIDUuMCwgYW5kIDUuNSB3aGljaCBzdXBwb3J0IHVzZSBvZiBNRVRBLUlORi9jb250ZXh0LnhtbAotCSAqIGluIHNvbWUgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBhYnNvbHV0ZSBwYXRoIHRvIGNhdGFsaW5hIGluc3RhbmNlIGRpcmVjdG9yeQotCSAqIEBwYXJhbSB3ZWJhcHBzRGlyIGFic29sdXRlIHBhdGggdG8gZGVwbG95bWVudCBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqIEByZXR1cm4gcmVzdWx0IG9mIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBwdWJsaXNoQ2F0YWxpbmFDb250ZXh0Q29uZmlnKElQYXRoIGJhc2VEaXIsIElQYXRoIHdlYmFwcHNEaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQXBwbHkgY29udGV4dCBjb25maWd1cmF0aW9ucyIpOwotCQlJUGF0aCBjb25mRGlyID0gYmFzZURpci5hcHBlbmQoImNvbmYiKTsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnB1Ymxpc2hDb25maWd1cmF0aW9uVGFzaywgMzAwKTsKLQotCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLnB1Ymxpc2hDb250ZXh0Q29uZmlnVGFzayk7Ci0JCQlGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJZmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCVNlcnZlciBwdWJsaXNoZWRTZXJ2ZXIgPSAoU2VydmVyKSBmYWN0b3J5LmxvYWREb2N1bWVudChuZXcgRmlsZUlucHV0U3RyZWFtKGNvbmZEaXIuYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9GaWxlKCkpKTsKLQkJCVNlcnZlckluc3RhbmNlIHB1Ymxpc2hlZEluc3RhbmNlID0gbmV3IFNlcnZlckluc3RhbmNlKHB1Ymxpc2hlZFNlcnZlciwgbnVsbCwgbnVsbCk7Ci0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCQkJCi0JCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJCU11bHRpU3RhdHVzIG1zID0gbmV3IE11bHRpU3RhdHVzKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnB1Ymxpc2hDb250ZXh0Q29uZmlnVGFzaywgbnVsbCk7Ci0JCQlDb250ZXh0IFtdIGNvbnRleHRzID0gcHVibGlzaGVkSW5zdGFuY2UuZ2V0Q29udGV4dHMoKTsKLQkJCWlmIChjb250ZXh0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJCQlDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0c1tpXTsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmNoZWNraW5nQ29udGV4dFRhc2ssCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtjb250ZXh0LmdldFBhdGgoKX0pKTsKLQkJCQkJaWYgKGFkZENhdGFsaW5hQ29udGV4dENvbmZpZyh3ZWJhcHBzRGlyLCBjb250ZXh0LCBtcykpIHsKLQkJCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQlpZiAobW9kaWZpZWQpIHsKLQkJCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuc2F2aW5nQ29udGV4dENvbmZpZ1Rhc2spOwotCQkJCWZhY3Rvcnkuc2F2ZShjb25mRGlyLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvT1NTdHJpbmcoKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIElmIHByb2JsZW0ocykgb2NjdXJyZWQgYWRkaW5nIGNvbnRleHQgY29uZmlndXJhdGlvbnMsIHJldHVybiBlcnJvciBzdGF0dXMKLQkJCWlmIChtcy5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKLQkJCQlyZXR1cm4gbXM7Ci0JCQl9Ci0JCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIlNlcnZlci54bWwgdXBkYXRlZCB3aXRoIGNvbnRleHQueG1sIGNvbmZpZ3VyYXRpb25zIik7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgYXBwbHkgY29udGV4dCBjb25maWd1cmF0aW9ucyB0byBwdWJsaXNoZWQgVG9tY2F0IGNvbmZpZ3VyYXRpb24gZnJvbSAiICsgY29uZkRpci50b09TU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBDb250ZXh0IGlzIGxpbmtlZCB0byBhIHByb2plY3QsIHRyeSB0bwotCSAqIHVwZGF0ZSBpdCB3aXRoIGFueSBjb25maWd1cmF0aW9uIGZyb20gYSBNRVRBLUlORi9jb250ZXh0LnhtbCBmb3VuZAotCSAqIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgd2ViIGFwcGxpY2F0aW9ucyBkaXJlY3RvcnkgYW5kIGNvbnRleHQgZG9jQmFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gd2ViYXBwc0RpciBQYXRoIHRvIHNlcnZlcidzIHdlYiBhcHBsaWNhdGlvbnMgZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRvIHJlY2VpdmUgY29udGV4dC54bWwgY29udGVudHMuCi0JICogQHBhcmFtIG1zIE11bHRpU3RhdHVzIG9iamVjdCB0byByZWNlaXZlIGVycm9yIHN0YXR1cy4KLQkgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBjb250ZXh0IGlzIG1vZGlmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWRkQ2F0YWxpbmFDb250ZXh0Q29uZmlnKElQYXRoIHdlYmFwcHNEaXIsIENvbnRleHQgY29udGV4dCwgTXVsdGlTdGF0dXMgbXMpIHsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQlTdHJpbmcgc291cmNlID0gY29udGV4dC5nZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5sZW5ndGgoKSA+IDAgKQotCQl7Ci0JCQlGaWxlIGRvY0Jhc2UgPSBuZXcgRmlsZShjb250ZXh0LmdldERvY0Jhc2UoKSk7Ci0JCQlpZiAoIWRvY0Jhc2UuaXNBYnNvbHV0ZSgpKQotCQkJCWRvY0Jhc2UgPSBuZXcgRmlsZSh3ZWJhcHBzRGlyLnRvT1NTdHJpbmcoKSwgZG9jQmFzZS5nZXRQYXRoKCkpOwotCQkJdHJ5IHsKLQkJCQlDb250ZXh0IGNvbnRleHRDb25maWcgPSBsb2FkQ2F0YWxpbmFDb250ZXh0Q29uZmlnKGRvY0Jhc2UpOwotCQkJCWlmIChudWxsICE9IGNvbnRleHRDb25maWcpIHsKLQkJCQkJaWYgKGNvbnRleHQuaGFzQ2hpbGROb2RlcygpKQotCQkJCQkJY29udGV4dC5yZW1vdmVDaGlsZHJlbigpOwotCQkJCQljb250ZXh0Q29uZmlnLmNvcHlDaGlsZHJlblRvKGNvbnRleHQpOwotCQkJCQlNYXAgYXR0cnMgPSBjb250ZXh0Q29uZmlnLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJSXRlcmF0b3IgaXRlciA9IGF0dHJzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmICghbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJwYXRoIikKLQkJCQkJCQkJJiYgIW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiZG9jQmFzZSIpCi0JCQkJCQkJCSYmICFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInNvdXJjZSIpKSB7Ci0JCQkJCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZylhdHRycy5nZXQobmFtZSk7Ci0JCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGVWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7Ci0JCQkJaWYgKGNvbnRleHRQYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotCQkJCQljb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoLnN1YnN0cmluZygxKTsKLQkJCQl9Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVhZGluZyBjb250ZXh0LnhtbCBmaWxlIGZvciAiICsgY29udGV4dFBhdGgsIGUpOwotCQkJCUlTdGF0dXMgcyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29udGV4dFhtbCwgY29udGV4dFBhdGgpLCBlKTsKLQkJCQltcy5hZGQocyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQkKLQkvKioKLQkgKiBUcmllcyB0byByZWFkIGEgTUVUQS1JTkYvY29udGV4dC54bWwgZmlsZSByZWxhdGl2ZSB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd2ViIGFwcGxpY2F0aW9uIHBhdGguICBJZiBmb3VuZCwgaXQgY3JlYXRlcyBhIENvbnRleHQgb2JqZWN0Ci0JICogY29udGFpbmluZyB0aGUgY29udGV4dHMgb2YgdGhhdCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBkb2NCYXNlIEZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24KLQkgKiBAcmV0dXJuIENvbnRleHQgZWxlbWVudCBjcmVhdGVkIGZyb20gY29udGV4dC54bWwsIG9yIG51bGwgaWYgbm90IGZvdW5kLgotCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIElmIHRoZXJlIGlzIGEgZXJyb3IgcGFyc2luZyB0aGUgWE1MLiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgdGhlIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGV4dCBsb2FkQ2F0YWxpbmFDb250ZXh0Q29uZmlnKEZpbGUgZG9jQmFzZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlGaWxlIGNvbnRleHRYTUwgPSBuZXcgRmlsZShkb2NCYXNlLCAiTUVUQS1JTkYiICsgRmlsZS5zZXBhcmF0b3IgKyAiY29udGV4dC54bWwiKTsKLQkJaWYgKGNvbnRleHRYTUwuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGNvbnRleHRYTUwpOwotCQkJCUZhY3RvcnkgY3R4RmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQkJY3R4RmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCQlDb250ZXh0IGN0eCA9IChDb250ZXh0KWN0eEZhY3RvcnkubG9hZERvY3VtZW50KGlzKTsKLQkJCQlpcy5jbG9zZSgpOwotCQkJCXJldHVybiBjdHg7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZSwgc2hvdWxkIG5ldmVyIG9jY3VyCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gCX0KLQkKLQkvKioKLQkgKiBJZiBtb2R1bGVzIGFyZSBub3QgYmVpbmcgZGVwbG95ZWQgdG8gdGhlICJ3ZWJhcHBzIiBkaXJlY3RvcnksIHRoZQotCSAqIGNvbnRleHQgZm9yIHRoZSBwdWJsaXNoZWQgbW9kdWxlcyBpcyB1cGRhdGVkIHRvIGNvbnRhaW4gdGhlCi0JICogY29ycmVjdGVkIGRvY0Jhc2UuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgcnVudGltZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBkZXBsb3lEaXIgZGVwbG95bWVudCBkaXJlY3RvcnkgZm9yIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gc2VydmVyIHNlcnZlciBiZWluZyBsb2NhbGl6ZWQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgbG9jYWxpemVDb25maWd1cmF0aW9uKElQYXRoIGJhc2VEaXIsIElQYXRoIGRlcGxveURpciwgVG9tY2F0U2VydmVyIHNlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkxvY2FsaXppbmcgY29uZmlndXJhdGlvbiBhdCAiICsgYmFzZURpcik7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29uZmlndXJhdGlvblRhc2ssIDMwMCk7Ci0KLQkJCUlQYXRoIHNlcnZlclhtbCA9IGJhc2VEaXIuYXBwZW5kKCJjb25mL3NlcnZlci54bWwiKTsKLQkJCUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlmYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJU2VydmVyIHB1Ymxpc2hlZFNlcnZlciA9IChTZXJ2ZXIpZmFjdG9yeS5sb2FkRG9jdW1lbnQoCi0JCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oc2VydmVyWG1sLnRvRmlsZSgpKSk7Ci0JCQlTZXJ2ZXJJbnN0YW5jZSBwdWJsaXNoZWRJbnN0YW5jZSA9IG5ldyBTZXJ2ZXJJbnN0YW5jZShwdWJsaXNoZWRTZXJ2ZXIsIG51bGwsIG51bGwpOwotCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQotCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCi0JCQkvLyBPbmx5IGFkZCByb290IG1vZHVsZSBpZiBydW5uaW5nIGluIGEgdGVzdCBlbnYgKGkuZS4gbm90IG9uIHRoZSBpbnN0YWxsYXRpb24pCi0JCQlib29sZWFuIGFkZFJvb3RXZWJhcHAgPSBzZXJ2ZXIuaXNUZXN0RW52aXJvbm1lbnQoKTsKLQkJCQotCQkJLy8gSWYgbm90IGRlcGxveWluZyB0byAid2ViYXBwcyIsIGNvbnRleHQgZG9jQmFzZSBhdHRyaWJ1dGVzIG5lZWQgdXBkYXRpbmcKLQkJCS8vIFRPRE8gSW1wcm92ZSB0byBjb21wYXJlIHdpdGggYXBwQmFzZSB2YWx1ZSBpbnN0ZWFkIG9mIGhhcmRjb2RlZCAid2ViYXBwcyIKLQkJCWJvb2xlYW4gZGVwbG95aW5nVG9BcHBCYXNlID0gIndlYmFwcHMiLmVxdWFscyhzZXJ2ZXIuZ2V0RGVwbG95RGlyZWN0b3J5KCkpOwotCQkJCi0JCQlNYXAgcGF0aE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkKLQkJCU11bHRpU3RhdHVzIG1zID0gbmV3IE11bHRpU3RhdHVzKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIAotCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hTZXJ2ZXIsIHNlcnZlci5nZXRTZXJ2ZXIoKS5nZXROYW1lKCkpLCBudWxsKTsKLQkJCUNvbnRleHQgW10gY29udGV4dHMgPSBwdWJsaXNoZWRJbnN0YW5jZS5nZXRDb250ZXh0cygpOwotCQkJaWYgKGNvbnRleHRzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUNvbnRleHQgY29udGV4dCA9IGNvbnRleHRzW2ldOwotCQkJCQkvLyBOb3JtYWxpemUgcGF0aCBhbmQgY2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJCQkJU3RyaW5nIHBhdGggPSBjb250ZXh0LmdldFBhdGgoKTsKLQkJCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQkJLy8gU2F2ZSBhIGNvcHkgb2Ygb3JpZ2luYWwgaW4gY2FzZSBpdCdzICIvIgotCQkJCQkJU3RyaW5nIG9yaWdQYXRoID0gcGF0aDsKLQkJCQkJCS8vIE5vcm1hbGl6ZSAiLyIgdG8gIiIKLQkJCQkJCWlmICgiLyIuZXF1YWxzKHBhdGgpKSB7Ci0JCQkJCQkJaWYgKFRyYWNlLmlzVHJhY2VFbmFibGVkKCkpCi0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQ29udGV4dCBwYXRoIGlzIGJlaW5nIGNoYW5nZWQgZnJvbSBcIi9cIiB0byBcIlwiLiIpOwotCQkJCQkJCXBhdGggPSAiIjsKLQkJCQkJCQljb250ZXh0LnNldFBhdGgocGF0aCk7Ci0JCQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCQkJfQotCi0JCQkJCQkvLyBDb250ZXh0IHBhdGhzIHRoYXQgYXJlIHRoZSBzYW1lIG9yIGRpZmZlciBvbmx5IGluIGNhc2UgYXJlIG5vdCBhbGxvd2VkCi0JCQkJCQlTdHJpbmcgbGNQYXRoID0gcGF0aC50b0xvd2VyQ2FzZSgpOwotCQkJCQkJaWYgKCFwYXRoTWFwLmNvbnRhaW5zS2V5KGxjUGF0aCkpIHsKLQkJCQkJCQlwYXRoTWFwLnB1dChsY1BhdGgsIG9yaWdQYXRoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCVN0cmluZyBvdGhlclBhdGggPSAoU3RyaW5nKXBhdGhNYXAuZ2V0KGxjUGF0aCk7Ci0JCQkJCQkJSVN0YXR1cyBzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQkJb3JpZ1BhdGguZXF1YWxzKG90aGVyUGF0aCkgPyBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hQYXRoRHVwLCBvcmlnUGF0aCkgCi0JCQkJCQkJCQkJCTogTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoUGF0aENvbmZsaWN0LCBvcmlnUGF0aCwgb3RoZXJQYXRoKSk7Ci0JCQkJCQkJbXMuYWRkKHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSVN0YXR1cyBzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQlNZXNzYWdlcy5lcnJvclB1Ymxpc2hQYXRoTWlzc2luZyk7Ci0JCQkJCQltcy5hZGQocyk7Ci0JCQkJCX0KLQotCQkJCQkvLyBJZiBkZWZhdWx0IHdlYmFwcCBoYXMgbm90IGJlZW4gZm91bmQsIGNoZWNrIHRoaXMgb25lCi0JCQkJCS8vIFRPRE8gTmVlZCB0byBhZGQgYSByb290IGNvbnRleHQgaWYgZGVwbG95aW5nIHRvIHdlYmFwcHMgYnV0IHdpdGggYXV0by1kZXBsb3kgb2ZmCi0JCQkJCWlmIChhZGRSb290V2ViYXBwICYmICIiLmVxdWFscyhjb250ZXh0LmdldFBhdGgoKSkpIHsKLQkJCQkJCS8vIEEgZGVmYXVsdCB3ZWJhcHAgaXMgYmVpbmcgZGVwbG95ZWQsIGRvbid0IGFkZCBvbmUKLQkJCQkJCWFkZFJvb3RXZWJhcHAgPSBmYWxzZTsKLQkJCQkJfQotCi0JCQkJCS8vIElmIG5vdCBkZXBsb3lpbmcgdG8gYXBwQmFzZSwgY29udmVydCB0byBhYnNvbHV0ZSBwYXRoIHVuZGVyIGRlcGxveSBkaXIKLQkJCQkJaWYgKCFkZXBsb3lpbmdUb0FwcEJhc2UpIHsKLQkJCQkJCVN0cmluZyBzb3VyY2UgPSBjb250ZXh0LmdldFNvdXJjZSgpOwotCQkJCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5sZW5ndGgoKSA+IDAgKQl7Ci0JCQkJCQkJY29udGV4dC5zZXREb2NCYXNlKGRlcGxveURpci5hcHBlbmQoY29udGV4dC5nZXREb2NCYXNlKCkpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gSWYgZXJyb3JzIGFyZSBwcmVzZW50LCByZXR1cm4gc3RhdHVzCi0JCQlpZiAoIW1zLmlzT0soKSkKLQkJCQlyZXR1cm4gbXM7Ci0JCQkKLQkJCWlmIChhZGRSb290V2ViYXBwKSB7Ci0JCQkJLy8gQWRkIGEgY29udGV4dCBmb3IgdGhlIGRlZmF1bHQgd2ViYXBwCi0JCQkJQ29udGV4dCByb290Q29udGV4dCA9IHB1Ymxpc2hlZEluc3RhbmNlLmNyZWF0ZUNvbnRleHQoMCk7Ci0JCQkJcm9vdENvbnRleHQuc2V0UGF0aCgiIik7Ci0JCQkJcm9vdENvbnRleHQuc2V0RG9jQmFzZShkZXBsb3lEaXIuYXBwZW5kKCJST09UIikudG9PU1N0cmluZygpKTsKLQkJCQlyb290Q29udGV4dC5zZXRSZWxvYWRhYmxlKCJmYWxzZSIpOwotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkKLQkJCWlmIChtb2RpZmllZCkgewotCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5zYXZpbmdDb250ZXh0Q29uZmlnVGFzayk7Ci0JCQkJZmFjdG9yeS5zYXZlKHNlcnZlclhtbC50b09TU3RyaW5nKCkpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCWlmIChUcmFjZS5pc1RyYWNlRW5hYmxlZCgpKQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQ29udGV4dCBkb2NCYXNlIHNldHRpbmdzIHVwZGF0ZWQgaW4gc2VydmVyLnhtbC4iKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9jYWxpemUgc2VydmVyIGNvbmZpZ3VyYXRpb24gcHVibGlzaGVkIHRvICIgKyBiYXNlRGlyLnRvT1NTdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgY3VzdG9tIGxvYWRlciBqYXIgcmVxdWlyZWQgdG8gc2VydmUgcHJvamVjdHMgd2l0aG91dAotCSAqIHB1Ymxpc2hpbmcgdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGRlc3REaXIgZGVzdGluYXRpb24gZGlyZWN0b3J5IGZvciB0aGUgbG9hZGVyIGphcgotCSAqIEBwYXJhbSBzZXJ2ZXJJZCBJRCBvZiB0aGUgc2VydmVyIHJlY2VpdmluZyB0aGUgamFyCi0JICogQHJldHVybiByZXN1bHQgb2YgY29weSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY29weUxvYWRlckphcihJUGF0aCBkZXN0RGlyLCBTdHJpbmcgc2VydmVySWQpIHsKLSAgICAgICAgU3RyaW5nIGxvYWRlckphciA9ICIvIiArIHNlcnZlcklkICsgIi5sb2FkZXIuamFyIjsKLSAgICAgICAgVVJMIGluc3RhbGxVUkwgPSBUb21jYXRQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeShsb2FkZXJKYXIpOwotICAgICAgICBpZiAoaW5zdGFsbFVSTCA9PSBudWxsKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJMb2FkZXIgamFyIG5vdCBmb3VuZCBmb3Igc2VydmVyIElEICIgKyBzZXJ2ZXJJZCk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hMb2FkZXJKYXJOb3RGb3VuZCwgc2VydmVySWQpLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICAJCi0gICAgICAgIFVSTCBsb2NhbFVSTDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvY2FsVVJMID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKGluc3RhbGxVUkwpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY29udmVydCAiICsgaW5zdGFsbFVSTC50b1N0cmluZygpICsgIiB0byBmaWxlIFVSTDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaFVSTENvbnZlcnQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7aW5zdGFsbFVSTC50b1N0cmluZygpLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLSAgICAgICAgfQotCQkKLSAgICAgICAgZGVzdERpci50b0ZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBGaWxlVXRpbC5jb3B5RmlsZShsb2NhbFVSTCwgZGVzdERpci5hcHBlbmQobG9hZGVySmFyKS50b1N0cmluZygpKTsgICAgICAgIAotICAgICAgICAKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JLyoqCi0JICogVHJpZXMgdG8gZGVsZXRlIHRoZSBjdXN0b20gbG9hZGVyIGphciBhZGRlZCB0byBzdXBwb3J0IHNlcnZpbmcgcHJvamVjdHMgZGlyZWN0bHkKLQkgKiB3aXRob3V0IHB1Ymxpc2hpbmcuICBSZXR1cm5zIGEgd2FybmluZyBpZiBub3Qgc3VjY2Vzc2Z1bC4KLQkgKiAgCi0JICogQHBhcmFtIGRlc3REaXIgZGVzdGluYXRpb24gZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxvYWRlciBqYXIKLQkgKiBAcGFyYW0gc2VydmVySWQgSUQgb2YgdGhlIHNlcnZlciBmcm9tIHdoaWNoIHRvIGRlbGV0ZSB0aGUgamFyCi0JICogQHJldHVybiByZXN1bHQgb2YgY29weSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgcmVtb3ZlTG9hZGVySmFyKElQYXRoIGRlc3REaXIsIFN0cmluZyBzZXJ2ZXJJZCkgewotICAgICAgICBTdHJpbmcgbG9hZGVySmFyID0gIi8iICsgc2VydmVySWQgKyAiLmxvYWRlci5qYXIiOwotICAgICAgICBGaWxlIGxvYWRlckZpbGUgPSBkZXN0RGlyLmFwcGVuZChsb2FkZXJKYXIpLnRvRmlsZSgpOwotICAgICAgICAvLyBJZiBsb2FkZXIgamFyIGV4aXN0cyBidXQgaXMgbm90IHN1Y2Nlc3NmdWxseSBkZWxldGVkLCByZXR1cm4gd2FybmluZwotICAgICAgICBpZiAobG9hZGVyRmlsZS5leGlzdHMoKSAmJiAhbG9hZGVyRmlsZS5kZWxldGUoKSkKLSAgICAgICAgCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwKLSAgICAgICAgCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoQ2FudERlbGV0ZUxvYWRlckphciwgbG9hZGVyRmlsZS5nZXRQYXRoKCkpLCBudWxsKTsKLQotICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JLyoqCi0JICogVXBkYXRlcyB0aGUgY2F0YWxpbmEucHJvcGVydGllcyBmaWxlIHRvIGluY2x1ZGUgYSBleHRyYSBlbnRyeSBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgbG9hZGVyIHByb3BlcnR5IHRvIHBpY2t1cCB0aGUgbG9hZGVyIGphci4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZURpciBkaXJlY3Rvcnkgd2hlcmUgdGhlIENhdGFsaW5hIGluc3RhbmNlIGlzIGZvdW5kCi0JICogQHBhcmFtIGphckxvYyBsb2NhdGlvbiBvZiBsb2FkZXIgamFyIHJlbGF0aXZlIHRvIGJhc2VEaXIKLQkgKiBAcGFyYW0gbG9hZGVyIGxvYWRlciBpbiBjYXRhbGluYS5wcm9wZXJ0aWVzIHRvIHVzZQotCSAqIEByZXR1cm4gcmVzdWx0IG9mIHVwZGF0ZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdXBkYXRlUHJvcGVydGllc1RvU2VydmVEaXJlY3RseShJUGF0aCBiYXNlRGlyLCBTdHJpbmcgamFyTG9jLCBTdHJpbmcgbG9hZGVyKSB7Ci0gICAgICAgICAgICBGaWxlIGNhdGFsaW5hUHJvcGVydGllcyA9IGJhc2VEaXIuYXBwZW5kKAotICAgICAgICAgICAgICAgICAgICAiY29uZi9jYXRhbGluYS5wcm9wZXJ0aWVzIikudG9GaWxlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgCUNhdGFsaW5hUHJvcGVydGllc1V0aWwuYWRkR2xvYmFsQ2xhc3NwYXRoKGNhdGFsaW5hUHJvcGVydGllcywgbG9hZGVyLAotICAgICAgICAgICAgCQkJbmV3IFN0cmluZ1tdIHsgIiR7Y2F0YWxpbmEuYmFzZX0vIiArIGphckxvYyArICIvKi5qYXIiIH0pOwotCi0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixUb21jYXRQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoQ2F0YWxpbmFQcm9wcywgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgQ29udGV4dHMgdG8gc2VydmUgd2ViIHByb2plY3RzIGRpcmVjdGx5LgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIGRpcmVjdG9yeSB3aGVyZSB0aGUgQ2F0YWxpbmEgaW5zdGFuY2UgaXMgZm91bmQKLQkgKiBAcGFyYW0gbG9hZGVyIG5hbWUgb2YgdGhlIGNhdGFsaW5hLnByb3BlcnRpZXMgbG9hZGVyIHRvIHVzZSBmb3IgZ2xvYmFsCi0JICogY2xhc3NwYXRoIGVudHJpZXMKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiB1cGRhdGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHVwZGF0ZUNvbnRleHRzVG9TZXJ2ZURpcmVjdGx5KElQYXRoIGJhc2VEaXIsIFN0cmluZyBsb2FkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCUlQYXRoIGNvbmZEaXIgPSBiYXNlRGlyLmFwcGVuZCgiY29uZiIpOwotCQlJUGF0aCBzZXJ2ZXJYbWwgPSBjb25mRGlyLmFwcGVuZCgic2VydmVyLnhtbCIpOwotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMucHVibGlzaENvbmZpZ3VyYXRpb25UYXNrLCAzMDApOwotCi0JCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMucHVibGlzaENvbnRleHRDb25maWdUYXNrKTsKLQkJCUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlmYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJU2VydmVyIHB1Ymxpc2hlZFNlcnZlciA9IChTZXJ2ZXIpIGZhY3RvcnkubG9hZERvY3VtZW50KG5ldyBGaWxlSW5wdXRTdHJlYW0oc2VydmVyWG1sLnRvRmlsZSgpKSk7Ci0JCQlTZXJ2ZXJJbnN0YW5jZSBwdWJsaXNoZWRJbnN0YW5jZSA9IG5ldyBTZXJ2ZXJJbnN0YW5jZShwdWJsaXNoZWRTZXJ2ZXIsIG51bGwsIG51bGwpOwotCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQotCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCi0JCQkvLyBjYXJlIGFib3V0IHRvcC1sZXZlbCBtb2R1bGVzIG9ubHkKLQkJCVRvbWNhdFB1Ymxpc2hNb2R1bGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgVG9tY2F0UHVibGlzaE1vZHVsZVZpc2l0b3IoCi0JCQkJCWJhc2VEaXIsIHB1Ymxpc2hlZEluc3RhbmNlLCBsb2FkZXIpOwotCQkJQ29udGV4dCBbXSBjb250ZXh0cyA9IHB1Ymxpc2hlZEluc3RhbmNlLmdldENvbnRleHRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG1vZHVsZUlkID0gY29udGV4dHNbaV0uZ2V0U291cmNlKCk7Ci0JCQkJaWYgKG1vZHVsZUlkICE9IG51bGwgJiYgbW9kdWxlSWQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCUlNb2R1bGUgbW9kdWxlID0gU2VydmVyVXRpbC5nZXRNb2R1bGUobW9kdWxlSWQpOwotCQkJCQlNb2R1bGVUcmF2ZXJzZXIudHJhdmVyc2UobW9kdWxlLCB2aXNpdG9yLCBtb25pdG9yKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG1vZGlmaWVkKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLnNhdmluZ0NvbnRleHRDb25maWdUYXNrKTsKLQkJCQlmYWN0b3J5LnNhdmUoc2VydmVyWG1sLnRvT1NTdHJpbmcoKSk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCQkJaWYgKFRyYWNlLmlzVHJhY2VFbmFibGVkKCkpCi0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJDb250ZXh0IGRvY0Jhc2Ugc2V0dGluZ3MgdXBkYXRlZCBpbiBzZXJ2ZXIueG1sLiIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IG1vZGlmeSBjb250ZXh0IGNvbmZpZ3VyYXRpb25zIHRvIHNlcnZlIGRpcmVjdGx5IGZvciBUb21jYXQgY29uZmlndXJhdGlvbiAiICsgY29uZkRpci50b09TU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQdWJsaXNoQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQkvKioKLQkgKiBNb3ZlcyBjb250ZXh0cyBvdXQgb2YgY3VycmVudCBwdWJsaXNoZWQgc2VydmVyLnhtbCBhbmQgaW50byBpbmRpdmlkdWFsCi0JICogY29udGV4dCBYTUwgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIGJhc2VEaXIgZGlyZWN0b3J5IHdoZXJlIHRoZSBDYXRhbGluYSBpbnN0YW5jZSBpcyBmb3VuZAotCSAqIEBwYXJhbSBub1BhdGggdHJ1ZSBpZiBwYXRoIGF0dHJpYnV0ZSBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjb250ZXh0Ci0JICogQHBhcmFtIHNlcnZlclN0b3BwZWQgdHJ1ZSBpZiB0aGUgc2VydmVyIGlzIHN0b3BwZWQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgbW92ZUNvbnRleHRzVG9TZXBhcmF0ZUZpbGVzKElQYXRoIGJhc2VEaXIsIGJvb2xlYW4gbm9QYXRoLCBib29sZWFuIHNlcnZlclN0b3BwZWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUGF0aCBjb25mRGlyID0gYmFzZURpci5hcHBlbmQoImNvbmYiKTsKLQkJSVBhdGggc2VydmVyWG1sID0gY29uZkRpci5hcHBlbmQoInNlcnZlci54bWwiKTsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnB1Ymxpc2hDb25maWd1cmF0aW9uVGFzaywgMzAwKTsKLQotCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLnB1Ymxpc2hDb250ZXh0Q29uZmlnVGFzayk7Ci0JCQlGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJZmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCVNlcnZlciBwdWJsaXNoZWRTZXJ2ZXIgPSAoU2VydmVyKSBmYWN0b3J5LmxvYWREb2N1bWVudChuZXcgRmlsZUlucHV0U3RyZWFtKHNlcnZlclhtbC50b0ZpbGUoKSkpOwotCQkJU2VydmVySW5zdGFuY2UgcHVibGlzaGVkSW5zdGFuY2UgPSBuZXcgU2VydmVySW5zdGFuY2UocHVibGlzaGVkU2VydmVyLCBudWxsLCBudWxsKTsKLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0KLQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQotCQkJSG9zdCBob3N0ID0gcHVibGlzaGVkSW5zdGFuY2UuZ2V0SG9zdCgpOwotCQkJQ29udGV4dFtdIHd0cENvbnRleHRzID0gcHVibGlzaGVkSW5zdGFuY2UuZ2V0Q29udGV4dHMoKTsKLQkJCWlmICh3dHBDb250ZXh0cyAhPSBudWxsICYmIHd0cENvbnRleHRzLmxlbmd0aCA+IDApIHsKLQkJCQlJUGF0aCBjb250ZXh0UGF0aCA9IHB1Ymxpc2hlZEluc3RhbmNlLmdldENvbnRleHRYbWxEaXJlY3Rvcnkoc2VydmVyWG1sLnJlbW92ZUxhc3RTZWdtZW50cygxKSk7Ci0JCQkJRmlsZSBjb250ZXh0RGlyID0gY29udGV4dFBhdGgudG9GaWxlKCk7Ci0JCQkJaWYgKCFjb250ZXh0RGlyLmV4aXN0cygpKSB7Ci0JCQkJCWNvbnRleHREaXIubWtkaXJzKCk7Ci0JCQkJfQotCQkJCS8vIFByb2Nlc3MgaW4gcmV2ZXJzZSBvcmRlciwgc2luY2UgY29udGV4dHMgbWF5IGJlIHJlbW92ZWQKLQkJCQlmb3IgKGludCBpID0gd3RwQ29udGV4dHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJQ29udGV4dCBjb250ZXh0ID0gd3RwQ29udGV4dHNbaV07Ci0JCQkJCS8vIFRPRE8gSGFuZGxlIG5vbi1wcm9qZWN0IGNvbnRleHRzIHdoZW4gdGhlaXIgcmVtb3ZhbCBjYW4gYmUgYWRkcmVzc2VkCi0JCQkJCWlmIChjb250ZXh0LmdldFNvdXJjZSgpID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJCi0JCQkJCVN0cmluZyBuYW1lID0gY29udGV4dC5nZXRQYXRoKCk7Ci0JCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIi8iKSkgewotCQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJCQl9Ci0JCQkJCS8vIElmIHRoZSBkZWZhdWx0IGNvbnRleHQsIGFkanVzdCB0aGUgZmlsZSBuYW1lCi0JCQkJCWlmIChuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCW5hbWUgPSAiUk9PVCI7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIFRPRE8gRGV0ZXJtaW5lIGNpcmN1bXN0YW5jZXMsIGlmIGFueSwgd2hlcmUgc2V0dGluZyBhbnRpUmVzb3VyY2VMb2NraW5nIHRydWUgY2FuIGNhdXNlIHRoZSBvcmlnaW5hbCBkb2NCYXNlIGNvbnRlbnQgdG8gYmUgZGVsZXRlZC4KLQkJCQkJaWYgKEJvb2xlYW4udmFsdWVPZihjb250ZXh0LmdldEF0dHJpYnV0ZVZhbHVlKCJhbnRpUmVzb3VyY2VMb2NraW5nIikpLmJvb2xlYW5WYWx1ZSgpKQotCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGVWYWx1ZSgiYW50aVJlc291cmNlTG9ja2luZyIsICJmYWxzZSIpOwotCQkJCQkKLQkJCQkJRmlsZSBjb250ZXh0RmlsZSA9IG5ldyBGaWxlKGNvbnRleHREaXIsIG5hbWUgKyAiLnhtbCIpOwotCQkJCQlDb250ZXh0IGV4aXN0aW5nQ29udGV4dCA9IGxvYWRDb250ZXh0RmlsZShjb250ZXh0RmlsZSk7Ci0JCQkJCS8vIElmIHNlcnZlciBpcyBzdG9wcGVkIG9yIGlmIGNvbnRleHRzIGFyZSBub3QgdGhlIGVxdWl2YWxlbnQsIHdyaXRlIHRoZSBjb250ZXh0IGZpbGUKLQkJCQkJaWYgKHNlcnZlclN0b3BwZWQgfHwgIWNvbnRleHQuaXNFcXVpdmFsZW50KGV4aXN0aW5nQ29udGV4dCkpIHsKLQkJCQkJCS8vIElmIHJlcXVlc3RlZCwgcmVtb3ZlIHBhdGggYXR0cmlidXRlCi0JCQkJCQlpZiAobm9QYXRoKQotCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCJwYXRoIik7Ci0JCQkJCQkKLQkJCQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKTsKLQkJCQkJCURvY3VtZW50IGNvbnRleHREb2MgPSBidWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0JCQkJCQljb250ZXh0RG9jLmFwcGVuZENoaWxkKGNvbnRleHREb2MuaW1wb3J0Tm9kZShjb250ZXh0LmdldEVsZW1lbnROb2RlKCksIHRydWUpKTsKLQkJCQkJCVhNTFV0aWwuc2F2ZShjb250ZXh0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgY29udGV4dERvYyk7Ci0JCQkJCX0KLQotCQkJCQlob3N0LnJlbW92ZUVsZW1lbnQoIkNvbnRleHQiLCBpKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQlpZiAobW9kaWZpZWQpIHsKLQkJCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuc2F2aW5nQ29udGV4dENvbmZpZ1Rhc2spOwotCQkJCWZhY3Rvcnkuc2F2ZShzZXJ2ZXJYbWwudG9PU1N0cmluZygpKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQlpZiAoVHJhY2UuaXNUcmFjZUVuYWJsZWQoKSkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkNvbnRleHQgZG9jQmFzZSBzZXR0aW5ncyB1cGRhdGVkIGluIHNlcnZlci54bWwuIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbW9kaWZ5IGNvbnRleHQgY29uZmlndXJhdGlvbnMgdG8gc2VydmUgZGlyZWN0bHkgZm9yIFRvbWNhdCBjb25maWd1cmF0aW9uICIgKyBjb25mRGlyLnRvT1NTdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZFNlcGFyYXRlQ29udGV4dEZpbGVzKEZpbGUgY29udGV4dERpciwgRmFjdG9yeSBmYWN0b3J5LCBNYXAgcHJvamVjdENvbnRleHRzKSB7Ci0JCUZpbGVbXSBjb250ZXh0RmlsZXMgPSBjb250ZXh0RGlyLmxpc3RGaWxlcyhuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0JCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhtbCIpOwotCQkJfQotCQl9KTsKLQotCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbnRleHRGaWxlcy5sZW5ndGg7IGorKykgewotCQkJRmlsZSBjdHggPSBjb250ZXh0RmlsZXNbal07Ci0KLQkJCUNvbnRleHQgY29udGV4dCA9IGxvYWRDb250ZXh0RmlsZShjdHgpOwotCQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJCS8vIFRPRE8gSGFuZGxlIG5vbi1wcm9qZWN0IGNvbnRleHRzIHdoZW4gdGhlaXIgcmVtb3ZhbCBjYW4gYmUgYWRkcmVzc2VkCi0JCQkJU3RyaW5nIG1lbWVudG8gPSBjb250ZXh0LmdldFNvdXJjZSgpOwotCQkJCWlmIChtZW1lbnRvICE9IG51bGwpIHsKLQkJCQkJcHJvamVjdENvbnRleHRzLnB1dChjdHgsIGNvbnRleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb250ZXh0IGxvYWRDb250ZXh0RmlsZShGaWxlIGNvbnRleHRGaWxlKSB7Ci0JCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOwotCQlDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCQlpZiAoY29udGV4dEZpbGUgIT0gbnVsbCAmJiBjb250ZXh0RmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJCWZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQkJZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb250ZXh0RmlsZSk7Ci0JCQkJY29udGV4dCA9IChDb250ZXh0KWZhY3RvcnkubG9hZERvY3VtZW50KGZpcyk7Ci0JCQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOwotCQkJCQkvLyBJZiBwYXRoIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCBkZXJpdmUgZnJvbSBmaWxlIG5hbWUKLQkJCQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gY29udGV4dEZpbGUuZ2V0TmFtZSgpOwotCQkJCQkJcGF0aCA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sZW5ndGgoKSAtICIueG1sIi5sZW5ndGgoKSk7Ci0JCQkJCQlpZiAoIlJPT1QiLmVxdWFscyhwYXRoKSkKLQkJCQkJCQlwYXRoID0gIiI7Ci0JCQkJCQljb250ZXh0LnNldFBhdGgoIi8iICsgcGF0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIG1heSBiZSBhIHNwdXJpb3VzIHhtbCBmaWxlIGluIHRoZSBob3N0IGRpcj8KLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIlVuYWJsZSB0byByZWFkIGNvbnRleHQgIgotCQkJCQkJKyBjb250ZXh0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWZpcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwMDJjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05GSUcgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VWRVJFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVNUID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVIgPSA0OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxldmVsTmFtZXMgPSBuZXcgU3RyaW5nW10gewotCQkiQ09ORklHICAgIiwgIldBUk5JTkcgICIsICJTRVZFUkUgICAiLCAiRklORVIgICAgIiwgIkZJTkVTVCAgICJ9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzcGFjZXIgPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoImRkL01NL3l5IEhIOm1tLnNzLlNTUyIpOwotCQotCXByb3RlY3RlZCBzdGF0aWMgaW50IHBsdWdpbkxlbmd0aCA9IC0xOwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgewotCQlUcmFjZS50cmFjZShsZXZlbCwgcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKCFUb21jYXRQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCS8qU3lzdGVtLm91dC5wcmludGxuKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQgKyAiICIgKyBzKTsKLQkJaWYgKHQgIT0gbnVsbCkKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ki8KLQkJdHJhY2UoVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgbGV2ZWwsIHMsIHQpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgYSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgcGx1Z2luSWQsIGludCBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmIChwbHVnaW5JZCA9PSBudWxsIHx8IHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIVRvbWNhdFBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHBsdWdpbklkKTsKLQkJaWYgKHBsdWdpbklkLmxlbmd0aCgpID4gcGx1Z2luTGVuZ3RoKQotCQkJcGx1Z2luTGVuZ3RoID0gcGx1Z2luSWQubGVuZ3RoKCk7Ci0JCWVsc2UgaWYgKHBsdWdpbklkLmxlbmd0aCgpIDwgcGx1Z2luTGVuZ3RoKQotCQkJc2IuYXBwZW5kKHNwYWNlci5zdWJzdHJpbmcoMCwgcGx1Z2luTGVuZ3RoIC0gcGx1Z2luSWQubGVuZ3RoKCkpKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChsZXZlbE5hbWVzW2xldmVsXSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQoc2RmLmZvcm1hdChuZXcgRGF0ZSgpKSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQocyk7Ci0JCS8vUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oU2VydmVyQ29yZS5QTFVHSU5fSUQgKyAiLyIgKyAicmVzb3VyY2VzIik7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBzdGF0ZSBvZiBkZWJ1ZyBmbGFnIGZvciB0aGUgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBpcyBlbmFibGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2VFbmFibGVkKCkgewotCQlyZXR1cm4gVG9tY2F0UGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1ZlcmlmeVJlc291cmNlU3BlYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9WZXJpZnlSZXNvdXJjZVNwZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmMjBkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1ZlcmlmeVJlc291cmNlU3BlYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBWZXJpZnlSZXNvdXJjZVNwZWMgewotCXByaXZhdGUgU3RyaW5nIHNwZWM7Ci0JcHJpdmF0ZSBTdHJpbmcgW10gcGF0aHM7Ci0JcHJpdmF0ZSBTdHJpbmcgb3RoZXJOYW1lczsKLQlwcml2YXRlIGludCBsYXN0U3VjY2VzcyA9IC0xOwotCXByaXZhdGUgSVN0YXR1cyBlcnJvclN0YXR1czsKLQkKLQlwdWJsaWMgVmVyaWZ5UmVzb3VyY2VTcGVjKFN0cmluZyBzcGVjKSB7Ci0JCXRoaXMuc3BlYyA9IHNwZWM7Ci0JCWludCBhbHRJbmRleCA9IHNwZWMuaW5kZXhPZignfCcpOwotCQlpZiAoYWx0SW5kZXggPCAwKSB7Ci0JCQlwYXRocyA9IG5ldyBTdHJpbmdbMV07Ci0JCQlwYXRoc1swXSA9IHNwZWMudHJpbSgpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGZpbGUxID0gc3BlYy5zdWJzdHJpbmcoMCwgYWx0SW5kZXgpLnRyaW0oKTsKLQkJCVN0cmluZyBhbHRTcGVjID0gc3BlYy5zdWJzdHJpbmcoYWx0SW5kZXggKyAxKTsKLQkJCWlmIChhbHRTcGVjLmxlbmd0aCgpID4gMCkgewotCQkJCWludCBpbmRleCA9IGZpbGUxLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCQkJU3RyaW5nIGRpciA9IGluZGV4ID49IDAgPyBmaWxlMS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSA6ICIiOwotCQkJCVN0cmluZyBbXSBhbHROYW1lcyA9IGFsdFNwZWMuc3BsaXQoIlxcfCIpOwotCQkJCXBhdGhzID0gbmV3IFN0cmluZ1thbHROYW1lcy5sZW5ndGggKyAxXTsKLQkJCQlwYXRoc1swXSA9IGZpbGUxOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWx0TmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJcGF0aHNbaSArIDFdID0gZGlyICsgYWx0TmFtZXNbaV0udHJpbSgpOwotCQkJCX0KLQkJCQlvdGhlck5hbWVzID0gYWx0U3BlYy5yZXBsYWNlKCd8JywgJywnKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhdGhzID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXRoc1swXSA9IGZpbGUxOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgW10gZ2V0UGF0aHMoKSB7Ci0JCXJldHVybiBwYXRoczsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgY2hlY2tSZXNvdXJjZShTdHJpbmcgaW5zdGFsbERpcikgewotCQlpZiAobGFzdFN1Y2Nlc3MgPj0gMCApIHsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGluc3RhbGxEaXIsIHBhdGhzW2xhc3RTdWNjZXNzXSk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSBsYXN0U3VjY2VzcykgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGluc3RhbGxEaXIsIHBhdGhzW2ldKTsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQlsYXN0U3VjY2VzcyA9IGk7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBSZXNvdXJjZSB3YXMgbm90IGZvdW5kLCByZXR1cm4gZXJyb3Igc3RhdHVzCi0JCWlmIChlcnJvclN0YXR1cyA9PSBudWxsKSB7Ci0JCQkvLyBDb25zdHJ1Y3QgZXJyb3Igc3RhdHVzIG9uIGZpcnN0IHVzZQotCQkJaWYgKHBhdGhzLmxlbmd0aCA9PSAxIHx8IG90aGVyTmFtZXMgPT0gbnVsbCkgewotCQkJCWVycm9yU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckluc3RhbGxEaXJNaXNzaW5nRmlsZSwgcGF0aHNbMF0pLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBhdGhzLmxlbmd0aCA9PSAyKSB7Ci0JCQkJZXJyb3JTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9ySW5zdGFsbERpck1pc3NpbmdGaWxlMiwgcGF0aHNbMF0sICBvdGhlck5hbWVzKSwgbnVsbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllcnJvclN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JJbnN0YWxsRGlyTWlzc2luZ0ZpbGUzLCBwYXRoc1swXSwgIG90aGVyTmFtZXMpLCBudWxsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXJyb3JTdGF0dXM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzcGVjOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvV2ViQXBwRG9jdW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvV2ViQXBwRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhZWEyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1dlYkFwcERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5YTUxVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGFjY2VzcyBhIHdlYi54bWwgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIFdlYkFwcERvY3VtZW50IHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dlYkFwcERpcnR5OwotCXByb3RlY3RlZCBEb2N1bWVudCB3ZWJBcHBEb2N1bWVudDsKLQotCS8qKgotCSAqIExvYWRzIGEgd2ViLnhtbCBmcm9tIHRoZSBnaXZlbiBVUkwuCi0JICoKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIFdlYkFwcERvY3VtZW50KElQYXRoIHBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQl3ZWJBcHBEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC50b0ZpbGUoKSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBhIHdlYi54bWwgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICoKLQkgKiBAcGFyYW0gZmlsZSBhIGZpbGUKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIFdlYkFwcERvY3VtZW50KElGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24gewotCQl3ZWJBcHBEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKGZpbGUuZ2V0Q29udGVudHMoKSkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBNaW1lTWFwcGluZy4KLQkgKgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKiBAcGFyYW0gbWFwIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LklNaW1lTWFwcGluZwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkFkZGluZyBtaW1lIG1hcHBpbmcgIiArIGluZGV4ICsgIiAiICsgbWFwLmdldE1pbWVUeXBlKCkgKyAiICIgKyBtYXAuZ2V0RXh0ZW5zaW9uKCkpOwotCQlFbGVtZW50IGVsZW1lbnQgPSB3ZWJBcHBEb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJRWxlbWVudCBtYXBwaW5nID0gWE1MVXRpbC5jcmVhdGVDaGlsZEVsZW1lbnQod2ViQXBwRG9jdW1lbnQsIGVsZW1lbnQsIGluZGV4LCAibWltZS1tYXBwaW5nIik7Ci0JCVhNTFV0aWwuaW5zZXJ0VGV4dCh3ZWJBcHBEb2N1bWVudCwgbWFwcGluZywgIlxuXHQiKTsKLQkJWE1MVXRpbC5jcmVhdGVUZXh0Q2hpbGRFbGVtZW50KHdlYkFwcERvY3VtZW50LCBtYXBwaW5nLCAiZXh0ZW5zaW9uIiwgbWFwLmdldEV4dGVuc2lvbigpKTsKLQkJWE1MVXRpbC5pbnNlcnRUZXh0KHdlYkFwcERvY3VtZW50LCBtYXBwaW5nLCAiXG5cdCIpOwotCQlYTUxVdGlsLmNyZWF0ZVRleHRDaGlsZEVsZW1lbnQod2ViQXBwRG9jdW1lbnQsIG1hcHBpbmcsICJtaW1lLXR5cGUiLCBtYXAuZ2V0TWltZVR5cGUoKSk7Ci0JCVhNTFV0aWwuaW5zZXJ0VGV4dCh3ZWJBcHBEb2N1bWVudCwgbWFwcGluZywgIlxuIik7Ci0JCQotCQlpc1dlYkFwcERpcnR5ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBNaW1lTWFwcGluZ3MuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TWltZU1hcHBpbmdzKCkgewotCQlMaXN0IG1hcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUVsZW1lbnQgcm9vdCA9IHdlYkFwcERvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IFhNTFV0aWwuZ2V0Tm9kZUl0ZXJhdG9yKHJvb3QsICJtaW1lLW1hcHBpbmciKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVN0cmluZyBtaW1lVHlwZSA9IFhNTFV0aWwuZ2V0U3ViTm9kZVZhbHVlKGVsZW1lbnQsICJtaW1lLXR5cGUiKTsKLQkJCVN0cmluZyBleHRlbnNpb24gPSBYTUxVdGlsLmdldFN1Yk5vZGVWYWx1ZShlbGVtZW50LCAiZXh0ZW5zaW9uIik7Ci0JCQlNaW1lTWFwcGluZyBtbSA9IG5ldyBNaW1lTWFwcGluZyhleHRlbnNpb24sIG1pbWVUeXBlKTsKLQkJCW1hcC5hZGQobW0pOwotCQl9Ci0JCQotCQlyZXR1cm4gbWFwOwotCX0KLQotCS8qKgotCSAqIE1vZGlmaWVzIGEgbWltZSBtYXBwaW5nLgotCSAqCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIG1hcAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeU1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSB3ZWJBcHBEb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1pbWUtbWFwcGluZyIpOwotCQlFbGVtZW50IGVsZW1lbnQyID0gKEVsZW1lbnQpIGxpc3QuaXRlbShpbmRleCk7Ci0JCVhNTFV0aWwuc2V0Tm9kZVZhbHVlKGVsZW1lbnQyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJleHRlbnNpb24iKS5pdGVtKDApLCAiZXh0ZW5zaW9uIiwgbWFwLmdldEV4dGVuc2lvbigpKTsKLQkJWE1MVXRpbC5zZXROb2RlVmFsdWUoZWxlbWVudDIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1pbWUtdHlwZSIpLml0ZW0oMCksICJtaW1lLXR5cGUiLCBtYXAuZ2V0TWltZVR5cGUoKSk7Ci0JCQotCQlpc1dlYkFwcERpcnR5ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBtaW1lIG1hcHBpbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNaW1lTWFwcGluZyhpbnQgaW5kZXgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gd2ViQXBwRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IGxpc3QgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtaW1lLW1hcHBpbmciKTsKLQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGluZGV4KTsKLQkJZWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTsKLQkJaXNXZWJBcHBEaXJ0eSA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIFdlYiBhcHAgZG9jdW1lbnQuCi0JICoKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKiBAcGFyYW0gZm9yY2VEaXJ0eSB0cnVlIHRvIGZvcmNlIGEgc2F2ZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoU3RyaW5nIHBhdGgsIGJvb2xlYW4gZm9yY2VEaXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZvcmNlRGlydHkgfHwgaXNXZWJBcHBEaXJ0eSkKLQkJCVhNTFV0aWwuc2F2ZShwYXRoLCB3ZWJBcHBEb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIFdlYiBhcHAgZG9jdW1lbnQuCi0JICoKLQkgKiBAcGFyYW0gZmlsZSBhIGZpbGUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nIAotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSUZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgIWlzV2ViQXBwRGlydHkpCi0JCQlyZXR1cm47Ci0JCQotCQlieXRlW10gZGF0YSA9IFhNTFV0aWwuZ2V0Q29udGVudHMod2ViQXBwRG9jdW1lbnQpOwotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCWZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlpc1dlYkFwcERpcnR5ID0gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9XZWJNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvV2ViTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMTcxNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9XZWJNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLS8qKgotICogQSBXZWIgbW9kdWxlLgotICovCi1wdWJsaWMgY2xhc3MgV2ViTW9kdWxlIGltcGxlbWVudHMgSVRvbWNhdFdlYk1vZHVsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgZG9jQmFzZTsKLQlwcml2YXRlIFN0cmluZyBwYXRoOwotCXByaXZhdGUgU3RyaW5nIG1lbWVudG87Ci0JcHJpdmF0ZSBib29sZWFuIHJlbG9hZGFibGU7Ci0KLQkvKioKLQkgKiBXZWJNb2R1bGUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKiBAcGFyYW0gZG9jQmFzZSBhIGRvY3VtZW50IGJhc2UKLQkgKiBAcGFyYW0gbWVtZW50byBhIG1lbWVudG8KLQkgKiBAcGFyYW0gcmVsb2FkYWJsZSA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWxvYWRhYmxlCi0JICovCi0JcHVibGljIFdlYk1vZHVsZShTdHJpbmcgcGF0aCwgU3RyaW5nIGRvY0Jhc2UsIFN0cmluZyBtZW1lbnRvLCBib29sZWFuIHJlbG9hZGFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJdGhpcy5kb2NCYXNlID0gZG9jQmFzZTsKLQkJdGhpcy5tZW1lbnRvID0gbWVtZW50bzsKLQkJdGhpcy5yZWxvYWRhYmxlID0gcmVsb2FkYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGRvY3VtZW50IGJhc2UuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50QmFzZSgpIHsKLQkJcmV0dXJuIGRvY0Jhc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoLiAoY29udGV4dCByb290KQotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lbWVudG8uCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lbWVudG8oKSB7Ci0JCXJldHVybiBtZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB3ZWIgbW9kdWxlIGlzIGF1dG8tcmVsb2FkYWJsZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVsb2FkYWJsZSgpIHsKLQkJcmV0dXJuIHJlbG9hZGFibGU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgV2ViTW9kdWxlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCVdlYk1vZHVsZSB3bSA9IChXZWJNb2R1bGUpIG9iajsKLQkJaWYgKCFnZXREb2N1bWVudEJhc2UoKS5lcXVhbHMod20uZ2V0RG9jdW1lbnRCYXNlKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWdldFBhdGgoKS5lcXVhbHMod20uZ2V0UGF0aCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFnZXRNZW1lbnRvKCkuZXF1YWxzKHdtLmdldE1lbWVudG8oKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvQWRkTWltZU1hcHBpbmdDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvQWRkTWltZU1hcHBpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMTM5MTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0FkZE1pbWVNYXBwaW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NaW1lTWFwcGluZzsKLS8qKgotICogQ29tbWFuZCB0byBhZGQgYSBtaW1lIG1hcHBpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRNaW1lTWFwcGluZ0NvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIE1pbWVNYXBwaW5nIG1hcDsKLQotCS8qKgotCSAqIEFkZE1pbWVNYXBwaW5nQ29tbWFuZCBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBhIHRvbWNhdCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIG1hcCBhIG1pbWUgbWFwcGluZwotCSAqLwotCXB1YmxpYyBBZGRNaW1lTWFwcGluZ0NvbW1hbmQoSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBNaW1lTWFwcGluZyBtYXApIHsKLQkJc3VwZXIoY29uZmlndXJhdGlvbiwgTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbkFkZE1pbWVNYXBwaW5nKTsKLQkJdGhpcy5tYXAgPSBtYXA7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQljb25maWd1cmF0aW9uLmFkZE1pbWVNYXBwaW5nKDAsIG1hcCk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQljb25maWd1cmF0aW9uLnJlbW92ZU1pbWVNYXBwaW5nKDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9BZGRNb2R1bGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvQWRkTW9kdWxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODkzNTMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9BZGRNb2R1bGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuQWJzdHJhY3RPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotLyoqCi0gKiBDb21tYW5kIHRvIGFkZCBhIHdlYiBtb2R1bGUgdG8gYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRNb2R1bGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gewotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyOwotCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKLQlwcm90ZWN0ZWQgaW50IG1vZHVsZXMgPSAtMTsKLQotCS8qKgotCSAqIEFkZE1vZHVsZUNvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZSBhIHdlYiBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgQWRkTW9kdWxlQ29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBJTW9kdWxlIG1vZHVsZSkgewotCQlzdXBlcihNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uQWRkV2ViTW9kdWxlKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJc2VydmVyLm1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXNlcnZlci5tb2RpZnlNb2R1bGVzKG51bGwsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvQWRkV2ViTW9kdWxlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0FkZFdlYk1vZHVsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhODI0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvQWRkV2ViTW9kdWxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5XZWJNb2R1bGU7Ci0vKioKLSAqIENvbW1hbmQgdG8gYWRkIGEgd2ViIG1vZHVsZS4KLSAqLwotcHVibGljIGNsYXNzIEFkZFdlYk1vZHVsZUNvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIFdlYk1vZHVsZSBtb2R1bGU7Ci0JcHJvdGVjdGVkIGludCBtb2R1bGVzID0gLTE7Ci0KLQkvKioKLQkgKiBBZGRXZWJNb2R1bGVDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYSB0b21jYXQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBtb2R1bGUgYSB3ZWIgbW9kdWxlCi0JICovCi0JcHVibGljIEFkZFdlYk1vZHVsZUNvbW1hbmQoSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCXN1cGVyKGNvbmZpZ3VyYXRpb24sIE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25BZGRXZWJNb2R1bGUpOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW1vZHVsZXMgPSBjb25maWd1cmF0aW9uLmdldFdlYk1vZHVsZXMoKS5zaXplKCk7Ci0JCWNvbmZpZ3VyYXRpb24uYWRkV2ViTW9kdWxlKC0xLCBtb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJY29uZmlndXJhdGlvbi5yZW1vdmVXZWJNb2R1bGUobW9kdWxlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0NvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjYzE0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLS8qKgotICogQ29uZmlndXJhdGlvbiBjb21tYW5kLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uZmlndXJhdGlvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiB7Ci0JcHJvdGVjdGVkIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbjsKLQotCS8qKgotCSAqIENvbmZpZ3VyYXRpb25Db21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYSBUb21jYXQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBsYWJlbCBhIGxhYmVsCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25Db21tYW5kKElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZSgpOwotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWV4ZWN1dGUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgdW5kbygpOwotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXVuZG8oKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlNaW1lTWFwcGluZ0NvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlNaW1lTWFwcGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhYTE1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5TWltZU1hcHBpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWltZU1hcHBpbmc7Ci0vKioKLSAqIENvbW1hbmQgdG8gY2hhbmdlIGEgbWltZSB0eXBlIGV4dGVuc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIE1vZGlmeU1pbWVNYXBwaW5nQ29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25Db21tYW5kIHsKLQlwcm90ZWN0ZWQgaW50IGluZGV4OwotCXByb3RlY3RlZCBNaW1lTWFwcGluZyBvbGRNYXA7Ci0JcHJvdGVjdGVkIE1pbWVNYXBwaW5nIG5ld01hcDsKLQotCS8qKgotCSAqIEEgY29tbWFuZCB0byBtb2RpZnkgYSBtaW1lIG1hcHBpbmcuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYSB0b21jYXQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBpbmRleCBhbiBpbmRleAotCSAqIEBwYXJhbSBtYXAgYSBtaW1lIG1hcHBpbmcKLQkgKi8KLQlwdWJsaWMgTW9kaWZ5TWltZU1hcHBpbmdDb21tYW5kKElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiwgaW50IGluZGV4LCBNaW1lTWFwcGluZyBtYXApIHsKLQkJc3VwZXIoY29uZmlndXJhdGlvbiwgTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeU1pbWVNYXBwaW5nKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQluZXdNYXAgPSBtYXA7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRNYXAgPSAoTWltZU1hcHBpbmcpIGNvbmZpZ3VyYXRpb24uZ2V0TWltZU1hcHBpbmdzKCkuZ2V0KGluZGV4KTsKLQkJY29uZmlndXJhdGlvbi5tb2RpZnlNaW1lTWFwcGluZyhpbmRleCwgbmV3TWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWNvbmZpZ3VyYXRpb24ubW9kaWZ5TWltZU1hcHBpbmcoaW5kZXgsIG9sZE1hcCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlQb3J0Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeVBvcnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWQxM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeVBvcnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBwb3J0LgotICovCi1wdWJsaWMgY2xhc3MgTW9kaWZ5UG9ydENvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgaW50IHBvcnQ7Ci0JcHJvdGVjdGVkIGludCBvbGRQb3J0OwotCi0JLyoqCi0JICogTW9kaWZ5UG9ydENvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYSBUb21jYXQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBpZCBhIHBvcnQgaWQKLQkgKiBAcGFyYW0gcG9ydCBuZXcgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZ5UG9ydENvbW1hbmQoSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBTdHJpbmcgaWQsIGludCBwb3J0KSB7Ci0JCXN1cGVyKGNvbmZpZ3VyYXRpb24sIE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25Nb2RpZnlQb3J0KTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnBvcnQgPSBwb3J0OwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gZmluZCBvbGQgcG9ydCBudW1iZXIKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25maWd1cmF0aW9uLmdldFNlcnZlclBvcnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUG9ydCB0ZW1wID0gKFNlcnZlclBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpZC5lcXVhbHModGVtcC5nZXRJZCgpKSkKLQkJCQlvbGRQb3J0ID0gdGVtcC5nZXRQb3J0KCk7Ci0JCX0KLQkKLQkJLy8gbWFrZSB0aGUgY2hhbmdlCi0JCWNvbmZpZ3VyYXRpb24ubW9kaWZ5U2VydmVyUG9ydChpZCwgcG9ydCk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQljb25maWd1cmF0aW9uLm1vZGlmeVNlcnZlclBvcnQoaWQsIG9sZFBvcnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5V2ViTW9kdWxlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeVdlYk1vZHVsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljM2ZmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5V2ViTW9kdWxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLldlYk1vZHVsZTsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgYSB3ZWIgbW9kdWxlLgotICovCi1wdWJsaWMgY2xhc3MgTW9kaWZ5V2ViTW9kdWxlQ29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25Db21tYW5kIHsKLQlwcm90ZWN0ZWQgaW50IGluZGV4OwotCXByb3RlY3RlZCBXZWJNb2R1bGUgb2xkTW9kdWxlOwotCXByb3RlY3RlZCBXZWJNb2R1bGUgbmV3TW9kdWxlOwotCi0JcHVibGljIE1vZGlmeVdlYk1vZHVsZUNvbW1hbmQoSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBpbnQgaW5kZXgsIFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJc3VwZXIoY29uZmlndXJhdGlvbiwgTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeVdlYk1vZHVsZSk7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJbmV3TW9kdWxlID0gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkTW9kdWxlID0gKFdlYk1vZHVsZSkgY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCkuZ2V0KGluZGV4KTsKLQkJY29uZmlndXJhdGlvbi5tb2RpZnlXZWJNb2R1bGUoaW5kZXgsIG5ld01vZHVsZS5nZXREb2N1bWVudEJhc2UoKSwgbmV3TW9kdWxlLmdldFBhdGgoKSwgbmV3TW9kdWxlLmlzUmVsb2FkYWJsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWNvbmZpZ3VyYXRpb24ubW9kaWZ5V2ViTW9kdWxlKGluZGV4LCBvbGRNb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCksIG9sZE1vZHVsZS5nZXRQYXRoKCksIG9sZE1vZHVsZS5pc1JlbG9hZGFibGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9SZW1vdmVNaW1lTWFwcGluZ0NvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9SZW1vdmVNaW1lTWFwcGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjMjc1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvUmVtb3ZlTWltZU1hcHBpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWltZU1hcHBpbmc7Ci0vKioKLSAqIENvbW1hbmQgdG8gcmVtb3ZlIGEgbWltZSBtYXBwaW5nLgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlTWltZU1hcHBpbmdDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNvbW1hbmQgewotCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0JcHJvdGVjdGVkIE1pbWVNYXBwaW5nIG1hcHBpbmc7Ci0KLQkvKioKLQkgKiBSZW1vdmVNaW1lTWFwcGluZ0NvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYSB0b21jYXQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBpbmRleCBhbiBpbmRleAotCSAqLwotCXB1YmxpYyBSZW1vdmVNaW1lTWFwcGluZ0NvbW1hbmQoSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIoY29uZmlndXJhdGlvbiwgTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvckFjdGlvblJlbW92ZU1pbWVNYXBwaW5nKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJbWFwcGluZyA9IChNaW1lTWFwcGluZykgY29uZmlndXJhdGlvbi5nZXRNaW1lTWFwcGluZ3MoKS5nZXQoaW5kZXgpOwotCQljb25maWd1cmF0aW9uLnJlbW92ZU1pbWVNYXBwaW5nKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWNvbmZpZ3VyYXRpb24uYWRkTWltZU1hcHBpbmcoaW5kZXgsIG1hcHBpbmcpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvUmVtb3ZlTW9kdWxlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1JlbW92ZU1vZHVsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIzNTkyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvUmVtb3ZlTW9kdWxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLS8qKgotICogQ29tbWFuZCB0byByZW1vdmUgYSB3ZWIgbW9kdWxlIGZyb20gYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVNb2R1bGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gewotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyOwotCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKLQotCS8qKgotCSAqIEFkZE1vZHVsZUNvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZSBhIHdlYiBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgUmVtb3ZlTW9kdWxlQ29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBJTW9kdWxlIG1vZHVsZSkgewotCQlzdXBlcihNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uUmVtb3ZlV2ViTW9kdWxlKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJc2VydmVyLm1vZGlmeU1vZHVsZXMobnVsbCwgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXNlcnZlci5tb2RpZnlNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbnVsbCwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1JlbW92ZVdlYk1vZHVsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0OWQxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLldlYk1vZHVsZTsKLS8qKgotICogQ29tbWFuZCB0byByZW1vdmUgYSB3ZWIgbW9kdWxlLgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25Db21tYW5kIHsKLQlwcm90ZWN0ZWQgaW50IGluZGV4OwotCXByb3RlY3RlZCBXZWJNb2R1bGUgbW9kdWxlOwotCi0JLyoqCi0JICogUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGEgdG9tY2F0IGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gaW5kZXggYW4gaW5kZXgKLQkgKi8KLQlwdWJsaWMgUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZChJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIGludCBpbmRleCkgewotCQlzdXBlcihjb25maWd1cmF0aW9uLCBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uUmVtb3ZlV2ViTW9kdWxlKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJbW9kdWxlID0gKFdlYk1vZHVsZSkgY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCkuZ2V0KGluZGV4KTsKLQkJY29uZmlndXJhdGlvbi5yZW1vdmVXZWJNb2R1bGUoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJY29uZmlndXJhdGlvbi5hZGRXZWJNb2R1bGUoaW5kZXgsIG1vZHVsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXJ2ZXJDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2VydmVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmU4YWQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXJ2ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlcjsKLS8qKgotICogQSBjb21tYW5kIG9uIGEgVG9tY2F0IHNlcnZlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiB7Ci0JcHJvdGVjdGVkIFRvbWNhdFNlcnZlciBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIFRvbWNhdCBzZXJ2ZXIKLQkgKiBAcGFyYW0gbGFiZWwgYSBsYWJlbAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJDb21tYW5kKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMuc2VydmVyID0gKFRvbWNhdFNlcnZlcikgc2VydmVyOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZSgpOwotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWV4ZWN1dGUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgdW5kbygpOwotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXVuZG8oKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXREZWJ1Z01vZGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0RGVidWdNb2RlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmI1NmM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXREZWJ1Z01vZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIgZGVidWcgbW9kZS4KLSAqLwotcHVibGljIGNsYXNzIFNldERlYnVnTW9kZUNvbW1hbmQgZXh0ZW5kcyBTZXJ2ZXJDb21tYW5kIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZzsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBvbGREZWJ1ZzsKLQotCS8qKgotCSAqIFNldERlYnVnTW9kZUNvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgVG9tY2F0IHNlcnZlcgotCSAqIEBwYXJhbSBkZWJ1ZyA8Y29kZT50cnVlPC9jb2RlPiBmb3IgZGVidWcgbW9kZQotCSAqLwotCXB1YmxpYyBTZXREZWJ1Z01vZGVDb21tYW5kKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIGJvb2xlYW4gZGVidWcpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JBY3Rpb25TZXREZWJ1Z01vZGUpOwotCQl0aGlzLmRlYnVnID0gZGVidWc7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGREZWJ1ZyA9IHNlcnZlci5pc0RlYnVnKCk7Ci0JCXNlcnZlci5zZXREZWJ1ZyhkZWJ1Zyk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlzZXJ2ZXIuc2V0RGVidWcob2xkRGVidWcpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0RGVwbG95RGlyZWN0b3J5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldERlcGxveURpcmVjdG9yeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxMGUxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0RGVwbG95RGlyZWN0b3J5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBTQVMgSW5zdGl0dXRlLCBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgTGFycnkgSXNhYWNzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLQotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgZGVwbG95IGRpcmVjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgU2V0RGVwbG95RGlyZWN0b3J5Q29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBTdHJpbmcgZGVwbG95RGlyOwotCXByb3RlY3RlZCBTdHJpbmcgb2xkRGVwbG95RGlyOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBjb21tYW5kIHRvIHNldCB0aGUgZGVwbG95IGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgVG9tY2F0IHNlcnZlcgotCSAqIEBwYXJhbSBkZXBsb3lEaXIgZGVwbG95bWVudCBkaXJlY3RvcnkgdG8gc2V0Ci0JICovCi0JcHVibGljIFNldERlcGxveURpcmVjdG9yeUNvbW1hbmQoSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwKLQkJCVN0cmluZyBkZXBsb3lEaXIpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JBY3Rpb25TZXREZXBsb3lEaXJlY3RvcnkpOwotCQl0aGlzLmRlcGxveURpciA9IGRlcGxveURpcjsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHNldHRpbmcgdGhlIGRlcGxveSBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGREZXBsb3lEaXIgPSBzZXJ2ZXIuZ2V0RGVwbG95RGlyZWN0b3J5KCk7Ci0JCXNlcnZlci5zZXREZXBsb3lEaXJlY3RvcnkoZGVwbG95RGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHByaW9yIGRlcGxveSBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlzZXJ2ZXIuc2V0RGVwbG95RGlyZWN0b3J5KG9sZERlcGxveURpcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldEluc3RhbmNlRGlyZWN0b3J5Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldEluc3RhbmNlRGlyZWN0b3J5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2U0NjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRJbnN0YW5jZURpcmVjdG9yeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgU0FTIEluc3RpdHV0ZSwgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIExhcnJ5IElzYWFjcyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIGRlcGxveSBkaXJlY3RvcnkKLSAqLwotcHVibGljIGNsYXNzIFNldEluc3RhbmNlRGlyZWN0b3J5Q29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBTdHJpbmcgaW5zdGFuY2VEaXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBvbGRJbnN0YW5jZURpcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBvbGRUZXN0RW52aXJvbm1lbnQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGNvbW1hbmQgdG8gc2V0IHRoZSBpbnN0YW5jZSBkaXJlY3RvcnkuIFNldHRpbmcKLQkgKiB0aGUgaW5zdGFuY2UgZGlyZWN0b3J5IGFsc28gc2V0cyB0ZXN0RW52aXJvbm1lbnQgdHJ1ZTsKLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgVG9tY2F0IHNlcnZlcgotCSAqIEBwYXJhbSBpbnN0YW5jZURpciBpbnN0YW5jZSBkaXJlY3RvcnkgdG8gc2V0Ci0JICovCi0JcHVibGljIFNldEluc3RhbmNlRGlyZWN0b3J5Q29tbWFuZChJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBTdHJpbmcgaW5zdGFuY2VEaXIpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JBY3Rpb25TZXRTZXJ2ZXJEaXJlY3RvcnkpOwotCQl0aGlzLmluc3RhbmNlRGlyID0gaW5zdGFuY2VEaXI7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSBzZXR0aW5nIHRoZSBkZXBsb3kgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkVGVzdEVudmlyb25tZW50ID0gc2VydmVyLmlzVGVzdEVudmlyb25tZW50KCk7Ci0JCW9sZEluc3RhbmNlRGlyID0gc2VydmVyLmdldEluc3RhbmNlRGlyZWN0b3J5KCk7Ci0JCWlmICghb2xkVGVzdEVudmlyb25tZW50KQotCQkJc2VydmVyLnNldFRlc3RFbnZpcm9ubWVudCh0cnVlKTsKLQkJc2VydmVyLnNldEluc3RhbmNlRGlyZWN0b3J5KGluc3RhbmNlRGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHByaW9yIGRlcGxveSBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIW9sZFRlc3RFbnZpcm9ubWVudCkKLQkJCXNlcnZlci5zZXRUZXN0RW52aXJvbm1lbnQoZmFsc2UpOwotCQlzZXJ2ZXIuc2V0SW5zdGFuY2VEaXJlY3Rvcnkob2xkSW5zdGFuY2VEaXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXNDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0U2F2ZVNlcGFyYXRlQ29udGV4dEZpbGVzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzY3YTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIENvbW1hbmQgdG8gZW5hYmxlIG9yIGRpc2FibGUgc2VydmluZyBtb2R1bGVzIHdpdGhvdXQgcHVibGlzaGluZwotICovCi1wdWJsaWMgY2xhc3MgU2V0U2F2ZVNlcGFyYXRlQ29udGV4dEZpbGVzQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBib29sZWFuIHNzY2Y7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gb2xkU3NjZjsKLQotCS8qKgotCSAqIFNldFNlcGFyYXRlQ29udGV4dEZpbGVzQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBUb21jYXQgc2VydmVyCi0JICogQHBhcmFtIHNzY2YgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZW5hYmxlIHNhdmluZyBzZXBhcmF0ZSBjb250ZXh0IFhNTAotCSAqIGZpbGVzLiBPdGhlcndpc2UgY29udGV4dHMgYXJlIGtlcHQgaW4gc2VydmVyLnhtbCB3aGVuIHB1Ymxpc2hlZC4KLQkgKi8KLQlwdWJsaWMgU2V0U2F2ZVNlcGFyYXRlQ29udGV4dEZpbGVzQ29tbWFuZChJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBib29sZWFuIHNzY2YpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFaWR0b3JBY3Rpb25TZXRTZXBhcmF0ZUNvbnRleHRGaWxlcyk7Ci0JCXRoaXMuc3NjZiA9IHNzY2Y7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRTc2NmID0gc2VydmVyLmlzU2F2ZVNlcGFyYXRlQ29udGV4dEZpbGVzKCk7Ci0JCXNlcnZlci5zZXRTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXMoc3NjZik7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlzZXJ2ZXIuc2V0U2F2ZVNlcGFyYXRlQ29udGV4dEZpbGVzKG9sZFNzY2YpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0U2VjdXJlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldFNlY3VyZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1NDI5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0U2VjdXJlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyIHNlY3VyaXR5IG9wdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNldFNlY3VyZUNvbW1hbmQgZXh0ZW5kcyBTZXJ2ZXJDb21tYW5kIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZWN1cmU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gb2xkU2VjdXJlOwotCi0JLyoqCi0JICogU2V0U2VjdXJlQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBUb21jYXQgc2VydmVyCi0JICogQHBhcmFtIHNlY3VyZSA8Y29kZT50cnVlPC9jb2RlPiBmb3Igc2VjdXJpdHkgb24KLQkgKi8KLQlwdWJsaWMgU2V0U2VjdXJlQ29tbWFuZChJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBib29sZWFuIHNlY3VyZSkgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvckFjdGlvblNldFNlY3VyZSk7Ci0JCXRoaXMuc2VjdXJlID0gc2VjdXJlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkU2VjdXJlID0gc2VydmVyLmlzU2VjdXJlKCk7Ci0JCXNlcnZlci5zZXRTZWN1cmUoc2VjdXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXNlcnZlci5zZXRTZWN1cmUob2xkU2VjdXJlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWUwZTIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ29tbWFuZCB0byBlbmFibGUgb3IgZGlzYWJsZSBzZXJ2aW5nIG1vZHVsZXMgd2l0aG91dCBwdWJsaXNoaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaENvbW1hbmQgZXh0ZW5kcyBTZXJ2ZXJDb21tYW5kIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzbXdwOwotCXByb3RlY3RlZCBib29sZWFuIG9sZFNtd3A7Ci0KLQkvKioKLQkgKiBTZXRTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgVG9tY2F0IHNlcnZlcgotCSAqIEBwYXJhbSBzbXdwIDxjb2RlPnRydWU8L2NvZGU+IHRvIGVuYWJsZSBzZXJ2aW5nIG1vZHVsZXMgd2l0aG91dAotCSAqIHB1Ymxpc2hpbmcuIE90aGVyd2lzZSBtb2R1bGVzIGFyZSBzZXJ2ZWQgd2l0aCBzdGFuZGFyZCBwdWJsaXNoaW5nLgotCSAqLwotCXB1YmxpYyBTZXRTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaENvbW1hbmQoSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgYm9vbGVhbiBzbXdwKSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuc2VydmVyRWRpdG9yQWN0aW9uU2V0U2VydmVXaXRob3V0UHVibGlzaCk7Ci0JCXRoaXMuc213cCA9IHNtd3A7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRTbXdwID0gc2VydmVyLmlzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKTsKLQkJc2VydmVyLnNldFNlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKHNtd3ApOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJc2VydmVyLnNldFNlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoKG9sZFNtd3ApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldFRlc3RFbnZpcm9ubWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1ZDE2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIgdGVzdCBtb2RlLiAgVGhlIHNlcnZlciBpbnN0YW5jZSBkaXJlY3RvcnkKLSAqIGlzIGNsZWFyZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGlzIGNvbW1hbmQgZm9yIGxlZ2FjeSBzdXBwb3J0LgotICovCi1wdWJsaWMgY2xhc3MgU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBib29sZWFuIHRlOwotCXByb3RlY3RlZCBib29sZWFuIG9sZFRlOwotCXByb3RlY3RlZCBTdHJpbmcgb2xkSW5zdGFuY2VEaXI7Ci0KLQkvKioKLQkgKiBTZXRUZXN0RW52aXJvbm1lbnRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIFRvbWNhdCBzZXJ2ZXIKLQkgKiBAcGFyYW0gdGUgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGEgdGVzdCBlbnZpcm9ubWVudC4KLQkgKi8KLQlwdWJsaWMgU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZChJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBib29sZWFuIHRlKSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuc2VydmVyRWRpdG9yQWN0aW9uU2V0U2VydmVyRGlyZWN0b3J5KTsKLQkJdGhpcy50ZSA9IHRlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkVGUgPSBzZXJ2ZXIuaXNUZXN0RW52aXJvbm1lbnQoKTsKLQkJLy8gc2F2ZSBvbGQgaW5zdGFuY2UgZGlyZWN0b3J5Ci0JCW9sZEluc3RhbmNlRGlyID0gc2VydmVyLmdldEluc3RhbmNlRGlyZWN0b3J5KCk7Ci0JCXNlcnZlci5zZXRUZXN0RW52aXJvbm1lbnQodGUpOwotCQkvLyBlbnN1cmUgaW5zdGFuY2UgZGlyZWN0b3J5IGlzIGNsZWFyZWQKLQkJc2VydmVyLnNldEluc3RhbmNlRGlyZWN0b3J5KG51bGwpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJc2VydmVyLnNldFRlc3RFbnZpcm9ubWVudChvbGRUZSk7Ci0JCXNlcnZlci5zZXRJbnN0YW5jZURpcmVjdG9yeShvbGRJbnN0YW5jZURpcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldFdlYk1vZHVsZVBhdGhDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0V2ViTW9kdWxlUGF0aENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwZjFkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0V2ViTW9kdWxlUGF0aENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5XZWJNb2R1bGU7Ci0vKioKLSAqIENvbW1hbmQgdG8gbW9kaWZ5IHRoZSBwYXRoIG9mIGEgV2ViIG1vZHVsZS4KLSAqLwotcHVibGljIGNsYXNzIFNldFdlYk1vZHVsZVBhdGhDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNvbW1hbmQgewotCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0JcHJvdGVjdGVkIFdlYk1vZHVsZSBvbGRNb2R1bGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBwYXRoOwotCi0JLyoqCi0JICogU2V0V2ViTW9kdWxlUGF0aENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBhIHRvbWNhdCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGluZGV4IGFuIGluZGV4Ci0JICogQHBhcmFtIGNvbnRleHRSb290IHRoZSBjb250ZXh0IHJvb3QKLQkgKi8KLQlwdWJsaWMgU2V0V2ViTW9kdWxlUGF0aENvbW1hbmQoSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBpbnQgaW5kZXgsIFN0cmluZyBjb250ZXh0Um9vdCkgewotCQlzdXBlcihjb25maWd1cmF0aW9uLCBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uRWRpdFdlYk1vZHVsZVBhdGgpOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCXRoaXMucGF0aCA9IGNvbnRleHRSb290OwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkTW9kdWxlID0gKFdlYk1vZHVsZSkgY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCkuZ2V0KGluZGV4KTsKLQkJY29uZmlndXJhdGlvbi5yZW1vdmVXZWJNb2R1bGUoaW5kZXgpOwotCQkKLQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUocGF0aCwgb2xkTW9kdWxlLmdldERvY3VtZW50QmFzZSgpLCBvbGRNb2R1bGUuZ2V0TWVtZW50bygpLCBvbGRNb2R1bGUuaXNSZWxvYWRhYmxlKCkpOwotCQljb25maWd1cmF0aW9uLmFkZFdlYk1vZHVsZShpbmRleCwgbW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWNvbmZpZ3VyYXRpb24ucmVtb3ZlV2ViTW9kdWxlKGluZGV4KTsKLQkJY29uZmlndXJhdGlvbi5hZGRXZWJNb2R1bGUoaW5kZXgsIG9sZE1vZHVsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvd3N0L0lNb2R1bGVWaXNpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3dzdC9JTW9kdWxlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTg2ODAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvd3N0L0lNb2R1bGVWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSWdvciBGZWRvcmVua28gJiBGYWJyaXppbyBHaXVzdGluYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwud3N0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogVmlzaXRvciBpbnRlcmZhY2UgdG8gcHJvY2VzcyBtb2R1bGUgY29tcG9uZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVWaXNpdG9yIHsKLQotCS8qKgotCSAqIFByb2Nlc3Mgd2ViIGNvbXBvbmVudAotCSAqIEBwYXJhbSBjb21wb25lbnQgd2ViIGNvbXBvbmVudCB0byBwcm9jZXNzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jdm9pZCB2aXNpdFdlYkNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUG9zdCBwcm9jZXNzIHdlYiBjb21wb25lbnQKLQkgKiBAcGFyYW0gY29tcG9uZW50IHdlYiBjb21wb25lbnQgdG8gcHJvY2VzcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXZvaWQgZW5kVmlzaXRXZWJDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFByb2Nlc3MgYXJjaGl2ZSBjb21wb25lbnQuCi0JICogQHBhcmFtIHJ1bnRpbWVQYXRoIHBhdGggZm9yIGNvbXBvbmVudCBhdCBydW50aW1lCi0JICogQHBhcmFtIHdvcmtzcGFjZVBhdGggcGF0aCB0byBjb21wb25lbnQgaW4gd29ya3NwYWNlCi0JICovCi0Jdm9pZCB2aXNpdEFyY2hpdmVDb21wb25lbnQoSVBhdGggcnVudGltZVBhdGgsIElQYXRoIHdvcmtzcGFjZVBhdGgpOwotCi0JLyoqCi0JICogUHJvY2VzcyBkZXBlbmRlbnQgY29tcG9uZW50LgotCSAqIEBwYXJhbSBydW50aW1lUGF0aCBwYXRoIGZvciBjb21wb25lbnQgYXQgcnVudGltZQotCSAqIEBwYXJhbSB3b3Jrc3BhY2VQYXRoIHBhdGggdG8gY29tcG9uZW50IGluIHdvcmtzcGFjZQotCSAqLwotCXZvaWQgdmlzaXREZXBlbmRlbnRDb21wb25lbnQoSVBhdGggcnVudGltZVBhdGgsIElQYXRoIHdvcmtzcGFjZVBhdGgpOwotCi0JLyoqCi0JICogUHJvY2VzcyB3ZWIgcmVzb3VyY2UuCi0JICogQHBhcmFtIHJ1bnRpbWVQYXRoIHBhdGggZm9yIHJlc291cmNlIGF0IHJ1bnRpbWUKLQkgKiBAcGFyYW0gd29ya3NwYWNlUGF0aCBwYXRoIHRvIHJlc291cmNlIGluIHdvcmtzcGFjZQotCSAqLwotCXZvaWQgdmlzaXRXZWJSZXNvdXJjZShJUGF0aCBydW50aW1lUGF0aCwgSVBhdGggd29ya3NwYWNlUGF0aCk7Ci0KLQkvKioKLQkgKiBQcm9jZXNzIEVBUiByZXNvdXJjZS4KLQkgKiBAcGFyYW0gcnVudGltZVBhdGggcGF0aCBmb3IgcmVzb3VyY2UgYXQgcnVudGltZQotCSAqIEBwYXJhbSB3b3Jrc3BhY2VQYXRoIHBhdGggdG8gcmVzb3VyY2UgaW4gd29ya3NwYWNlCi0JICovCi0Jdm9pZCB2aXNpdEVhclJlc291cmNlKElQYXRoIHJ1bnRpbWVQYXRoLCBJUGF0aCB3b3Jrc3BhY2VQYXRoKTsKLQotCS8qKgotCSAqIFBvc3QgcHJvY2VzcyBFQVIgcmVzb3VyY2UuCi0JICogQHBhcmFtIGNvbXBvbmVudCBFQVIgY29tcG9uZW50IHRvIHByb2Nlc3MKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICovCi0Jdm9pZCBlbmRWaXNpdEVhckNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC93c3QvTW9kdWxlVHJhdmVyc2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3dzdC9Nb2R1bGVUcmF2ZXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3MjcwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3dzdC9Nb2R1bGVUcmF2ZXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSWdvciBGZWRvcmVua28gJiBGYWJyaXppbyBHaXVzdGluYSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwud3N0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0KLS8qKgotICogVGVtcG9yYXJ5IHNvbHV0aW9uIGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzODg4Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVUcmF2ZXJzZXIgewotCi0JLyoqCi0JICogRmFjZXQgdHlwZSBmb3IgRUFSIG1vZHVsZXMKLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfTU9EVUxFID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRTsKLQotICAgIC8qKgotICAgICAqIEZhY2V0IHR5cGUgZm9yIFdlYiBtb2R1bGVzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRSA9IElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEU7Ci0KLSAgICAvKioKLSAgICAgKiBGYWNldCB0eXBlIGZvciB1dGlsaXR5IG1vZHVsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVElMSVRZX01PRFVMRSA9IElNb2R1bGVDb25zdGFudHMuSlNUX1VUSUxJVFlfTU9EVUxFOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgY3VzdG9tIEphdmEgY2xhc3NwYXRoIGVudHJ5IGF0dHJpYnV0ZSB0aGF0IGlzIHVzZWQgdG8gZmxhZyBlbnRyaWVzCi0gICAgICogd2hpY2ggc2hvdWxkIGJlIGV4cG9zZWQgYXMgbW9kdWxlIGRlcGVuZGVuY2llcyB2aWEgdGhlIHZpcnR1YWwgY29tcG9uZW50IEFQSS4KLSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kgPSAib3JnLmVjbGlwc2UuanN0LmNvbXBvbmVudC5kZXBlbmRlbmN5IjsgLy8kTk9OLU5MUy0xCi0gICAgCi0JLyoqCi0JICogTmFtZSBvZiB0aGUgY3VzdG9tIEphdmEgY2xhc3NwYXRoIGVudHJ5IGF0dHJpYnV0ZSB0aGF0IGlzIHVzZWQgdG8gZmxhZwotCSAqIHRoZSByZXNvbHZlZCBlbnRyaWVzIG9mIGNsYXNzcGF0aCBjb250YWluZXJzIHRoYXQgc2hvdWxkIG5vdCBiZSBleHBvc2VkCi0JICogdmlhIHRoZSB2aXJ0dWFsIGNvbXBvbmVudCBBUEkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05fREVQRU5ERU5DWSA9ICJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50Lm5vbmRlcGVuZGVuY3kiOyAvLyROT04tTkxTLTEKLQkKLQkvKioKLQkgKiBBcmd1bWVudCB2YWx1ZXMgdGhhdCBhcmUgdXNlZCB0byBzZWxlY3QgY29tcG9uZW50IGRlcGVuZGVuY3kgYXR0cmlidXRlIHR5cGUuIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVBFTkRFQ1lBVFRSSUJVVEVUWVBFX0RFUEVOREVOQ1lfT1JfTk9OREVQRU5ERU5DWSA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFUEVOREVDWUFUVFJJQlVURVRZUEVfQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVQRU5ERUNZQVRUUklCVVRFVFlQRV9DTEFTU1BBVEhfQ09NUE9ORU5UX05PTkRFUEVOREVOQ1kgPSAyOwotCi0JLyoqCi0gICAgICogU2NhbnMgdGhlIG1vZHVsZSB1c2luZyB0aGUgc3BlY2lmaWVkIHZpc2l0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1vZHVsZSBtb2R1bGUgdG8gdHJhdmVyc2UKLSAgICAgKiBAcGFyYW0gdmlzaXRvciB2aXNpdG9yIHRvIGhhbmRsZSByZXNvdXJjZXMKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJhdmVyc2UoSU1vZHVsZSBtb2R1bGUsIElNb2R1bGVWaXNpdG9yIHZpc2l0b3IsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTdHJpbmcgdHlwZUlkID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpOwotICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChtb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQotICAgICAgICBpZiAoY29tcG9uZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGNhbiBoYXBwZW4gaWYgcHJvamVjdCBoYXMgYmVlbiBjbG9zZWQKLSAgICAgICAgICAgIFRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJVbmFibGUgdG8gY3JlYXRlIGNvbXBvbmVudCBmb3IgbW9kdWxlICIKLSAgICAgICAgICAgICAgICAgICAgKyBtb2R1bGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChFQVJfTU9EVUxFLmVxdWFscyh0eXBlSWQpKSB7Ci0gICAgICAgICAgICB0cmF2ZXJzZUVhckNvbXBvbmVudChjb21wb25lbnQsIHZpc2l0b3IsIG1vbml0b3IpOwotICAgICAgICB9IGVsc2UgaWYgKFdFQl9NT0RVTEUuZXF1YWxzKHR5cGVJZCkpIHsKLSAgICAgICAgICAgIHRyYXZlcnNlV2ViQ29tcG9uZW50KGNvbXBvbmVudCwgdmlzaXRvciwgbW9uaXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyYXZlcnNlRWFyQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgICAgIElNb2R1bGVWaXNpdG9yIHZpc2l0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJLy8gQ3VycmVudGx5IHRoZSBKU1QgU2VydmVyIHBvcnRpb24gb2YgV1RQIG1heSBub3QgZGVwZW5kIG9uIHRoZSBKU1QgRW50ZXJwcmlzZSBwb3J0aW9uIG9mIFdUUAotLyogICAgICAgIEVBUkFydGlmYWN0RWRpdCBlYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0Ci0gICAgICAgICAgICAgICAgLmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLSAgICAgICAgaWYgKGVhckVkaXQgIT0gbnVsbCkgewotICAgICAgICAgICAgSVZpcnR1YWxSZWZlcmVuY2VbXSBqMmVlQ29tcG9uZW50cyA9IGVhckVkaXQuZ2V0SjJFRU1vZHVsZVJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgajJlZUNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0cmF2ZXJzZVdlYkNvbXBvbmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGoyZWVDb21wb25lbnRzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSwgdmlzaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSVZpcnR1YWxSZWZlcmVuY2VbXSBqYXJDb21wb25lbnRzID0gZWFyRWRpdC5nZXRVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSVZpcnR1YWxSZWZlcmVuY2UgamFyUmVmZXJlbmNlID0gamFyQ29tcG9uZW50c1tpXTsKLSAgICAgICAgICAgICAgICBJVmlydHVhbENvbXBvbmVudCBqYXJDb21wb25lbnQgPSBqYXJSZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgICAgICAgSVByb2plY3QgZGVwZW5kZW50UHJvamVjdCA9IGphckNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkZXBlbmRlbnRQcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShkZXBlbmRlbnRQcm9qZWN0KTsKLSAgICAgICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnkgY3BlID0gZ2V0Q2xhc3NwYXRoRW50cnkocHJvamVjdCwgamFyQ29tcG9uZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdEVhclJlc291cmNlKG51bGwsIGdldE9TUGF0aChkZXBlbmRlbnRQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCwgY3BlLmdldE91dHB1dExvY2F0aW9uKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSovCi0gICAgICAgIHZpc2l0b3IuZW5kVmlzaXRFYXJDb21wb25lbnQoY29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyYXZlcnNlV2ViQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgICAgICAgIElNb2R1bGVWaXNpdG9yIHZpc2l0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICB2aXNpdG9yLnZpc2l0V2ViQ29tcG9uZW50KGNvbXBvbmVudCk7Ci0KLSAgICAgICAgSVByb2plY3QgcHJvaiA9IGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIFN0cnVjdHVyZUVkaXQgd2FyU3RydWN0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFdvcmtiZW5jaENvbXBvbmVudCBjb21wID0gd2FyU3RydWN0LmdldENvbXBvbmVudCgpOwotICAgICAgICAgICAgaWYgKGNvbXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBnZXR0aW5nIFdvcmtiZW5jaENvbXBvbmVudCBmcm9tIHdhciBwcm9qZWN0LiBJUHJvamVjdD1cIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9qICsgIlwiIFN0cnVjdHVyZUVkaXQ9XCIiICsgd2FyU3RydWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIFdvcmtiZW5jaENvbXBvbmVudD1cIiIgKyBjb21wICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJhdmVyc2VXZWJDb21wb25lbnRMb2NhbEVudHJpZXMoY29tcCwgdmlzaXRvciwgbW9uaXRvcik7Ci0KLSAgICAgICAgICAgIC8vIHRyYXZlcnNlIHJlZmVyZW5jZWQgY29tcG9uZW50cwotICAgICAgICAgICAgTGlzdCBjaGlsZHJlbiA9IGNvbXAuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFJlZmVyZW5jZWRDb21wb25lbnQgY2hpbGRSZWYgPSAoUmVmZXJlbmNlZENvbXBvbmVudCkgaXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgSVBhdGggcnRGb2xkZXIgPSBjaGlsZFJlZi5nZXRSdW50aW1lUGF0aCgpOwotICAgICAgICAgICAgICAgIFVSSSByZWZIYW5kbGUgPSBjaGlsZFJlZi5nZXRIYW5kbGUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uQ0xBU1NQQVRILmVxdWFscygKLSAgICAgICAgICAgICAgICAJCXJlZkhhbmRsZS5zZWdtZW50KE1vZHVsZVVSSVV0aWwuTW9kdWxlVVJJLlNVQl9QUk9UT0NPTF9JTkRYKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgSVBhdGggcmVmUGF0aCA9IGdldFJlc29sdmVkUGF0aEZvckFyY2hpdmVDb21wb25lbnQocmVmSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYW4gYXJjaGl2ZSBjb21wb25lbnQsIGFkZCB0byBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWZQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCWlmICghcmVmUGF0aC5pc0Fic29sdXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlZlBhdGgpOwotICAgICAgICAgICAgICAgICAgICAJCUlQYXRoIHJlZlBhdGgyID0gZmlsZS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAJCWlmIChyZWZQYXRoMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkJCXZpc2l0b3IudmlzaXRBcmNoaXZlQ29tcG9uZW50KHJ0Rm9sZGVyLCByZWZQYXRoMik7Ci0gICAgICAgICAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgICAgICAgICAJCWVsc2UgewotICAgICAgICAgICAgICAgICAgICAJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCBOTFMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgCQkJCQkiQ291bGQgbm90IGdldCB0aGUgbG9jYXRpb24gb2YgYSByZWZlcmVuY2VkIGNvbXBvbmVudC4gIEl0IG1heSBub3QgZXhpc3QuICBQcm9qZWN0PXswfSwgUGFyZW50IENvbXBvbmVudD17MX0sIFJlZmVyZW5jZWQgQ29tcG9uZW50IFBhdGg9ezJ9IiwKLSAgICAgICAgICAgICAgICAgICAgCQkJCQluZXcgT2JqZWN0W10geyBwcm9qLmdldE5hbWUoKSwgY29tcC5nZXROYW1lKCksIHJlZlBhdGh9KSk7Ci0gICAgICAgICAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICAJZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIAkJdmlzaXRvci52aXNpdEFyY2hpdmVDb21wb25lbnQocnRGb2xkZXIsIHJlZlBhdGgpOwotICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAJLy8gVE9ETyBEZXRlcm1pbmUgaWYgYW55IHVzZSBjYXNlIHdvdWxkIGFycml2ZSBoZXJlLgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtiZW5jaENvbXBvbmVudCBjaGlsZENvbSA9IHdhclN0cnVjdC5maW5kQ29tcG9uZW50QnlVUkkocmVmSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZENvbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlRGVwZW5kZW50RW50cmllcyh2aXNpdG9yLCBydEZvbGRlciwgY2hpbGRDb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvbWNhdFBsdWdpbi5sb2coZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB3YXJTdHJ1Y3QuZGlzcG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlzaXRvci5lbmRWaXNpdFdlYkNvbXBvbmVudChjb21wb25lbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJhdmVyc2VXZWJDb21wb25lbnRMb2NhbEVudHJpZXMoCi0gICAgICAgICAgICBXb3JrYmVuY2hDb21wb25lbnQgY29tcCwgSU1vZHVsZVZpc2l0b3IgdmlzaXRvciwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJUHJvamVjdCB3YXJQcm9qZWN0ID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChjb21wKTsKLSAgICAgICAgaWYgKHdhclByb2plY3QgPT0gbnVsbCB8fCAhd2FyUHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIElKYXZhUHJvamVjdCBwcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHdhclByb2plY3QpOwotCi0gICAgICAgIExpc3QgcmVzID0gY29tcC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdG9yUmVzID0gcmVzLml0ZXJhdG9yKCk7IGl0b3JSZXMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQ29tcG9uZW50UmVzb3VyY2UgY2hpbGRDb21wID0gKENvbXBvbmVudFJlc291cmNlKSBpdG9yUmVzLm5leHQoKTsKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeSBjcGUgPSBnZXRDbGFzc3BhdGhFbnRyeShwcm9qZWN0LCBjaGlsZENvbXAuZ2V0U291cmNlUGF0aCgpKTsKLSAgICAgICAgICAgIGlmIChjcGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHZpc2l0b3IudmlzaXRXZWJSZXNvdXJjZShjaGlsZENvbXAuZ2V0UnVudGltZVBhdGgoKSwgZ2V0T1NQYXRoKAotICAgICAgICAgICAgICAgICAgICB3YXJQcm9qZWN0LCBwcm9qZWN0LCBjcGUuZ2V0T3V0cHV0TG9jYXRpb24oKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5jbHVkZSB0YWdnZWQgY2xhc3NwYXRoIGVudHJpZXMKLSAgICAgICAgTWFwIGNsYXNzcGF0aERlcHMgPSBnZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMocHJvamVjdCwgdHJ1ZSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjbGFzc3BhdGhEZXBzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpaXRlcmF0b3IubmV4dCgpOwotCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSAoSUNsYXNzcGF0aEF0dHJpYnV0ZSljbGFzc3BhdGhEZXBzLmdldChlbnRyeSk7Ci0JCQlib29sZWFuIGlzQ2xhc3NGb2xkZXIgPSBpc0NsYXNzRm9sZGVyRW50cnkoZW50cnkpOwotCQkJU3RyaW5nIHJ0Rm9sZGVyID0gYXR0cmliLmdldFZhbHVlKCk7Ci0JCQlpZiAocnRGb2xkZXIgPT0gbnVsbCkgewotCQkJCWlmIChpc0NsYXNzRm9sZGVyKSB7Ci0JCQkJCXJ0Rm9sZGVyID0gIi9XRUItSU5GL2NsYXNzZXMiOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJ0Rm9sZGVyID0gIi9XRUItSU5GL2xpYiI7Ci0JCQkJfQotCQkJfSAKLQkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCUlSZXNvdXJjZSBlbnRyeVJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihlbnRyeVBhdGgpOwotCQkJaWYgKGVudHJ5UmVzICE9IG51bGwpIHsKLQkJCQllbnRyeVBhdGggPSBlbnRyeVJlcy5nZXRMb2NhdGlvbigpOwotCQkJfQotCQkJLy8gVE9ETyBEZXRlcm1pbmUgaWYgZGlmZmVyZW50IGhhbmRsaW5nIGlzIG5lZWRlZCBmb3Igc29tZSB1c2UgY2FzZXMKLQkJCWlmIChpc0NsYXNzRm9sZGVyKSB7Ci0JCQkJIHZpc2l0b3IudmlzaXRXZWJSZXNvdXJjZShuZXcgUGF0aChydEZvbGRlciksIAotCQkgICAgICAgICAgICAgICAgICAgIGdldE9TUGF0aCh3YXJQcm9qZWN0LCBwcm9qZWN0LCBlbnRyeS5nZXRQYXRoKCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmlzaXRvci52aXNpdEFyY2hpdmVDb21wb25lbnQobmV3IFBhdGgocnRGb2xkZXIpLCBlbnRyeVBhdGgpOwkJCQkKLQkJCX0KLQkJfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJhdmVyc2VEZXBlbmRlbnRFbnRyaWVzKElNb2R1bGVWaXNpdG9yIHZpc2l0b3IsCi0gICAgICAgICAgICBJUGF0aCBydW50aW1lRm9sZGVyLCBXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElQcm9qZWN0IGRlcGVuZGVudFByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KGNvbXBvbmVudCk7Ci0gICAgICAgIGlmICghZGVwZW5kZW50UHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgSUphdmFQcm9qZWN0IHByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZGVwZW5kZW50UHJvamVjdCk7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOyAvLyBhc3N1bWUgaXQgaXMgdGhlIHNhbWUgYXMgVVJJCi0KLSAgICAgICAgLy8gZ28gdGhydSBhbGwgZW50cmllcwotICAgICAgICBMaXN0IHJlcyA9IGNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdG9yUmVzID0gcmVzLml0ZXJhdG9yKCk7IGl0b3JSZXMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQ29tcG9uZW50UmVzb3VyY2UgY2hpbGRDb21wID0gKENvbXBvbmVudFJlc291cmNlKSBpdG9yUmVzLm5leHQoKTsKLSAgICAgICAgICAgIElQYXRoIHJ0UGF0aCA9IGNoaWxkQ29tcC5nZXRSdW50aW1lUGF0aCgpOwotICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGdldENsYXNzcGF0aEVudHJ5KHByb2plY3QsIGNoaWxkQ29tcC5nZXRTb3VyY2VQYXRoKCkpOwotICAgICAgICAgICAgaWYgKGNwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgdmlzaXRvci52aXNpdERlcGVuZGVudENvbXBvbmVudChydW50aW1lRm9sZGVyLmFwcGVuZChydFBhdGgpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobmFtZSArICIuamFyIiksIGdldE9TUGF0aChkZXBlbmRlbnRQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LCBjcGUuZ2V0T3V0cHV0TG9jYXRpb24oKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5jbHVkZSB0YWdnZWQgY2xhc3NwYXRoIGVudHJpZXMKLSAgICAgICAgTWFwIGNsYXNzcGF0aERlcHMgPSBnZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMocHJvamVjdCwgZmFsc2UpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2xhc3NwYXRoRGVwcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSAoSUNsYXNzcGF0aEVudHJ5KWl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gaXNDbGFzc0ZvbGRlciA9IGlzQ2xhc3NGb2xkZXJFbnRyeShlbnRyeSk7Ci0JCQlTdHJpbmcgcnRGb2xkZXIgPSBudWxsOwotCQkJaWYgKGlzQ2xhc3NGb2xkZXIpIHsKLQkJCQlydEZvbGRlciA9ICIvIjsKLQkJCX0gZWxzZSB7Ci0JCQkJcnRGb2xkZXIgPSAiL1dFQi1JTkYvbGliIjsKLQkJCX0KLQkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCUlSZXNvdXJjZSBlbnRyeVJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihlbnRyeVBhdGgpOwotCQkJaWYgKGVudHJ5UmVzICE9IG51bGwpIHsKLQkJCQllbnRyeVBhdGggPSBlbnRyeVJlcy5nZXRMb2NhdGlvbigpOwotCQkJfQotCQkJLy8gVE9ETyBEZXRlcm1pbmUgaWYgZGlmZmVyZW50IGhhbmRsaW5nIGlzIG5lZWRlZCBmb3Igc29tZSB1c2UgY2FzZXMKLQkJCWlmIChpc0NsYXNzRm9sZGVyKSB7Ci0JCQkJIHZpc2l0b3IudmlzaXREZXBlbmRlbnRDb21wb25lbnQocnVudGltZUZvbGRlci5hcHBlbmQocnRGb2xkZXIpCi0JCSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuYW1lICsgIi5qYXIiKSwgZ2V0T1NQYXRoKGRlcGVuZGVudFByb2plY3QsCi0JCSAgICAgICAgICAgICAgICAgICAgcHJvamVjdCwgZW50cnkuZ2V0UGF0aCgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXZpc2l0b3IudmlzaXRBcmNoaXZlQ29tcG9uZW50KG5ldyBQYXRoKHJ0Rm9sZGVyKSwgZW50cnlQYXRoKTsKLQkJCX0KLQkJfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBnZXRDbGFzc3BhdGhFbnRyeShJSmF2YVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgIElQYXRoIHNvdXJjZVBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBzb3VyY2VQYXRoID0gcHJvamVjdC5nZXRQYXRoKCkuYXBwZW5kKHNvdXJjZVBhdGgpOwotICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2VQYXRoLmVxdWFscyhjcFtpXS5nZXRQYXRoKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGNwW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUGF0aCBnZXRPU1BhdGgoSVByb2plY3QgcHJvamVjdCwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LAotICAgICAgICAgICAgSVBhdGggb3V0cHV0UGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChvdXRwdXRQYXRoID09IG51bGwpCi0gICAgICAgICAgICBvdXRwdXRQYXRoID0gamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLSAgICAgICAgLy8gSWYgd2UgaGF2ZSB0aGUgcm9vdCBvZiBhIHByb2plY3QsIHJldHVybiBwcm9qZWN0IGxvY2F0aW9uCi0gICAgICAgIGlmIChvdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpIHsKLSAgICAgICAgCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3Qob3V0cHV0UGF0aC5sYXN0U2VnbWVudCgpKQotICAgICAgICAJCQkuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAvLyBPdGhlcndpc2UgcmV0dXJuIHByb2plY3QgZm9sZGVyIGxvY2F0aW9uCi0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihvdXRwdXRQYXRoKQotICAgICAgICAgICAgICAgIC5nZXRMb2NhdGlvbigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRGVyaXZlZCBmcm9tIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlc29sdmVkUGF0aEZvckFyY2hpdmVDb21wb25lbnQoKQotICAgICAqLwotCXByaXZhdGUgc3RhdGljIElQYXRoIGdldFJlc29sdmVkUGF0aEZvckFyY2hpdmVDb21wb25lbnQoVVJJIHVyaSkgewotCi0JCVN0cmluZyByZXNvdXJjZVR5cGUgPSB1cmkuc2VnbWVudCgxKTsKLQkJVVJJIGNvbnRlbnR1cmkgPSBNb2R1bGVVUklVdGlsLnRyaW1Ub1JlbGF0aXZlUGF0aCh1cmksIDIpOwotCQlTdHJpbmcgY29udGVudE5hbWUgPSBjb250ZW50dXJpLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKHJlc291cmNlVHlwZS5lcXVhbHMoImxpYiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIG1vZHVsZTovY2xhc3NwYXRoL2xpYi9EOi9mb28vZm9vLmphcgotCQkJcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGNvbnRlbnROYW1lKTsKLQotCQl9IGVsc2UgaWYgKHJlc291cmNlVHlwZS5lcXVhbHMoInZhciIpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gbW9kdWxlOi9jbGFzc3BhdGgvdmFyLzxDTEFTU1BBVEhWQVI+L2Zvby5qYXIKLQkJCVN0cmluZyBjbGFzc3BhdGhWYXIgPSBjb250ZW50dXJpLnNlZ21lbnQoMCk7Ci0JCQlVUkkgcmVtYWluaW5nUGF0aHVyaSA9IE1vZHVsZVVSSVV0aWwudHJpbVRvUmVsYXRpdmVQYXRoKGNvbnRlbnR1cmksIDEpOwotCQkJU3RyaW5nIHJlbWFpbmluZ1BhdGggPSByZW1haW5pbmdQYXRodXJpLnRvU3RyaW5nKCk7Ci0KLQkJCVN0cmluZ1tdIGNsYXNzcGF0aHZhcnMgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZU5hbWVzKCk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aHZhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY2xhc3NwYXRoVmFyLmVxdWFscyhjbGFzc3BhdGh2YXJzW2ldKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZCkgewotCQkJCUlQYXRoIHBhdGggPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZShjbGFzc3BhdGhWYXIpOwotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJVVJJIGZpbmFsdXJpID0gVVJJLmNyZWF0ZVVSSShwYXRoLnRvT1NTdHJpbmcoKSArIElQYXRoLlNFUEFSQVRPUiArIHJlbWFpbmluZ1BhdGgpOwotCQkJCQlyZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoZmluYWx1cmkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywKLQkJCQkJTkxTLmJpbmQoIlRvbWNhdCBwdWJsaXNoaW5nIGNvdWxkIG5vdCByZXNvbHZlIGRlcGVuZGVuY3kgVVJJIFwiezB9XCIuICBBIHZhbHVlIGZvciBjbGFzc3BhdGggdmFyaWFibGUgezF9IHdhcyBub3QgZm91bmQuIiwgdXJpLCBjbGFzc3BhdGhWYXIpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIERlcml2ZWQgZnJvbSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoKQotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBnZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBmaW5hbCBib29sZWFuIGlzV2ViQXBwKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gZ2V0IHRoZSByYXcgZW50cmllcwotCQlmaW5hbCBNYXAgcmVmZXJlbmNlZFJhd0VudHJpZXMgPSBnZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3QpOwotCQlmaW5hbCBNYXAgdmFsaWRSYXdFbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvLyBmaWx0ZXIgb3V0IG5vbi12YWxpZCByZWZlcmVuY2VkIHJhdyBlbnRyaWVzCi0JCWZpbmFsIEl0ZXJhdG9yIGkgPSByZWZlcmVuY2VkUmF3RW50cmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIGkubmV4dCgpOwotCQkJZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSAoSUNsYXNzcGF0aEF0dHJpYnV0ZSkgcmVmZXJlbmNlZFJhd0VudHJpZXMuZ2V0KGVudHJ5KTsKLQkJCWlmIChpc1ZhbGlkKGVudHJ5LCBhdHRyaWIsIGlzV2ViQXBwLCBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJdmFsaWRSYXdFbnRyaWVzLnB1dChlbnRyeSwgYXR0cmliKTsKLQkJCX0KLQkJfQotCi0JCS8vIGlmIHdlIGhhdmUgbm8gdmFsaWQgcmF3IGVudHJpZXMsIHJldHVybiBlbXB0eSBtYXAKLQkJaWYgKHZhbGlkUmF3RW50cmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCX0KLQotCQkvLyBYWFggV291bGQgbGlrZSB0byByZXBsYWNlIHRoZSBjb2RlIGJlbG93IHdpdGggdXNlIG9mIGEgcHVibGljIEpEVCBBUEkgdGhhdCByZXR1cm5zCi0JCS8vIHRoZSByYXcgSUNsYXNzcGF0aEVudHJ5IGZvciBhIGdpdmVuIHJlc29sdmVkIElDbGFzc3BhdGhFbnRyeSAoc2VlIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzOTk1KQotCQkvLyBUaGUgY29kZSBtdXN0IGN1cnJlbnRseSBsZXZlcmFnZSBJUGFja2FnZUZyYWdtZW50Um9vdCB0byBkZXRlcm1pbmUgdGhpcwotCQkvLyBtYXBwaW5nIGFuZCwgYmVjYXVzZSBJUGFja2FnZUZyYWdtZW50Um9vdHMgZG8gbm90IG1haW50YWluIElDbGFzc3BhdGhFbnRyeSBkYXRhLCBhIHByaW9yCi0JCS8vIGNhbGwgaXMgbmVlZGVkIHRvIGdldFJlc29sdmVkQ2xhc3NwYXRoKCkgYW5kIHRoZSByZXNvbHZlZCBJQ2xhc3NwYXRoRW50cmllcyBoYXZlIHRvIGJlIHN0b3JlZCBpbiBhIE1hcCBmcm9tIElQYXRoLXRvLUlDbGFzc3BhdGhFbnRyeSB0bwotCQkvLyBzdXBwb3J0IHJldHJpZXZhbCB1c2luZyB0aGUgcmVzb2x2ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QKLQkJCi0JCS8vIHJldHJpZXZlIHRoZSByZXNvbHZlZCBjbGFzc3BhdGgKLQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQlmaW5hbCBNYXAgcGF0aFRvUmVzb2x2ZWRFbnRyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQkvLyBzdG9yZSBpbiBhIG1hcCBmcm9tIHBhdGggdG8gZW50cnkKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKSB7Ci0JCQlwYXRoVG9SZXNvbHZlZEVudHJ5LnB1dChlbnRyaWVzW2pdLmdldFBhdGgoKSwgZW50cmllc1tqXSk7Ci0JCX0KLQotCQlmaW5hbCBNYXAgcmVmZXJlbmNlZEVudHJpZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCQkKLQkJLy8gZ3JhYiBhbGwgSVBhY2thZ2VGcmFnbWVudFJvb3RzCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHJvb3RzLmxlbmd0aDsgaisrKSB7Ci0JCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcm9vdHNbal07Ci0JCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgcmF3RW50cnkgPSByb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCk7Ci0JCQkKLQkJCS8vIGlzIHRoZSByYXcgZW50cnkgdmFsaWQ/Ci0JCQlJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYiA9IChJQ2xhc3NwYXRoQXR0cmlidXRlKSB2YWxpZFJhd0VudHJpZXMuZ2V0KHJhd0VudHJ5KTsKLQkJCWlmIChhdHRyaWIgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlmaW5hbCBJUGF0aCBwa2dGcmFnUGF0aCA9IHJvb3QuZ2V0UGF0aCgpOwotCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IHJlc29sdmVkRW50cnkgPSAoSUNsYXNzcGF0aEVudHJ5KSBwYXRoVG9SZXNvbHZlZEVudHJ5LmdldChwa2dGcmFnUGF0aCk7Ci0JCQlmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIHJlc29sdmVkQXR0cmliID0gY2hlY2tGb3JDb21wb25lbnREZXBlbmRlbmN5QXR0cmlidXRlKHJlc29sdmVkRW50cnksCi0JCQkJCURFUEVOREVDWUFUVFJJQlVURVRZUEVfREVQRU5ERU5DWV9PUl9OT05ERVBFTkRFTkNZKTsKLQkJCS8vIGF0dHJpYnV0ZSBmb3IgdGhlIHJlc29sdmVkIGVudHJ5IG11c3QgZWl0aGVyIGJlIHVuc3BlY2lmaWVkIG9yIGl0IG11c3QgYmUgdGhlCi0JCQkvLyBkZXBlbmRlbmN5IGF0dHJpYnV0ZSBmb3IgaXQgdG8gYmUgaW5jbHVkZWQKLQkJCWlmIChyZXNvbHZlZEF0dHJpYiA9PSBudWxsIHx8IHJlc29sdmVkQXR0cmliLmdldE5hbWUoKS5lcXVhbHMoQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZKSkgewotCQkJCS8vIGZpbHRlciBvdXQgcmVzb2x2ZWQgZW50cnkgaWYgaXQgZG9lc24ndCBwYXNzIHRoZSB2YWxpZGF0aW9uIHJ1bGVzCi0JCQkJaWYgKGlzVmFsaWQocmVzb2x2ZWRFbnRyeSwgcmVzb2x2ZWRBdHRyaWIgIT0gbnVsbCA/IHJlc29sdmVkQXR0cmliIDogYXR0cmliLCBpc1dlYkFwcCwgamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSkgewotCQkJCQlpZiAocmVzb2x2ZWRBdHRyaWIgIT0gbnVsbCkgewotCQkJCQkJLy8gaWYgdGhlcmUgaXMgYW4gYXR0cmlidXRlIG9uIHRoZSBzdWItZW50cnksIHVzZSB0aGF0Ci0JCQkJCQlhdHRyaWIgPSByZXNvbHZlZEF0dHJpYjsKLQkJCQkJfQotCQkJCQlyZWZlcmVuY2VkRW50cmllcy5wdXQocmVzb2x2ZWRFbnRyeSwgYXR0cmliKTsKLQkJCQl9Ci0JCQl9IAotCQl9Ci0JCQotICAgICAgICByZXR1cm4gcmVmZXJlbmNlZEVudHJpZXM7Ci0JfQotCi0JLyoKLQkgKiBEZXJpdmVkIGZyb20gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UmF3Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKCkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgZ2V0UmF3Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCQlmaW5hbCBNYXAgcmVmZXJlbmNlZFJhd0VudHJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLSAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliID0gY2hlY2tGb3JDb21wb25lbnREZXBlbmRlbmN5QXR0cmlidXRlKGVudHJ5LAotICAgICAgICAgICAgCQlERVBFTkRFQ1lBVFRSSUJVVEVUWVBFX0NMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSk7Ci0gICAgICAgICAgICBpZiAoYXR0cmliICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlyZWZlcmVuY2VkUmF3RW50cmllcy5wdXQoZW50cnksIGF0dHJpYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRSYXdFbnRyaWVzOwotCX0KLQotCS8qCi0JICogRGVyaXZlZCBmcm9tIENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmNoZWNrRm9yQ29tcG9uZW50RGVwZW5kZW5jeUF0dHJpYnV0ZSgpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUNsYXNzcGF0aEF0dHJpYnV0ZSBjaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGUoZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBmaW5hbCBpbnQgYXR0cmlidXRlVHlwZSkgewotCQlpZiAoZW50cnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMgPSBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKTsKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7Ci0JICAgIAlmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07Ci0JICAgIAlmaW5hbCBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JICAgIAlpZiAobmFtZS5lcXVhbHMoQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZKSkgewotCSAgICAJCWlmIChhdHRyaWJ1dGVUeXBlID09IERFUEVOREVDWUFUVFJJQlVURVRZUEVfREVQRU5ERU5DWV9PUl9OT05ERVBFTkRFTkNZCi0JICAgIAkJCQl8fCBhdHRyaWJ1dGVUeXBlID09IERFUEVOREVDWUFUVFJJQlVURVRZUEVfQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZKSB7Ci0JICAgIAkJCXJldHVybiBhdHRyaWJ1dGU7Ci0JICAgIAkJfQotCSAgICAJfSBlbHNlIGlmIChuYW1lLmVxdWFscyhDTEFTU1BBVEhfQ09NUE9ORU5UX05PTl9ERVBFTkRFTkNZKSkgewotCSAgICAJCWlmIChhdHRyaWJ1dGVUeXBlID09IERFUEVOREVDWUFUVFJJQlVURVRZUEVfREVQRU5ERU5DWV9PUl9OT05ERVBFTkRFTkNZCi0JICAgIAkJCQl8fCBhdHRyaWJ1dGVUeXBlID09IERFUEVOREVDWUFUVFJJQlVURVRZUEVfQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05ERVBFTkRFTkNZKSB7Ci0JICAgIAkJCXJldHVybiBhdHRyaWJ1dGU7Ci0JICAgIAkJfQotCSAgICAJfQotCSAgICB9Ci0JICAgIHJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogRGVyaXZlZCBmcm9tIENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IudmFsaWRhdGVWaXJ0dWFsQ29tcG9uZW50RW50cnkoKQotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliLCBib29sZWFuIGlzV2ViQXBwLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWludCBraW5kID0gZW50cnkuZ2V0RW50cnlLaW5kKCk7Ci0JCWJvb2xlYW4gaXNDbGFzc0ZvbGRlciA9IGlzQ2xhc3NGb2xkZXJFbnRyeShlbnRyeSk7Ci0JCQotCQlpZiAoa2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgfHwga2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIHJ1bnRpbWVQYXRoID0gZ2V0UnVudGltZVBhdGgoYXR0cmliLCBpc1dlYkFwcCwgaXNDbGFzc0ZvbGRlcik7Ci0JCWlmICghaXNXZWJBcHApIHsKLQkJCWlmICghcnVudGltZVBhdGguZXF1YWxzKCIuLi8iKSAmJiAhcnVudGltZVBhdGguZXF1YWxzKCIvIikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoaXNDbGFzc0ZvbGRlciAmJiAhcnVudGltZVBhdGguZXF1YWxzKCIvIikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocnVudGltZVBhdGggIT0gbnVsbCAmJiAhcnVudGltZVBhdGguZXF1YWxzKCIvV0VCLUlORi9saWIiKQotCQkJCQkmJiAhcnVudGltZVBhdGguZXF1YWxzKCIvV0VCLUlORi9jbGFzc2VzIikKLQkJCQkJJiYgIXJ1bnRpbWVQYXRoLmVxdWFscygiLi4vIikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoaXNDbGFzc0ZvbGRlciAmJiAhcnVudGltZVBhdGguZXF1YWxzKCIvV0VCLUlORi9jbGFzc2VzIikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qCi0JICogRGVyaXZlZCBmcm9tIENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmlzQ2xhc3NGb2xkZXJFbnRyeSgpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzRm9sZGVyRW50cnkoZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCWlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIGRvZXMgdGhlIHBhdGggcmVmZXIgdG8gYSBmaWxlIG9yIGEgZm9sZGVyPwotCQlmaW5hbCBJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCUlQYXRoIGVudHJ5TG9jYXRpb24gPSBlbnRyeVBhdGg7Ci0JCWZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihlbnRyeVBhdGgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJZW50cnlMb2NhdGlvbiA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJYm9vbGVhbiBpc0ZpbGUgPSB0cnVlOyAvLyBieSBkZWZhdWx0LCBhc3N1bWUgYSBqYXIgZmlsZQotCQlpZiAoZW50cnlMb2NhdGlvbi50b0ZpbGUoKS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlpc0ZpbGUgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gIWlzRmlsZTsKLQl9Ci0JCi0JLyoKLQkgKiBEZXJpdmVkIGZyb20gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UnVudGltZVBhdGgoKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSdW50aW1lUGF0aChmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYiwgZmluYWwgYm9vbGVhbiBpc1dlYkFwcCwgZmluYWwgYm9vbGVhbiBpc0NsYXNzRm9sZGVyKSB7Ci0gICAgCWlmIChhdHRyaWIgIT0gbnVsbCAmJiAhYXR0cmliLmdldE5hbWUoKS5lcXVhbHMoQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZKSkgewotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJaWYgKGF0dHJpYiA9PSBudWxsIHx8IGF0dHJpYi5nZXRWYWx1ZSgpPT0gbnVsbCB8fCBhdHRyaWIuZ2V0VmFsdWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgCQlpZiAoaXNXZWJBcHApIHsKLSAgICAJCQlyZXR1cm4gaXNDbGFzc0ZvbGRlciA/ICIvV0VCX0lORi9jbGFzc2VzIiA6ICJXRUItSU5GL2xpYiI7Ci0gICAgCQl9IGVsc2UgewotICAgIAkJCXJldHVybiBpc0NsYXNzRm9sZGVyID8gIi8iIDogIi4uLyI7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJcmV0dXJuIGF0dHJpYi5nZXRWYWx1ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL0ZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1ZTk4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiBGYWN0b3J5IGZvciByZWFkaW5nIGFuZCB3cml0aW5nIGZyb20gWE1MIGZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgRmFjdG9yeSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlTmFtZTsKLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0KLQlwdWJsaWMgRmFjdG9yeSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwcm90ZWN0ZWQgQXR0ciBjcmVhdGVBdHRyaWJ1dGUoU3RyaW5nIHMsIEVsZW1lbnQgZWxlbWVudCkgewotCQlBdHRyIGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUocyk7Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCQotCXByb3RlY3RlZCBYTUxFbGVtZW50IGNyZWF0ZUVsZW1lbnQoaW50IGluZGV4LCBTdHJpbmcgcywgTm9kZSBub2RlKSB7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gY3JlYXRlRWxlbWVudChzLCBub2RlKTsKLQkKLQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChzKTsKLQkJdHJ5IHsKLQkJCU5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsICYmICFzLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkgewotCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBjaGlsZCAhPSBudWxsICYmIGkgPCBpbmRleDsgaSsrKSB7Ci0JCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCXdoaWxlIChjaGlsZCAhPSBudWxsICYmICFzLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkgewotCQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gVE9ETyBUcnkgdG8gaW1wcm92ZSBmb3JtYXRpbmcsIG1heWJlIGR1cCBhbiBhcHByb3ByaWF0ZSB0ZXh0IG5vZGUKLQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCW5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIGNoaWxkKTsKLQkJCWVsc2UKLQkJCQlub2RlLmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbm9kZS5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbmV3SW5zdGFuY2UoZWxlbWVudCk7Ci0JfQotCQotCXByb3RlY3RlZCBYTUxFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHMsIE5vZGUgbm9kZSkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHMpOwotCQlub2RlLmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQlyZXR1cm4gbmV3SW5zdGFuY2UoZWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gWE1MVXRpbC5nZXRDb250ZW50cyhkb2N1bWVudCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlyZXR1cm4gcGFja2FnZU5hbWU7Ci0JfQotCi0JcHVibGljIFhNTEVsZW1lbnQgbG9hZERvY3VtZW50KElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCXJldHVybiBuZXdJbnN0YW5jZShlbGVtZW50KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIGxvYWRpbmcgZG9jdW1lbnQiLCBleGNlcHRpb24pOwotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9hZCBkb2N1bWVudCIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFhNTEVsZW1lbnQgbmV3SW5zdGFuY2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBzID0gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotCQl0cnkgewotCQkJLy8gY2hhbmdlICJ3ZWItYXBwOnRlc3QiIHRvICJXZWJBcHBUZXN0IgotCQkJcyA9IHMuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBzLnN1YnN0cmluZygxKTsKLQkJCWludCBpID0gcy5pbmRleE9mKCItIik7Ci0JCQl3aGlsZSAoaSA+PSAwKSB7Ci0JCQkJcyA9IHMuc3Vic3RyaW5nKDAsIGkpICsgcy5zdWJzdHJpbmcoaSsxLCBpKzIpLnRvVXBwZXJDYXNlKCkgKyBzLnN1YnN0cmluZyhpKzIpOwotCQkJCWkgPSBzLmluZGV4T2YoIi0iKTsKLQkJCX0KLQkJCWkgPSBzLmluZGV4T2YoIjoiKTsKLQkJCXdoaWxlIChpID49IDApIHsKLQkJCQlzID0gcy5zdWJzdHJpbmcoMCwgaSkgKyBzLnN1YnN0cmluZyhpKzEsIGkrMikudG9VcHBlckNhc2UoKSArIHMuc3Vic3RyaW5nKGkrMik7Ci0JCQkJaSA9IHMuaW5kZXhPZigiOiIpOwotCQkJfQotCQotCQkJLy8gYWRkIHBhY2thZ2UgbmFtZQotCQkJaWYgKHBhY2thZ2VOYW1lICE9IG51bGwpCi0JCQkJcyA9IHBhY2thZ2VOYW1lICsgIi4iICsgczsKLQkJCUNsYXNzIGNsYXNzMSA9IENsYXNzLmZvck5hbWUocyk7Ci0JCi0JCQlYTUxFbGVtZW50IHhtbEVsZW1lbnQgPSAoWE1MRWxlbWVudCkgY2xhc3MxLm5ld0luc3RhbmNlKCk7Ci0JCQl4bWxFbGVtZW50LnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCQl4bWxFbGVtZW50LnNldEZhY3RvcnkodGhpcyk7Ci0JCQlyZXR1cm4geG1sRWxlbWVudDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNhdmUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlYTUxVdGlsLnNhdmUoZmlsZW5hbWUsIGRvY3VtZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoRG9jdW1lbnQgZCkgewotCQlkb2N1bWVudCA9IGQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBzKSB7Ci0JCXBhY2thZ2VOYW1lID0gczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9YTUxFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9YTUxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZmIxNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvWE1MRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotLyoqCi0gKiBBbiBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIFhNTEVsZW1lbnQgewotCXByaXZhdGUgRWxlbWVudCB4bWxFbGVtZW50OwotCXByb3RlY3RlZCBGYWN0b3J5IGZhY3Rvcnk7Ci0KLQlwdWJsaWMgWE1MRWxlbWVudCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHhtbEVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIEF0dHIgYWRkQXR0cmlidXRlKFN0cmluZyBzLCBTdHJpbmcgczEpIHsKLQkJQXR0ciBhdHRyID0gZmFjdG9yeS5jcmVhdGVBdHRyaWJ1dGUocywgeG1sRWxlbWVudCk7Ci0JCWF0dHIuc2V0VmFsdWUoczEpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQlwdWJsaWMgWE1MRWxlbWVudCBjcmVhdGVFbGVtZW50KGludCBpbmRleCwgU3RyaW5nIHMpIHsKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlRWxlbWVudChpbmRleCwgcywgeG1sRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFhNTEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgcykgewotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHMsIHhtbEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBYTUxFbGVtZW50IGZpbmRFbGVtZW50KFN0cmluZyBzKSB7Ci0JCU5vZGVMaXN0IG5vZGVsaXN0ID0geG1sRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShzKTsKLQkJaW50IGkgPSBub2RlbGlzdCA9PSBudWxsID8gMCA6IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewotCQkJTm9kZSBub2RlID0gbm9kZWxpc3QuaXRlbShqKTsKLQkJCVN0cmluZyBzMSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKS50cmltKCk7Ci0JCQlpZiAoczEuZXF1YWxzKHMpKQotCQkJCXJldHVybiBmYWN0b3J5Lm5ld0luc3RhbmNlKChFbGVtZW50KSBub2RlKTsKLQkJfQotCQotCQlyZXR1cm4gY3JlYXRlRWxlbWVudChzKTsKLQl9Ci0KLQlwdWJsaWMgWE1MRWxlbWVudCBmaW5kRWxlbWVudChTdHJpbmcgcywgaW50IGkpIHsKLQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSB4bWxFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHMpOwotCQlpbnQgaiA9IG5vZGVsaXN0ID09IG51bGwgPyAwIDogbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGsgPSAwOyBrIDwgajsgaysrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2RlbGlzdC5pdGVtKGspOwotCQkJU3RyaW5nIHMxID0gbm9kZS5nZXROb2RlTmFtZSgpLnRyaW0oKTsKLQkJCWlmIChzMS5lcXVhbHMocykgJiYgayA9PSBpKQotCQkJCXJldHVybiBmYWN0b3J5Lm5ld0luc3RhbmNlKChFbGVtZW50KSBub2RlKTsKLQkJfQotCQotCQlyZXR1cm4gY3JlYXRlRWxlbWVudChzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBzKSB7Ci0JCUF0dHIgYXR0ciA9IHhtbEVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShzKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JCU5hbWVkTm9kZU1hcCBhdHRycyA9IHhtbEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAobnVsbCAhPSBhdHRycykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBhdHRyID0gYXR0cnMuaXRlbShpKTsKLQkJCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBhdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJCWF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIHhtbEVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VmFsdWUoeG1sRWxlbWVudCk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRWYWx1ZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHMgPSBlbGVtZW50LmdldE5vZGVWYWx1ZSgpOwotCQlpZiAocyAhPSBudWxsKQotCQkJcmV0dXJuIHM7Ci0JCU5vZGVMaXN0IG5vZGVsaXN0ID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCWlmIChub2RlbGlzdC5pdGVtKGkpIGluc3RhbmNlb2YgVGV4dCkKLQkJCQlyZXR1cm4gKChUZXh0KSBub2RlbGlzdC5pdGVtKGkpKS5nZXREYXRhKCk7Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgRWxlbWVudCBnZXRTdWJFbGVtZW50KFN0cmluZyBzKSB7Ci0JCU5vZGVMaXN0IG5vZGVsaXN0ID0geG1sRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShzKTsKLQkJaW50IGkgPSBub2RlbGlzdCA9PSBudWxsID8gMCA6IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewotCQkJTm9kZSBub2RlID0gbm9kZWxpc3QuaXRlbShqKTsKLQkJCVN0cmluZyBzMSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKS50cmltKCk7Ci0JCQlpZiAoczEuZXF1YWxzKHMpKQotCQkJCXJldHVybiAoRWxlbWVudCkgbm9kZTsKLQkJfQotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN1YkVsZW1lbnRWYWx1ZShTdHJpbmcgcykgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRTdWJFbGVtZW50KHMpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCi0JCVN0cmluZyB2YWx1ZSA9IGdldEVsZW1lbnRWYWx1ZShlbGVtZW50KTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiB2YWx1ZS50cmltKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBzKSB7Ci0JCXRyeSB7Ci0JCQl4bWxFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShzKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUVsZW1lbnQoU3RyaW5nIHMsIGludCBpKSB7Ci0JCU5vZGVMaXN0IG5vZGVsaXN0ID0geG1sRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShzKTsKLQkJaW50IGogPSBub2RlbGlzdCA9PSBudWxsID8gMCA6IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBrID0gMDsgayA8IGo7IGsrKykgewotCQkJTm9kZSBub2RlID0gbm9kZWxpc3QuaXRlbShrKTsKLQkJCVN0cmluZyBzMSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKS50cmltKCk7Ci0JCQlpZiAoczEuZXF1YWxzKHMpICYmIGsgPT0gaSkgewotCQkJCXhtbEVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBzLCBTdHJpbmcgczEpIHsKLQkJQXR0ciBhdHRyID0geG1sRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKHMpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJYXR0ciA9IGFkZEF0dHJpYnV0ZShzLCBzMSk7Ci0JCWVsc2UKLQkJCWF0dHIuc2V0VmFsdWUoczEpOwotCX0KLQotCXZvaWQgc2V0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJeG1sRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldEVsZW1lbnRWYWx1ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgcyA9IGVsZW1lbnQuZ2V0Tm9kZVZhbHVlKCk7Ci0JCWlmIChzICE9IG51bGwpIHsKLQkJCWVsZW1lbnQuc2V0Tm9kZVZhbHVlKHZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlOb2RlTGlzdCBub2RlbGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQlpZiAobm9kZWxpc3QuaXRlbShpKSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgbm9kZWxpc3QuaXRlbShpKTsKLQkJCQl0ZXh0LnNldERhdGEodmFsdWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkKLQkJcmV0dXJuOwotCX0KLQotCXZvaWQgc2V0RmFjdG9yeShGYWN0b3J5IGZhY3RvcnkxKSB7Ci0JCWZhY3RvcnkgPSBmYWN0b3J5MTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdWJFbGVtZW50VmFsdWUoU3RyaW5nIHMsIFN0cmluZyB2YWx1ZSkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRTdWJFbGVtZW50KHMpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQllbGVtZW50ID0gZmFjdG9yeS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KHMpOwotCQkJZWxlbWVudC5hcHBlbmRDaGlsZChmYWN0b3J5LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJ0ZW1wIikpOwotCQkJeG1sRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJfQotCQlzZXRFbGVtZW50VmFsdWUoZWxlbWVudCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZU9mRWxlbWVudChTdHJpbmcgcykgewotCQlOb2RlTGlzdCBub2RlbGlzdCA9IHhtbEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUocyk7Ci0JCWludCBpID0gbm9kZWxpc3QgPT0gbnVsbCA/IDAgOiBub2RlbGlzdC5nZXRMZW5ndGgoKTsKLQkJcmV0dXJuIGk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudFZhbHVlKFN0cmluZyBzKSB7Ci0JCXRyeSB7Ci0JCQl4bWxFbGVtZW50LnNldE5vZGVWYWx1ZShzKTsKLQkJfSBjYXRjaCAoRE9NRXhjZXB0aW9uIGV4KSB7Ci0JCQlOb2RlTGlzdCBub2RlbGlzdCA9IHhtbEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJaW50IGkgPSBub2RlbGlzdCA9PSBudWxsID8gMCA6IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCQkJaWYgKGkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJCWlmIChub2RlbGlzdC5pdGVtKGopIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCQkJKChUZXh0KSBub2RlbGlzdC5pdGVtKGopKS5zZXREYXRhKHMpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXhtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZmFjdG9yeS5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIHhtbEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZHJlbigpCi0JewotCQl3aGlsZSAoeG1sRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCXhtbEVsZW1lbnQucmVtb3ZlQ2hpbGQoeG1sRWxlbWVudC5nZXRGaXJzdENoaWxkKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvcHlDaGlsZHJlblRvKFhNTEVsZW1lbnQgZGVzdGluYXRpb24pIHsKLQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSB4bWxFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IGxlbiA9IG5vZGVsaXN0ID09IG51bGwgPyAwIDogbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVsaXN0Lml0ZW0oaSk7Ci0JCQlkZXN0aW5hdGlvbi5pbXBvcnROb2RlKG5vZGUsIHRydWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGltcG9ydE5vZGUoTm9kZSBub2RlLCBib29sZWFuIGRlZXApIHsKLQkJeG1sRWxlbWVudC5hcHBlbmRDaGlsZCh4bWxFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5pbXBvcnROb2RlKG5vZGUsIGRlZXApKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB0cmllcyB0byBjb21wYXJlIHR3byBYTUxFbGVtZW50cyBmb3IgZXF1aXZhbGVuY2UuIER1ZSB0bwotCSAqIHRoZSBsYWNrIG9mIG5vcm1hbGl6YXRpb24sIHRoZXkgYXJlbid0IGNvbXBhcmVkIGZvciBlcXVhbGl0eS4gRWxlbWVudHMKLQkgKiBhcmUgcmVxdWlyZWQgdG8gaGF2ZSB0aGUgc2FtZSBhdHRyaWJ1dGVzIG9yIHRoZSBzYW1lIG5vZGUgdmFsdWUKLQkgKiBpZiBhdHRyaWJ1dGVzIGFyZW4ndCBwcmVzZW50LiBBdHRyaWJ1dGVzIGFuZCBub2RlIHZhbHVlIGFyZSBhc3N1bWVkCi0JICogdG8gYmUgbXV0dWFsbHkgZXhjbHVzaXZlIGZvciBUb21jYXQgY29uZmlndXJhdGlvbiBYTUwgZmlsZXMuIFRoZQotCSAqIHNhbWUgbm9uLXRleHQgY2hpbGQgbm9kZXMgYXJlIHJlcXVpcmVkIHRvIGJlIHByZXNlbnQgaW4gYW4gZWxlbWVudAotCSAqIGFuZCBhcHBlYXIgaW4gdGhlIHNhbWUgb3JkZXIuIElmIGEgbm9kZSB0eXBlIG90aGVyIHRoYW4gZWxlbWVudCBvcgotCSAqIGNvbW1lbnQgaXMgZW5jb3VudGVyZWQsIHRoaXMgbWV0aG9kIHB1bnRzIGFuZCByZXR1cm5zIGZhbHNlLgotCSAqIAotCSAqIEBwYXJhbSBvYmogWE1MRWxlbWVudCB0byBjb21wYXJlCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBhcmUgZXF1aXZhbGVudAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudChYTUxFbGVtZW50IG9iaikgewotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnRzQXJlRXF1aXZhbGVudCh4bWxFbGVtZW50LCBvYmouZ2V0RWxlbWVudE5vZGUoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBDYXRjaCBhbmQgaWdub3JlIGp1c3QgdG8gYmUgc2FmZQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTYW1lIGFzIGlzRXF1aXZhbGVudCgpIGJ1dCBkb2Vzbid0IGlnbm9yZSBleGNlcHRpb25zIGZvciB0ZXN0IHB1cnBvc2VzLgotCSAqIFRoaXMgYXZvaWRzIGhpZGluZyBhbiBleHBlY3RlZCBtaXNtYXRjaCBiZWhpbmQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIG9iaiBYTUxFbGVtZW50IHRvIGNvbXBhcmUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGFyZSBlcXVpdmFsZW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50VGVzdChYTUxFbGVtZW50IG9iaikgewotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCXJldHVybiBlbGVtZW50c0FyZUVxdWl2YWxlbnQoeG1sRWxlbWVudCwgb2JqLmdldEVsZW1lbnROb2RlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZUVxdWl2YWxlbnQoRWxlbWVudCBlbGVtZW50LCBFbGVtZW50IG90aGVyRWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBvdGhlckVsZW1lbnQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmICghZWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscyhvdGhlckVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCWlmIChvdGhlckVsZW1lbnQuaGFzQ2hpbGROb2RlcygpICYmIGF0dHJpYnV0ZXNBcmVFcXVhbChlbGVtZW50LCBvdGhlckVsZW1lbnQpKSB7Ci0JCQkJLy8gQ29tcGFyZSBjaGlsZCBub2RlcwotCQkJCU5vZGVMaXN0IG5vZGVsaXN0ID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJTm9kZUxpc3Qgb3RoZXJOb2RlbGlzdCA9IG90aGVyRWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJaWYgKG5vZGVsaXN0LmdldExlbmd0aCgpID09IG90aGVyTm9kZWxpc3QuZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJTm9kZSBub2RlID0gbmV4dE5vblRleHROb2RlKGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJCQkJTm9kZSBvdGhlck5vZGUgPSBuZXh0Tm9uVGV4dE5vZGUob3RoZXJFbGVtZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0JCQkJCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCQkJCWlmIChvdGhlck5vZGUgPT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQlzaG9ydCBuZXh0Tm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQkJCQlpZiAobmV4dE5vZGVUeXBlICE9IG90aGVyTm9kZS5nZXROb2RlVHlwZSgpKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCS8vIElmIGVsZW1lbnRzLCBjb21wYXJlIAotCQkJCQkJaWYgKG5leHROb2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJCWlmICghZWxlbWVudHNBcmVFcXVpdmFsZW50KChFbGVtZW50KW5vZGUsIChFbGVtZW50KW90aGVyTm9kZSkpCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCS8vIEVsc2UgaWYgY29tbWVudCwgY29tcGFyZQotCQkJCQkJZWxzZSBpZiAobmV4dE5vZGVUeXBlID09IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0JCQkJCQkJaWYgKCFub2RlVmFsdWVzQXJlRXF1YWwobm9kZSwgb3RoZXJOb2RlKSkKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQkJLy8gRWxzZSBwdW50IG9uIG90aGVyIG5vZGUgdHlwZXMKLQkJCQkJCWVsc2UgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCW5vZGUgPSBuZXh0Tm9uVGV4dE5vZGUobm9kZS5nZXROZXh0U2libGluZygpKTsKLQkJCQkJCW90aGVyTm9kZSA9IG5leHROb25UZXh0Tm9kZShvdGhlck5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJLy8gSWYgYWxzbyBhdCBlbmQgb2Ygb3RoZXIgY2hpbGRyZW4sIHJldHVybiBlcXVhbAotCQkJCQlpZiAob3RoZXJOb2RlID09IG51bGwpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIW90aGVyRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGVzQXJlRXF1YWwoZWxlbWVudCwgb3RoZXJFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE5vZGUgbmV4dE5vblRleHROb2RlKE5vZGUgbm9kZSkgewotCQl3aGlsZSAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYXR0cmlidXRlc0FyZUVxdWFsKEVsZW1lbnQgZWxlbWVudCwgRWxlbWVudCBvdGhlckVsZW1lbnQpIHsKLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCU5hbWVkTm9kZU1hcCBvdGhlckF0dHJzID0gb3RoZXJFbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJzID09IG51bGwgJiYgb3RoZXJBdHRycyA9PSBudWxsKSB7Ci0JCQkvLyBSZXR1cm4gY29tcGFyaXNvbiBvZiBlbGVtZW50IHZhbHVlcyBpZiB0aGVyZSBhcmUgbm8gYXR0cmlidXRlcwotCQkJcmV0dXJuIG5vZGVWYWx1ZXNBcmVFcXVhbChlbGVtZW50LCBvdGhlckVsZW1lbnQpOwotCQl9Ci0JCQotCQlpZiAoYXR0cnMuZ2V0TGVuZ3RoKCkgPT0gb3RoZXJBdHRycy5nZXRMZW5ndGgoKSkgewotCQkJaWYgKGF0dHJzLmdldExlbmd0aCgpID09IDApCi0JCQkJLy8gUmV0dXJuIGNvbXBhcmlzb24gb2YgZWxlbWVudCB2YWx1ZXMgaWYgdGhlcmUgYXJlIG5vIGF0dHJpYnV0ZXMKLQkJCQlyZXR1cm4gbm9kZVZhbHVlc0FyZUVxdWFsKGVsZW1lbnQsIG90aGVyRWxlbWVudCk7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgYXR0ciA9IGF0dHJzLml0ZW0oaSk7Ci0JCQkJTm9kZSBvdGhlckF0dHIgPSBvdGhlckF0dHJzLmdldE5hbWVkSXRlbShhdHRyLmdldE5vZGVOYW1lKCkpOwotCQkJCWlmICghbm9kZVZhbHVlc0FyZUVxdWFsKGF0dHIsIG90aGVyQXR0cikpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBub2RlVmFsdWVzQXJlRXF1YWwoTm9kZSBub2RlLCBOb2RlIG90aGVyTm9kZSkgewotCQlTdHJpbmcgdmFsdWUgPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotCQlTdHJpbmcgb3RoZXJWYWx1ZSA9IG90aGVyTm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgb3RoZXJWYWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAodmFsdWUuZXF1YWxzKG90aGVyVmFsdWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHZhbHVlID09IG51bGwgJiYgb3RoZXJWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9YTUxVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9YTUxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0M2YxZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvWE1MVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBjcmVhdGUgYW5kIHJlYWQgWE1MIGRvY3VtZW50cy4KLSAqLwotcHVibGljIGNsYXNzIFhNTFV0aWwgewotCXByaXZhdGUgc3RhdGljIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXI7Ci0KLQkvKioKLQkgKiBYTUxVdGlsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhNTFV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGdldERvY3VtZW50QnVpbGRlcigpIHsKLQkJaWYgKGRvY3VtZW50QnVpbGRlciA9PSBudWxsKQotCQkJdHJ5IHsKLQkJCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQkJZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKGZhbHNlKTsKLQkJCQlmYWN0b3J5LnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoZmFsc2UpOwotCQkJCS8vZmFjdG9yeS5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9ub252YWxpZGF0aW5nL2xvYWQtZXh0ZXJuYWwtZHRkIiwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCQlkb2N1bWVudEJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJCWRvY3VtZW50QnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihuZXcgRW50aXR5UmVzb2x2ZXIoKSB7Ci0JCQkJCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCQkJCQlyZXR1cm4gbmV3IElucHV0U291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIlJycm9yIGNyZWF0aW5nIGRvY3VtZW50IGJ1aWxkZXIiKTsKLQkJCX0KLQotCQlyZXR1cm4gZG9jdW1lbnRCdWlsZGVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGNoaWxkIG9mIHRoZSBnaXZlbiBub2RlIGF0IHRoZSBnaXZlbiBpbmRleC4KLQkgKgotCSAqIEBwYXJhbSBkb2MgYSBkb2N1bWVudAotCSAqIEBwYXJhbSBlbGVtZW50IGFuIGVsZW1lbnQKLQkgKiBAcGFyYW0gaW5kZXggYW4gaW5kZXgKLQkgKiBAcGFyYW0gbm9kZU5hbWUgYSBub2RlIG5hbWUKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlQ2hpbGRFbGVtZW50KERvY3VtZW50IGRvYywgRWxlbWVudCBlbGVtZW50LCBpbnQgaW5kZXgsIFN0cmluZyBub2RlTmFtZSkgewotCQlFbGVtZW50IGVsZW1lbnQyID0gZG9jLmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpOwotCQl0cnkgewotCQkJTm9kZUxpc3QgY2hpbGRMaXN0ID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShub2RlTmFtZSk7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRMaXN0Lml0ZW0oaW5kZXgpOwotCQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoZWxlbWVudDIsIGNoaWxkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudDIpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50MjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjaGlsZCBvZiB0aGUgZ2l2ZW4gbm9kZS4KLQkgKgotCSAqIEBwYXJhbSBkb2MgYSBkb2N1bWVudAotCSAqIEBwYXJhbSBub2RlIGEgbm9kZQotCSAqIEBwYXJhbSBub2RlTmFtZSBhIG5vZGUgbmFtZQotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVDaGlsZEVsZW1lbnQoRG9jdW1lbnQgZG9jLCBOb2RlIG5vZGUsIFN0cmluZyBub2RlTmFtZSkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7Ci0JCW5vZGUuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbm9kZSB0byB0aGUgZ2l2ZW4gdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlVGV4dENoaWxkRWxlbWVudChEb2N1bWVudCBkb2MsIE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVDaGlsZEVsZW1lbnQoZG9jLCBub2RlLCBuYW1lKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUodmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudCBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIGF0dHIgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHIpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShhdHRyKS5nZXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldENvbnRlbnRzKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQl0cnkgewotCQkJcHJpbnQobmV3IFByaW50U3RyZWFtKG91dCwgdHJ1ZSwgIlVURi04IiksIGRvY3VtZW50KTsKLQkJCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZXguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXREb2N1bWVudFR5cGVEYXRhKERvY3VtZW50VHlwZSBkb2N0eXBlKSB7Ci0JCVN0cmluZyBkYXRhID0gZG9jdHlwZS5nZXROYW1lKCk7Ci0JCWlmIChkb2N0eXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCkgewotCQkJZGF0YSArPSAiIFBVQkxJQyBcIiIgKyBkb2N0eXBlLmdldFB1YmxpY0lkKCkgKyAiXCIiOwotCQkJU3RyaW5nIHN5c3RlbUlkID0gZG9jdHlwZS5nZXRTeXN0ZW1JZCgpOwotCQkJaWYgKHN5c3RlbUlkID09IG51bGwpCi0JCQkJc3lzdGVtSWQgPSAiIjsKLQkJCWRhdGEgKz0gIiBcIiIgKyBzeXN0ZW1JZCArICJcIiI7Ci0JCX0gZWxzZQotCQkJZGF0YSArPSAiIFNZU1RFTSBcIiIgKyBkb2N0eXBlLmdldFN5c3RlbUlkKCkgKyAiXCIiOwotCQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHRoZSBzdWJlbGVtZW50cy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqIEBwYXJhbSBlbGVtZW50IG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXROb2RlSXRlcmF0b3IoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZSkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShuYW1lKTsKLQkKLQkJaW50IGxlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJbGlzdC5hZGQobm9kZUxpc3QuaXRlbShpKSk7Ci0JCi0JCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGlzIG5vZGUuIFdpbGwgcmV0dXJuICIiIGluc3RlYWQgb2YgbnVsbC4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbm9kZSBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKE5vZGUgbm9kZSkgewotCQlOb2RlTGlzdCBub2RlTGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQotCQlpbnQgbGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgbiA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAobiBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlUZXh0IHQgPSAoVGV4dCkgbjsKLQkJCQlyZXR1cm4gdC5nZXROb2RlVmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGEgc3Vibm9kZS4KLQotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN1Yk5vZGVWYWx1ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lKSB7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShuYW1lKTsKLQkJcmV0dXJuIGdldE5vZGVWYWx1ZShub2RlTGlzdC5pdGVtKDApKS50cmltKCk7Ci0JfQotCi0JLyoKLQkgKiBJbnNlcnQgdGhlIGdpdmVuIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFRleHQoRG9jdW1lbnQgZG9jLCBOb2RlIG5vZGUsIFN0cmluZyB0ZXh0KSB7Ci0JCW5vZGUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbih0ZXh0KSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJpbmdidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBpID0gcyA9PSBudWxsID8gMCA6IHMubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChqKTsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgNjAgOiAvKiAnPCcgKi8KLQkJCQkJc3RyaW5nYnVmZmVyLmFwcGVuZCgiJmx0OyIpOwotCQkJCQlicmVhazsKLQkKLQkJCQljYXNlIDYyIDogLyogJz4nICovCi0JCQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoIiZndDsiKTsKLQkJCQkJYnJlYWs7Ci0JCi0JCQkJY2FzZSAzOCA6IC8qICcmJyAqLwotCQkJCQlzdHJpbmdidWZmZXIuYXBwZW5kKCImYW1wOyIpOwotCQkJCQlicmVhazsKLQkKLQkJCQljYXNlIDM0IDogLyogJyInICovCi0JCQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoIiZxdW90OyIpOwotCQkJCQlicmVhazsKLQkKLQkJCQljYXNlIDEwIDogLyogJ1xuJyAqLwotCQkJCWNhc2UgMTMgOiAvKiAnXHInICovCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJCWJyZWFrOwotCQotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBzdHJpbmdidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcHJpbnQoUHJpbnRTdHJlYW0gb3V0LCBOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfTk9ERTogewotCQkJCW91dC5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsKLQkJCQkvL291dC5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJJU08tODg1OS0xXCI/PlxuIik7Ci0JCQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQlpbnQgc2l6ZSA9IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQlwcmludChvdXQsIG5vZGVsaXN0Lml0ZW0oaSkpOwotCQkJCWJyZWFrOwotCQkJfQotCQotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERTogewotCQkJCURvY3VtZW50VHlwZSBkb2NUeXBlID0gKERvY3VtZW50VHlwZSkgbm9kZTsKLQkJCQlvdXQucHJpbnQoIjwhRE9DVFlQRSAiICsgZ2V0RG9jdW1lbnRUeXBlRGF0YShkb2NUeXBlKSArICI+XG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6IHsKLQkJCQlvdXQucHJpbnQoJzwnKTsKLQkJCQlvdXQucHJpbnQobm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQlOYW1lZE5vZGVNYXAgbWFwID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplID0gbWFwLmdldExlbmd0aCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJQXR0ciBhdHRyID0gKEF0dHIpIG1hcC5pdGVtKGkpOwotCQkJCQkJb3V0LnByaW50KCcgJyk7Ci0JCQkJCQlvdXQucHJpbnQoYXR0ci5nZXROb2RlTmFtZSgpKTsKLQkJCQkJCW91dC5wcmludCgiPVwiIik7Ci0JCQkJCQlvdXQucHJpbnQobm9ybWFsaXplKGF0dHIuZ2V0Tm9kZVZhbHVlKCkpKTsKLQkJCQkJCW91dC5wcmludCgnIicpOwotCQkJCQl9Ci0JCQkJfQotCQotCQkJCWlmICghbm9kZS5oYXNDaGlsZE5vZGVzKCkpCi0JCQkJCW91dC5wcmludCgiLz4iKTsKLQkJCQllbHNlIHsKLQkJCQkJb3V0LnByaW50KCc+Jyk7Ci0JCQkJCU5vZGVMaXN0IG5vZGVsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWludCBudW1DaGlsZHJlbiA9IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuOyBpKyspCi0JCQkJCQlwcmludChvdXQsIG5vZGVsaXN0Lml0ZW0oaSkpOwotCQotCQkJCQlvdXQucHJpbnQoIjwvIik7Ci0JCQkJCW91dC5wcmludChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCQlvdXQucHJpbnQoJz4nKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCi0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOiB7Ci0JCQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQlpZiAobm9kZWxpc3QgIT0gbnVsbCkgewotCQkJCQlpbnQgc2l6ZSA9IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJCXByaW50KG91dCwgbm9kZWxpc3QuaXRlbShpKSk7Ci0JCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERTogewotCQkJCW91dC5wcmludChub3JtYWxpemUobm9kZS5nZXROb2RlVmFsdWUoKSkpOwotCQkJCWJyZWFrOwotCQkJfQotCQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERTogewotCQkJCW91dC5wcmludChub3JtYWxpemUobm9kZS5nZXROb2RlVmFsdWUoKSkpOwotCQkJCWJyZWFrOwotCQkJfQotCQotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTogewotCQkJCW91dC5wcmludCgiPD8iKTsKLQkJCQlvdXQucHJpbnQobm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQlTdHJpbmcgcyA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkgewotCQkJCQlvdXQucHJpbnQoJyAnKTsKLQkJCQkJb3V0LnByaW50KHMpOwotCQkJCX0KLQkJCQlvdXQucHJpbnQoIj8+Iik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCi0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFOiB7Ci0JCQkJb3V0LnByaW50KCI8IS0tIik7Ci0JCQkJb3V0LnByaW50KG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJCW91dC5wcmludCgiLS0+Iik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCi0JCQlkZWZhdWx0OiB7Ci0JCQkJb3V0LnByaW50KG5vcm1hbGl6ZShub2RlLmdldE5vZGVWYWx1ZSgpKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJb3V0LmZsdXNoKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmUoU3RyaW5nIGZpbGVuYW1lLCBEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJpbnRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpKSwgdHJ1ZSwgIlVURi04Iik7Ci0JCQkvL3RyYWNlTm9kZShkb2N1bWVudCwgIiIpOwotCQkJcHJpbnQob3V0LCBkb2N1bWVudCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGV4LmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmUoU3RyaW5nIGZpbGVuYW1lLCBOb2RlIG5vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByaW50U3RyZWFtIG91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlvdXQgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSksIHRydWUsICJVVEYtOCIpOwotCQkJcHJpbnQob3V0LCBub2RlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZXguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHN1Ym5vZGUKLQkgKgotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdmFsdWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXROb2RlVmFsdWUoTm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBzID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJaWYgKHMgIT0gbnVsbCkgewotCQkJbm9kZS5zZXROb2RlVmFsdWUodmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCU5vZGVMaXN0IG5vZGVsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKG5vZGVsaXN0Lml0ZW0oaSkgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIG5vZGVsaXN0Lml0ZW0oaSk7Ci0JCQkJdGV4dC5zZXREYXRhKHZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVByaW50U3RyZWFtIG91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMjA0OCk7Ci0JCQlvdXQgPSBuZXcgUHJpbnRTdHJlYW0oYmFvcyk7Ci0JCQlwcmludChvdXQsIGRvY3VtZW50KTsKLQkJCXJldHVybiBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04Iik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy8gaWdub3JlCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL0Nvbm5lY3Rvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvQ29ubmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzI0ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvQ29ubmVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3IgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQlwdWJsaWMgQ29ubmVjdG9yKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIpOwotCX0KLQkKLQlwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChQYXJhbWV0ZXIpIGZpbmRFbGVtZW50KCJQYXJhbWV0ZXIiLCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVyQ291bnQoKSB7Ci0JCXJldHVybiBzaXplT2ZFbGVtZW50KCJQYXJhbWV0ZXIiKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIsIGNsYXNzTmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL0NvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NjhlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0IGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JcHVibGljIENvbnRleHQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDcm9zc0NvbnRleHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiY3Jvc3NDb250ZXh0Iik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVidWcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREb2NCYXNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImRvY0Jhc2UiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInBhdGgiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSZWxvYWRhYmxlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInJlbG9hZGFibGUiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgic291cmNlIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHJ1c3RlZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJ0cnVzdGVkIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENyb3NzQ29udGV4dChTdHJpbmcgY3Jvc3NDb250ZXh0KSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJjcm9zc0NvbnRleHQiLCBjcm9zc0NvbnRleHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWJ1ZyhTdHJpbmcgZGVidWcpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIiwgZGVidWcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREb2NCYXNlKFN0cmluZyBkb2NCYXNlKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJkb2NCYXNlIiwgZG9jQmFzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInBhdGgiLCBwYXRoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVsb2FkYWJsZShTdHJpbmcgcmVsb2FkYWJsZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgicmVsb2FkYWJsZSIsIHJlbG9hZGFibGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgic291cmNlIiwgc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VHJ1c3RlZChTdHJpbmcgdHJ1c3RlZCkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgidHJ1c3RlZCIsIHRydXN0ZWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9Db250ZXh0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvQ29udGV4dE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4MjlkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9Db250ZXh0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXIzMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dE1hbmFnZXIgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQlwdWJsaWMgQ29udGV4dE1hbmFnZXIoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQ29ubmVjdG9yKSBmaW5kRWxlbWVudCgiQ29ubmVjdG9yIiwgaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENvbm5lY3RvckNvdW50KCkgewotCQlyZXR1cm4gc2l6ZU9mRWxlbWVudCgiQ29ubmVjdG9yIik7Ci0JfQotCQotCXB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQ29udGV4dCkgZmluZEVsZW1lbnQoIkNvbnRleHQiLCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0Q29udGV4dENvdW50KCkgewotCQlyZXR1cm4gc2l6ZU9mRWxlbWVudCgiQ29udGV4dCIpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENvbnRleHRJbnRlcmNlcHRvckNvdW50KCkgewotCQlyZXR1cm4gc2l6ZU9mRWxlbWVudCgiQ29udGV4dEludGVyY2VwdG9yIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVidWcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRIb21lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImhvbWUiKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRSZXF1ZXN0SW50ZXJjZXB0b3JDb3VudCgpIHsKLQkJcmV0dXJuIHNpemVPZkVsZW1lbnQoIlJlcXVlc3RJbnRlcmNlcHRvciIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNob3dEZWJ1Z0luZm8oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgic2hvd0RlYnVnSW5mbyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFdvcmtEaXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgid29ya0RpciIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWJ1ZyhTdHJpbmcgZGVidWcpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIiwgZGVidWcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRIb21lKFN0cmluZyBob21lKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJob21lIiwgaG9tZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNob3dEZWJ1Z0luZm8oU3RyaW5nIHNob3dEZWJ1Z0luZm8pIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInNob3dEZWJ1Z0luZm8iLCBzaG93RGVidWdJbmZvKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V29ya0RpcihTdHJpbmcgd29ya0RpcikgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgid29ya0RpciIsIHdvcmtEaXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9QYXJhbWV0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL1BhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA4Y2YxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL1BhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXIzMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyIGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JcHVibGljIFBhcmFtZXRlcigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInZhbHVlIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJ2YWx1ZSIsIHZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9TZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4Y2RkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9TZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlciBleHRlbmRzIFhNTEVsZW1lbnQgewotCXB1YmxpYyBTZXJ2ZXIoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIENvbnRleHRNYW5hZ2VyIGdldENvbnRleHRNYW5hZ2VyKCkgewotCQlyZXR1cm4gKENvbnRleHRNYW5hZ2VyKSBmaW5kRWxlbWVudCgiQ29udGV4dE1hbmFnZXIiKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRMb2dnZXJDb3VudCgpIHsKLQkJcmV0dXJuIHNpemVPZkVsZW1lbnQoIkxvZ2dlciIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiLCBuYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvU2VydmVySW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL1NlcnZlckluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NzI2MzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvU2VydmVySW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFNBUyBJbnN0aXR1dGUsIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBMYXJyeSBJc2FhY3MgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXIzMjsKLQotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGEgVG9tY2F0IDMuMiwgb3IgbGF0ZXIsIHNlcnZlciBhcwotICogZGVmaW5lZCBhIHNlcnZlci54bWwgY29uZmlndXJhdGlvbiBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVySW5zdGFuY2UgewotCi0JcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyOwotCQotCXByb3RlY3RlZCBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFNlcnZlckluc3RhbmNlIHVzaW5nIHRoZSBzcGVjaWZpZWQgU2VydmVyIGNvbmZpZ3VyYXRpb24uCi0JICogVGhlIFNlcnZlckluc3RhbmNlIHByb3ZpZGVzIGFjY2VzcyB0byBDb25uZWN0b3JzIGFuZCBDb250ZXh0cy4gSXQgZG9lcwotCSAqIG5vdCBzdXBwb3J0IGludGVyYWN0aW5nIHdpdGggSG9zdCBlbGVtZW50cyB1bmRlciB0aGUgQ29udGV4dE1hbmFnZXIKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgU2VydmVyIGNvbmZpZ3VyYXRpb24gb24gd2hpY2ggdG8gYmFzZSB0aGlzIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJJbnN0YW5jZShTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNlcnZlciBhcmd1bWVudCBtYXkgbm90IGJlIG51bGwuIik7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBwcm9ibGVtIHN0YXR1cyBmb2xsb3dpbmcKLQkgKiBhIG1ldGhvZCBjYWxsIHRoYXQgcmV0dXJuZWQgPGI+bnVsbDwvYj4gZHVlIHRvIGFuIGVycm9yLgotCSAqIEByZXR1cm4gU3RhdHVzIG9mIGxhc3QgbWV0aG9kIGNhbGwuCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIENvbnRleHRNYW5hZ2VyIGVsZW1lbnQgaWYgb25lIGV4aXN0cyBvciB3aWxsCi0JICogY3JlYXRlIGEgbmV3IG9uZSBpZiBpdCBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuCi0JICogQHJldHVybiBSZXR1cm5zIGFuIGV4aXN0aW5nIG9yIG5ldyBDb250ZXh0TWFuZ2VyLgotCSAqLwotCXB1YmxpYyBDb250ZXh0TWFuYWdlciBnZXRDb250ZXh0TWFuYWdlcigpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGNvbnRleHRNYW5hZ2VyID09IG51bGwpCi0JCQljb250ZXh0TWFuYWdlciA9IHNlcnZlci5nZXRDb250ZXh0TWFuYWdlcigpOwotCQlyZXR1cm4gY29udGV4dE1hbmFnZXI7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGNvbm5lY3RvciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiBJZiBhIENvbm5lY3RvcgotCSAqIGRvZXMgbm90IGV4aXN0IGF0IHRoYXQgaW5kZXggYSBuZXcgQ29ubmVjdG9yIGlzIGFwcGVuZGVkCi0JICogYW5kIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUgQ29ubmVjdG9yIHRvIHJldHVybi4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIENvbm5lY3RlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9yCi0JICogYSBuZXcgQ29ubmVjdG9yIGlmIG9uZSBhdCB0aGF0IGluZGV4IGRvZXNuJ3QgZXhpc3QuCi0JICovCi0JcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoaW50IGluZGV4KSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChjb250ZXh0TWFuYWdlciA9PSBudWxsICYmIGdldENvbnRleHRNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwkvLyBOb3RlOiBDYW4ndCBjdXJyZW50bHkgb2NjdXIKLQkJCi0JCXJldHVybiBjb250ZXh0TWFuYWdlci5nZXRDb25uZWN0b3IoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIENvbm5lY3RvcnMgZm91bmQgaW4gdGhlIENvbnRleHRNYW5hZ2VyIGluIHRoZQotCSAqIHNlcnZlciBjb25maWd1cmF0aW9uLgotCSAqICAgIAotCSAqIEByZXR1cm4gQXJyYXkgb2YgQ29ubmVjdG9ycyBmb3VuZCBpbiB0aGUgQ29udGV4dE1hbmdlciBpbiB0aGUKLQkgKiBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yIFtdIGdldENvbm5lY3RvcnMoKSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChjb250ZXh0TWFuYWdlciA9PSBudWxsICYmIGdldENvbnRleHRNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwkvLyBOb3RlOiBDYW4ndCBjdXJyZW50bHkgb2NjdXIKLQkJCi0JCWludCBzaXplID0gY29udGV4dE1hbmFnZXIuZ2V0Q29ubmVjdG9yQ291bnQoKTsKLQkJQ29ubmVjdG9yIFtdIGNvbm5lY3RvcnMgPSBuZXcgQ29ubmVjdG9yIFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWNvbm5lY3RvcnNbaV0gPSBjb250ZXh0TWFuYWdlci5nZXRDb25uZWN0b3IoaSk7Ci0JCX0KLQkJcmV0dXJuIGNvbm5lY3RvcnM7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIENvbnRleHQgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCBwYXRoIHdpdGhpbiB0aGUgc2VsZWN0ZWQKLQkgKiBIb3N0LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Yj5udWxsPC9iPiBpZiB0aGUgQ29udGV4dCB3aXRoIHRoZQotCSAqIHJlcXVpcmVkIHBhdGggaXMgbm90IGZvdW5kIGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dFBhdGggUGF0aCBvZiB0aGUgQ29udGV4dCB0byBiZSByZXR1cm5lZC4gIEEgbGVhZGluZyAnLycgaXMgb3B0aW9uYWwuCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBDb250ZXh0IHdob3NlIDxiPnBhdGg8L2I+IGF0dHJpYnV0ZSBtYXRjaGVzCi0JICogdGhlIHNwZWNpZmllZCBjb250ZXh0UGF0aC4gUmV0dXJucyA8Yj5udWxsPC9iPiBpZiB0aGUgQ29udGV4dCB3aXRoCi0JICogdGhlIHJlcXVpcmVkIHBhdGggaXMgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoU3RyaW5nIGNvbnRleHRQYXRoKSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChjb250ZXh0TWFuYWdlciA9PSBudWxsICYmIGdldENvbnRleHRNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwkvLyBOb3RlOiBDYW4ndCBjdXJyZW50bHkgb2NjdXIKLQkJCi0JCWlmIChjb250ZXh0UGF0aCAhPSBudWxsICYmIGNvbnRleHRQYXRoLmxlbmd0aCgpID4gMCAmJiAhY29udGV4dFBhdGguc3RhcnRzV2l0aCgiLyIpKQotCQkJY29udGV4dFBhdGggPSAiLyIgKyBjb250ZXh0UGF0aDsKLQkJCi0JCWludCBzaXplID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dENvdW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlDb250ZXh0IGN0eCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoaSk7Ci0JCQlpZiAoY3R4LmdldFBhdGgoKS5lcXVhbHMoY29udGV4dFBhdGgpKSB7Ci0JCQkJcmV0dXJuIGN0eDsKLQkJCX0KLQkJfQotCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvclhNTENvbnRleHROb3RGb3VuZFBhdGgzMiwgY29udGV4dFBhdGgpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIENvbnRleHQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gSWYgYSBDb25uZWN0b3IgZG9lcyBub3QKLQkgKiBleGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBhIG5ldyBDb250ZXh0IHdpbGwgYmUgYXBwZW5kZWQgYW5kCi0JICogcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBDb250ZXh0IHRvIHJldHVybi4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIENvbnRleHQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgb3IKLQkgKiBhIG5ldyBhcHBlbmRlZCBDb250ZXh0IGlmIHRoZSBpbmRleCBpcyBiZXlvbmQgYW55IGV4aXN0aW5nCi0JICogQ29udGV4dHMuCi0JICovCi0JcHVibGljIENvbnRleHQgZ2V0Q29udGV4dChpbnQgaW5kZXgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGNvbnRleHRNYW5hZ2VyID09IG51bGwgJiYgZ2V0Q29udGV4dE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7CS8vIE5vdGU6IENhbid0IGN1cnJlbnRseSBvY2N1cgotCQkKLQkJcmV0dXJuIGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBDb250ZXh0cyBjb250YWluZWQgaW4gdGhlIENvbnRleHRNYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gQXJyYXkgb2YgQ29udGV4dHMgY29udGFpbmVkIGluIHRoZSBDb250ZXh0TWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dCBbXSBnZXRDb250ZXh0cygpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGNvbnRleHRNYW5hZ2VyID09IG51bGwgJiYgZ2V0Q29udGV4dE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7CS8vIE5vdGU6IENhbid0IGN1cnJlbnRseSBvY2N1cgotCQkKLQkJaW50IHNpemUgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0Q291bnQoKTsKLQkJQ29udGV4dCBbXSBjb250ZXh0cyA9IG5ldyBDb250ZXh0IFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWNvbnRleHRzW2ldID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChpKTsKLQkJfQotCQlyZXR1cm4gY29udGV4dHM7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQ29udGV4dCBhbmQgaW5zZXJ0cyBpdCBiZWZvcmUgdGhlIHNwZWNpZmVkIGluZGV4Ci0JICogb3IgYXBwZW5kcyBpdCBpZiB0aGUgaW5kZXggaXMgYmV5b25kIGFueSBleGlzdGluZyBDb250ZXh0cyBpbiB0aGUKLQkgKiBDb250ZXh0TWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXggSW5kZXggcHJpb3IgdG8gd2hpY2ggdG8gaW5zZXJ0IHRoZSBuZXcgQ29udGV4dHMuCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjcmVhdGVkIENvbnRleHQuCi0JICovCi0JcHVibGljIENvbnRleHQgY3JlYXRlQ29udGV4dChpbnQgaW5kZXgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGNvbnRleHRNYW5hZ2VyID09IG51bGwgJiYgZ2V0Q29udGV4dE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7CS8vIE5vdGU6IENhbid0IGN1cnJlbnRseSBvY2N1cgotCi0JCXJldHVybiAoQ29udGV4dCljb250ZXh0TWFuYWdlci5jcmVhdGVFbGVtZW50KGluZGV4LCAiQ29udGV4dCIpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBDb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCBwYXRoLCBpZiBpdCBjYW4gYmUgZm91bmQuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRQYXRoIFBhdGggb2YgdGhlIENvbnRleHQgdG8gYmUgcmVtb3ZlZC4gIEEgbGVhZGluZyAnLycgaXMgb3B0aW9uYWwuCi0JICogQHJldHVybiBSZXR1cm5zIDxiPnRydWU8L2I+IGlmIHRoZSBDb250ZXh0IHdhcyByZW1vdmVkLiAgUmV0dXJucyA8Yj5mYWxzZTwvYj4KLQkgKiBpZiB0aGUgQ29udGV4dCBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQ29udGV4dChTdHJpbmcgY29udGV4dFBhdGgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGNvbnRleHRNYW5hZ2VyID09IG51bGwgJiYgZ2V0Q29udGV4dE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwkvLyBOb3RlOiBDYW4ndCBjdXJyZW50bHkgb2NjdXIKLQkJCi0JCWlmIChjb250ZXh0UGF0aCAhPSBudWxsICYmIGNvbnRleHRQYXRoLmxlbmd0aCgpID4gMCAmJiAhY29udGV4dFBhdGguc3RhcnRzV2l0aCgiLyIpKQotCQkJY29udGV4dFBhdGggPSAiLyIgKyBjb250ZXh0UGF0aDsKLQkJCi0JCWludCBzaXplID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dENvdW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlDb250ZXh0IGN0eCA9IGNvbnRleHRNYW5hZ2VyLmdldENvbnRleHQoaSk7Ci0JCQlpZiAoY3R4LmdldFBhdGgoKS5lcXVhbHMoY29udGV4dFBhdGgpKSB7Ci0JCQkJY29udGV4dE1hbmFnZXIucmVtb3ZlRWxlbWVudCgiQ29udGV4dCIsIGkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixUb21jYXRQbHVnaW4uUExVR0lOX0lELAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yWE1MQ29udGV4dE5vdEZvdW5kUGF0aDMyLCBjb250ZXh0UGF0aCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUgQ29udGV4dCB0byByZW1vdmUuCi0JICogQHJldHVybiBSZXR1cm5zIDxiPnRydWU8L2I+IGlmIGEgQ29udGV4dCBpcyByZW1vdmVkIGF0IHRoZSBzcGVjaWZpZWQKLQkgKiBpbmRleC4gIFJldHVybnMgPGI+ZmFsc2U8L2I+IG5vIENvbnRleHQgZXhpc3RzIGF0IHRoYXQgaW5kZXguCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQ29udGV4dChpbnQgaW5kZXgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGNvbnRleHRNYW5hZ2VyID09IG51bGwgJiYgZ2V0Q29udGV4dE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwkvLyBOb3RlOiBDYW4ndCBjdXJyZW50bHkgb2NjdXIKLQotCQlyZXR1cm4gY29udGV4dE1hbmFnZXIucmVtb3ZlRWxlbWVudCgiQ29udGV4dCIsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3b3JrIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCAKLQkgKiBDb250ZXh0LiBJZiB0aGUgd29yayBkaXJlY3Rvcnkgb2J0YWluZWQgaXMgcmVsYXRpdmUsCi0JICogaXQgaXMgYXBwZW5kZWQgdG8gdGhlIHNwZWNpZmllZCBiYXNlIHBhdGguIFRoaXMgbWV0aG9kIGRvZXMKLQkgKiBub3QgdmVyaWZ5IGlmIHRoZSBzcGVjaWZpZWQgQ29udGV4dCBjdXJyZW50bHkgZXhpc3RzLiAKLQkgKiAKLQkgKiBAcGFyYW0gYmFzZVBhdGggUGF0aCB0byB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBzZXJ2ZXIuCi0JICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aG9zZSB3b3JrIGRpcmVjdG9yeSB0byByZXR1cm4uCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSB3b3JrIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmVkCi0JICogQ29udGV4dC4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgsIENvbnRleHQgY29udGV4dCkgewotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udGV4dCBhcmd1bWVudCBtYXkgbm90IGJlIG51bGwuIik7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChjb250ZXh0TWFuYWdlciA9PSBudWxsICYmIGdldENvbnRleHRNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwkvLyBOb3RlOiBDYW4ndCBjdXJyZW50bHkgb2NjdXIKLQotCQlTdHJpbmdCdWZmZXIgc2I9bmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgd29ya0RpciA9IGNvbnRleHRNYW5hZ2VyLmdldFdvcmtEaXIoKTsKLQkJaWYgKHdvcmtEaXIgPT0gbnVsbCkKLQkJCXdvcmtEaXIgPSAid29yayI7Ci0JCXNiLmFwcGVuZCh3b3JrRGlyKTsKLQkJc2IuYXBwZW5kKCIvIik7Ci0JCVN0cmluZyBob3N0TmFtZSA9IGNvbnRleHRNYW5hZ2VyLmdldEF0dHJpYnV0ZVZhbHVlKCJob3N0TmFtZSIpOwotCQlpZiAoaG9zdE5hbWUgPT0gbnVsbCkKLQkJCWhvc3ROYW1lID0gImxvY2FsaG9zdCI7Ci0JCXNiLmFwcGVuZChob3N0TmFtZSk7Ci0JCXNiLmFwcGVuZCgiXyIpOwotCQlTdHJpbmcgbGVnYWN5UG9ydCA9IGNvbnRleHRNYW5hZ2VyLmdldEF0dHJpYnV0ZVZhbHVlKCJwb3J0Iik7Ci0JCWlmIChsZWdhY3lQb3J0ID09IG51bGwpCi0JCQlsZWdhY3lQb3J0ID0gIjgwODAiOwotCQlzYi5hcHBlbmQobGVnYWN5UG9ydCk7Ci0JCS8vIER1cGxpY2F0ZSBVUkxFbmNvZGVyLmVuY29kZSgpIHVzZWQgaW4gVG9tY2F0IDMuMgotCQlzYi5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUoY29udGV4dC5nZXRQYXRoKCkpKTsKLQotCQlJUGF0aCB3b3JrUGF0aCA9IG5ldyBQYXRoKHNiLnRvU3RyaW5nKCkpOwotCQlpZiAoIXdvcmtQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJaWYgKGJhc2VQYXRoID09IG51bGwpCi0JCQkJYmFzZVBhdGggPSBuZXcgUGF0aCgiIik7Ci0JCQl3b3JrUGF0aCA9IGJhc2VQYXRoLmFwcGVuZCh3b3JrUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtQYXRoOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB3b3JrIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci4gCi0JICogSWYgdGhlIHdvcmsgZGlyZWN0b3J5IG9idGFpbmVkIGlzIHJlbGF0aXZlLAotCSAqIGl0IGlzIGFwcGVuZGVkIHRvIHRoZSBzcGVjaWZpZWQgYmFzZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlUGF0aCBQYXRoIHRvIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlci4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHdvcmsgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyLgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRTZXJ2ZXJXb3JrRGlyZWN0b3J5KElQYXRoIGJhc2VQYXRoKSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChjb250ZXh0TWFuYWdlciA9PSBudWxsICYmIGdldENvbnRleHRNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwkvLyBOb3RlOiBDYW4ndCBjdXJyZW50bHkgb2NjdXIKLQotCQlTdHJpbmcgd29ya0RpciA9IGNvbnRleHRNYW5hZ2VyLmdldFdvcmtEaXIoKTsKLQkJaWYgKHdvcmtEaXIgPT0gbnVsbCkKLQkJCXdvcmtEaXIgPSAid29yayI7Ci0JCUlQYXRoIHdvcmtQYXRoID0gbmV3IFBhdGgod29ya0Rpcik7Ci0JCWlmICghd29ya1BhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlpZiAoYmFzZVBhdGggPT0gbnVsbCkKLQkJCQliYXNlUGF0aCA9IG5ldyBQYXRoKCIiKTsKLQkJCXdvcmtQYXRoID0gYmFzZVBhdGguYXBwZW5kKHdvcmtQYXRoKTsKLQkJfQotCQlyZXR1cm4gd29ya1BhdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvQ29ubmVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9Db25uZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliZjZjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9Db25uZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3RvciBleHRlbmRzIFhNTEVsZW1lbnQgewotCXB1YmxpYyBDb25uZWN0b3IoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2VwdENvdW50KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImFjY2VwdENvdW50Iik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3NOYW1lIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWJ1ZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF4UHJvY2Vzc29ycygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJtYXhQcm9jZXNzb3JzIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNaW5Qcm9jZXNzb3JzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoIm1pblByb2Nlc3NvcnMiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgicG9ydCIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNlY3VyZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJzZWN1cmUiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJwcm90b2NvbCIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInByb3RvY29sSGFuZGxlckNsYXNzTmFtZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjY2VwdENvdW50KFN0cmluZyBhY2NlcHRDb3VudCkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiYWNjZXB0Q291bnQiLCBhY2NlcHRDb3VudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIsIGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVidWcoU3RyaW5nIGRlYnVnKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIsIGRlYnVnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXhQcm9jZXNzb3JzKFN0cmluZyBtYXhQcm9jZXNzb3JzKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJtYXhQcm9jZXNzb3JzIiwgbWF4UHJvY2Vzc29ycyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWluUHJvY2Vzc29ycyhTdHJpbmcgbWluUHJvY2Vzc29ycykgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgibWluUHJvY2Vzc29ycyIsIG1pblByb2Nlc3NvcnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBvcnQoU3RyaW5nIHBvcnQpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInBvcnQiLCBwb3J0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lKFN0cmluZyBwcm90b2NvbEhhbmRsZXJDbGFzc05hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInByb3RvY29sSGFuZGxlckNsYXNzTmFtZSIsIHByb3RvY29sSGFuZGxlckNsYXNzTmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0NvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhOGRmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0IGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBDb250ZXh0KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogR2V0IGRlYnVnIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuIGRlYnVnIGF0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVidWcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZG9jQmFzZSBhdHRyaWJ1dGUuCi0JICogQHJldHVybiBkb2NCYXNlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jQmFzZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkb2NCYXNlIik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhdGggYXR0cmlidXRlLgotCSAqIEByZXR1cm4gcGF0aCBhdHRyaWJ1dGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgicGF0aCIpOwotCX0KLQotCS8qKgotCSAqIEdldCByZWxvYWRhYmxlIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuIHJlbG9hZGFibGUgYXR0cmlidXRlIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWxvYWRhYmxlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInJlbG9hZGFibGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgV1RQIHNvdXJjZSBhdHRyaWJ1dGUuIExpbmtzIHRoZSBjb250ZXh0Ci0JICogdG8gYSBwcm9qZWN0IG1vZHVsZS4KLQkgKiBAcmV0dXJuIHNvdXJjZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJzb3VyY2UiKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGV4dCBSZXNvdXJjZXMgZWxlbWVudC4gIFdpbGwgY3JlYXRlCi0JICogdGhlIGVsZW1lbnQgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KLQkgKiBAcmV0dXJuIHJlc291cmNlcyBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCkgewotCQlyZXR1cm4gKFJlc291cmNlcykgZmluZEVsZW1lbnQoIlJlc291cmNlcyIpOwotCX0KLQotCS8qKgotCSAqIEdldCBjb250ZXh0IExvYWRlciBlbGVtZW50LiAgV2lsbCBjcmVhdGUKLQkgKiB0aGUgZWxlbWVudCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotCSAqIEByZXR1cm4gbG9hZGVyIGVsZW1lbnQuCi0JICovCi0JcHVibGljIExvYWRlciBnZXRMb2FkZXIoKSB7Ci0JCXJldHVybiAoTG9hZGVyKSBmaW5kRWxlbWVudCgiTG9hZGVyIik7Ci0JfQotCQotCS8qKgotCSAqIFNldCBkZWJ1ZyBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gZGVidWcgdmFsdWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVidWcoU3RyaW5nIGRlYnVnKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIsIGRlYnVnKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZG9jQmFzZSBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGRvY0Jhc2UgdmFsdWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jQmFzZShTdHJpbmcgZG9jQmFzZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiZG9jQmFzZSIsIGRvY0Jhc2UpOwotCX0KLQotCS8qKgotCSAqIFNldCBwYXRoIGF0dHJpYnV0ZS4KLQkgKiBAcGFyYW0gcGF0aCB2YWx1ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJwYXRoIiwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHJlbG9hZGFibGUgYXR0cmlidXRlLgotCSAqIEBwYXJhbSByZWxvYWRhYmxlIHZhbHVlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbG9hZGFibGUoU3RyaW5nIHJlbG9hZGFibGUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInJlbG9hZGFibGUiLCByZWxvYWRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgV1RQIHNvdXJjZSBhdHRyaWJ1dGUuIExpbmtzIHRoZSBjb250ZXh0Ci0JICogdG8gYSBwcm9qZWN0IG1vZHVsZS4KLQkgKiBAcGFyYW0gc291cmNlIHZhbHVlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJzb3VyY2UiLCBzb3VyY2UpOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0VuZ2luZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMDlmOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvRW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVuZ2luZSBleHRlbmRzIFhNTEVsZW1lbnQgewotCXB1YmxpYyBFbmdpbmUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBcHBCYXNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImFwcEJhc2UiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3NOYW1lIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVidWcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0SG9zdCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWZhdWx0SG9zdCIpOwotCX0KLQkKLQlwdWJsaWMgSG9zdCBnZXRIb3N0KCkgewotCQlyZXR1cm4gKEhvc3QpIGZpbmRFbGVtZW50KCJIb3N0Iik7Ci0JfQotCQotCXB1YmxpYyBIb3N0IGdldEhvc3QoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoSG9zdCkgZmluZEVsZW1lbnQoIkhvc3QiLCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0SG9zdENvdW50KCkgewotCQlyZXR1cm4gc2l6ZU9mRWxlbWVudCgiSG9zdCIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBcHBCYXNlKFN0cmluZyBhcHBCYXNlKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJhcHBCYXNlIiwgYXBwQmFzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJjbGFzc05hbWUiLCBjbGFzc05hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWJ1ZyhTdHJpbmcgZGVidWcpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIiwgZGVidWcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0SG9zdChTdHJpbmcgZGVmYXVsdEhvc3QpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImRlZmF1bHRIb3N0IiwgZGVmYXVsdEhvc3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIiwgbmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvSG9zdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvSG9zdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzkxMDk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0hvc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhvc3QgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQlwdWJsaWMgSG9zdCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFwcEJhc2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiYXBwQmFzZSIpOwotCX0KLQkKLQlwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KGludCBpbmRleCkgewotCQlyZXR1cm4gKENvbnRleHQpIGZpbmRFbGVtZW50KCJDb250ZXh0IiwgaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENvbnRleHRDb3VudCgpIHsKLQkJcmV0dXJuIHNpemVPZkVsZW1lbnQoIkNvbnRleHQiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWJ1ZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBcHBCYXNlKFN0cmluZyBhcHBCYXNlKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJhcHBCYXNlIiwgYXBwQmFzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlYnVnKFN0cmluZyBkZWJ1ZykgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciLCBkZWJ1Zyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiLCBuYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Mzc4YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIExpc3RlbmVyIGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JcHVibGljIExpc3RlbmVyKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3NOYW1lIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWJ1ZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJjbGFzc05hbWUiLCBjbGFzc05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlYnVnKFN0cmluZyBkZWJ1ZykgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciLCBkZWJ1Zyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0xvYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YjdjY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgRmFicml6aW8gR2l1c3RpbmEgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLlhNTEVsZW1lbnQ7Ci0KLS8qKgotICogTG9hZGVyIGVsZW1lbnQsIG9wdGlvbmFsIGluIENvbnRleHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2FkZXIgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQotCS8qKgotCSAqIEdldCBjbGFzc05hbWUgYXR0cmlidXRlLgotICAgICAqIEByZXR1cm4gY2xhc3NOYW1lIGF0dHJpYnV0ZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBjbGFzc05hbWUgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdmFsdWUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgc2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIsIGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IFdUUCB2aXJ0dWFsQ2xhc3NwYXRoIGF0dHJpYnV0ZS4KLSAgICAgKiBAcmV0dXJuIHZpcnR1YWxDbGFzc3BhdGggdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZpcnR1YWxDbGFzc3BhdGgoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgidmlydHVhbENsYXNzcGF0aCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBXVFAgdmlydHVhbENsYXNzcGF0aCBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIHZpcnR1YWxDbGFzc3BhdGggdmFsdWUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmlydHVhbENsYXNzcGF0aChTdHJpbmcgdmlydHVhbENsYXNzcGF0aCkgewotICAgICAgICBzZXRBdHRyaWJ1dGVWYWx1ZSgidmlydHVhbENsYXNzcGF0aCIsIHZpcnR1YWxDbGFzc3BhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB1c2VTeXN0ZW1DbGFzc0xvYWRlckFzUGFyZW50IGF0dHJpYnV0ZQotICAgICAqIEByZXR1cm4gdXNlU3lzdGVtQ2xhc3NMb2FkZXJBc1BhcmVudCB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlU3lzdGVtQ2xhc3NMb2FkZXJBc1BhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJ1c2VTeXN0ZW1DbGFzc0xvYWRlckFzUGFyZW50Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSB1c2VTeXN0ZW1DbGFzc0xvYWRlckFzUGFyZW50IHZhbHVlIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZVN5c3RlbUNsYXNzTG9hZGVyQXNQYXJlbnQoCi0gICAgICAgICAgICBTdHJpbmcgdXNlU3lzdGVtQ2xhc3NMb2FkZXJBc1BhcmVudCkgewotICAgICAgICBzZXRBdHRyaWJ1dGVWYWx1ZSgidXNlU3lzdGVtQ2xhc3NMb2FkZXJBc1BhcmVudCIsCi0gICAgICAgICAgICAgICAgdXNlU3lzdGVtQ2xhc3NMb2FkZXJBc1BhcmVudCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9SZXNvdXJjZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL1Jlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTYzZTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL1Jlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEZhYnJpemlvIEdpdXN0aW5hIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5YTUxFbGVtZW50OwotCi0vKioKLSAqIFJlc291cmNlcyBlbGVtZW50LCBvcHRpb25hbCBpbiBDb250ZXh0LgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VzIGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBHZXQgY2xhc3NOYW1lIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gY2xhc3NOYW1lIGF0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIpOwotCX0KLQotCS8qKgotCSAqIEdldCB2aXJ0dWFsQ2xhc3NwYXRoIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuIHZpcnR1YWxDbGFzc3BhdGggYXR0cmlidXRlIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWaXJ0dWFsQ2xhc3NwYXRoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInZpcnR1YWxDbGFzc3BhdGgiKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgY2xhc3NOYW1lIGF0dHJpYnV0ZS4KLQkgKiBAcGFyYW0gY2xhc3NOYW1lIHZhbHVlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJjbGFzc05hbWUiLCBjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldCB2aXJ0dWFsQ2xhc3NwYXRoIGF0dHJpYnV0ZS4KLQkgKiBAcGFyYW0gdmlydHVhbENsYXNzcGF0aCB2YWx1ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXJ0dWFsQ2xhc3NwYXRoKFN0cmluZyB2aXJ0dWFsQ2xhc3NwYXRoKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJ2aXJ0dWFsQ2xhc3NwYXRoIiwgdmlydHVhbENsYXNzcGF0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9TZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3MTExZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9TZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlciBleHRlbmRzIFhNTEVsZW1lbnQgewotCXB1YmxpYyBTZXJ2ZXIoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlYnVnKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQb3J0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInBvcnQiKTsKLQl9Ci0JCi0JcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChTZXJ2aWNlKSBmaW5kRWxlbWVudCgiU2VydmljZSIsIGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTZXJ2aWNlQ291bnQoKSB7Ci0JCXJldHVybiBzaXplT2ZFbGVtZW50KCJTZXJ2aWNlIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2h1dGRvd24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgic2h1dGRvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVidWcoU3RyaW5nIGRlYnVnKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIsIGRlYnVnKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIsIG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQb3J0KFN0cmluZyBwb3J0KSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJwb3J0IiwgcG9ydCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNodXRkb3duKFN0cmluZyBzaHV0ZG93bikgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgic2h1dGRvd24iLCBzaHV0ZG93bik7Ci0JfQotCi0JcHVibGljIExpc3RlbmVyIGdldExpc3RlbmVyKGludCBpbmRleCkgewotCQlyZXR1cm4gKExpc3RlbmVyKSBmaW5kRWxlbWVudCgiTGlzdGVuZXIiLCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TGlzdGVuZXJDb3VudCgpIHsKLQkJcmV0dXJuIHNpemVPZkVsZW1lbnQoIkxpc3RlbmVyIik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL1NlcnZlckluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9TZXJ2ZXJJbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWYzNmUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL1NlcnZlckluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBTQVMgSW5zdGl0dXRlLCBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgTGFycnkgSXNhYWNzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGEgVG9tY2F0IDQuMCwgb3IgbGF0ZXIsIHNlcnZlciBhcwotICogZGVmaW5lZCBieSBhIHNwZWNpZmljIFNlcnZpY2UsIEVuZ2luZSwgYW5kIEhvc3QgZGVmaW5lZCBpbiBhIHNlcnZlci54bWwKLSAqIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckluc3RhbmNlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFUlZJQ0UgPSAiQ2F0YWxpbmEiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRTIgPSAiVG9tY2F0LVN0YW5kYWxvbmUiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSE9TVCA9ICJsb2NhbGhvc3QiOwotCi0JcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIFNlcnZpY2Ugc2VydmljZTsKLQlwcm90ZWN0ZWQgRW5naW5lIGVuZ2luZTsKLQlwcm90ZWN0ZWQgSG9zdCBob3N0OwotCi0JcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGVuZ2luZU5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBob3N0TmFtZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGhvc3RXb3JrRGlyOwotCi0JcHJvdGVjdGVkIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBTZXJ2ZXJJbnN0YW5jZSB1c2luZyB0aGUgc3BlY2lmaWVkIFNlcnZlciBjb25maWd1cmF0aW9uLgotCSAqIFRoZSBTZXJ2ZXJJbnN0YW5jZSBwcm92aWRlcyBhY2Nlc3MgdG8gYSBzZWxlY3RlZCBTZXJ2aWNlLCBFbmdpbmUsIGFuZCBIb3N0Ci0JICogYXMgZGV0ZXJtaW5lZCBieSB0aGUgc3VwcGxpZWQgc2VydmljZSBhbmQgaG9zdCBuYW1lIG9yIHRoZWlyIGRlZmF1bHRzLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgU2VydmVyIGNvbmZpZ3VyYXRpb24gb24gd2hpY2ggdG8gYmFzZSB0aGlzIGluc3RhbmNlLgotCSAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRoZSBpbnN0YW5jZSBzaG91bGQgdXNlLiAgRGVmYXVsdHMKLQkgKiAgdG8gJnF1b3Q7Q2F0YWxpbmEmcXVvdDsgaWYgPGI+bnVsbDwvYj4gb3IgYW55IGVtcHR5IHN0cmluZyBpcyBzcGVjaWZpZWQuCi0JICogQHBhcmFtIGhvc3ROYW1lIE5hbWUgb2YgdGhlIGhvc3QgdGhlIGluc3RhbmNlIHNob3VsZCB1c2UuIERlZmF1bHRzIHRvCi0JICogIHRoZSBkZWZhdWx0SG9zdCBzZXR0aW5nIG9uIHRoZSBFbmdpbmUgZWxlbWVudCBmb3VuZCB1bmRlciB0aGUgc2VydmljZS4KLQkgKiAgSWYgdGhlIGRlZmF1bHRIb3N0IGlzIG5vdCBzZXQsIGRlZmF1bHRzIHRvICZxdW90O2xvY2FsaG9zdCZxdW90Oy4KLQkgKi8KLQlwdWJsaWMgU2VydmVySW5zdGFuY2UoU2VydmVyIHNlcnZlciwgU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgaG9zdE5hbWUpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2VydmVyIGFyZ3VtZW50IG1heSBub3QgYmUgbnVsbC4iKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLQkJdGhpcy5ob3N0TmFtZSA9IGhvc3ROYW1lOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgcHJvYmxlbSBzdGF0dXMgZm9sbG93aW5nCi0JICogYSBtZXRob2QgY2FsbCB0aGF0IHJldHVybmVkIDxiPm51bGw8L2I+IGR1ZSB0byBhbiBlcnJvci4KLQkgKiBAcmV0dXJuIFN0YXR1cyBvZiBsYXN0IG1ldGhvZCBjYWxsLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhcnJheSBvZiBMaXN0ZW5lcnMgZm91bmQgaW4gdGhlIFNlcnZlciBjb25maWd1cmF0aW9uCi0JICogb2YgdGhpcyBTZXJ2ZXJJbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIEFycmF5IG9mIExpc3RlbmVycyBmb3VuZCBpbiB0aGUgU2VydmVyIGNvbmZpZ3VyYXRpb24uIAotCSAqLwotCXB1YmxpYyBMaXN0ZW5lciBbXSBnZXRMaXN0ZW5lcnMoKSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWludCBzaXplID0gc2VydmVyLmdldExpc3RlbmVyQ291bnQoKTsKLQkJTGlzdGVuZXIgW10gbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyIFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWxpc3RlbmVyc1tpXSA9IHNlcnZlci5nZXRMaXN0ZW5lcihpKTsKLQkJfQotCQlyZXR1cm4gbGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNlbGVjdGVkIFNlcnZpY2UgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIG9mCi0JICogdGhpcyBTZXJ2ZXJJbnN0YW5jZS4gVGhlIG1ldGhvZCB3aWxsIHJldHVybiA8Yj5udWxsPC9iPiBpZiB0aGUKLQkgKiBzZXJ2ZXIgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBjb250YWluIGEgU2VydmljZSB3aXRoIHRoZSBuYW1lCi0JICogc2VsZWN0ZWQgaW4gdGhpcyBTZXJ2ZXJJbnN0YW5jZS4gSWYgbm8gbmFtZSBpcyBzZWxlY3RlZCwgdGhlbgotCSAqIGEgc2VydmljZSBpcyBjaG9zZW4gYXMgZm9sbG93cy4gIElmIHRoZXJlIGlzIG9ubHkgb25lIFNlcnZpY2UsCi0JICogaXQgaXMgcmV0dXJuZWQuICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgU2VydmljZXMsIHRoZSBmaXJzdCBvbmUKLQkgKiB3aXRoIHRoZSBuYW1lICZxdW90O0NhdGFsaW5hJnF1b3Q7IG9yICZxdW90O1RvbWNhdC1TdGFuZGFsb25lJnF1b3Q7Ci0JICogaXMgcmV0dXJuZWQuICBJZiBub25lIGlzIGZvdW5kIHdpdGggZWl0aGVyIG5hbWUsIHRoZSBmaXJzdAotCSAqIFNlcnZpY2UgaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBTZXJ2aWNlIGZvciB0aGlzIFNlcnZlckluc3RhbmNlLiBSZXR1cm5zIDxiPm51bGw8L2I+Ci0JICogaWYgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSBTZXJ2aWNlIHdpdGggdGhlIHNlbGVjdGVkIG5hbWUKLQkgKiBvciBkb2VzIG5vdCBjb250YWluIGEgU2VydmljZS4KLQkgKi8KLQlwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoc2VydmljZSAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZpY2U7Ci0JCQotCQlpbnQgc2VydmljZUNvdW50ID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkvLyBJZiBzZXJ2aWNlIG5hbWUgaXMgc3BlY2lmaWVkLCByZXF1aXJlIHRoYXQgbmFtZQotCQlpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlQ291bnQ7IGkrKykgewotCQkJCVNlcnZpY2Ugc3ZjID0gc2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaWYgKHNlcnZpY2VOYW1lLmVxdWFsc0lnbm9yZUNhc2Uoc3ZjLmdldE5hbWUoKSkpIHsKLQkJCQkJc2VydmljZSA9IHN2YzsKLQkJCQkJcmV0dXJuIHNlcnZpY2U7Ci0JCQkJfQotCQkJfQotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yWE1MU2VydmljZU5vdEZvdW5kLCBzZXJ2aWNlTmFtZSkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgc2VydmljZSwgcmV0dXJuIHRoYXQgb25lCi0JCWlmIChzZXJ2aWNlQ291bnQgPT0gMSkgewotCQkJc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKDApOwotCQkJc2VydmljZU5hbWUgPSBzZXJ2aWNlLmdldE5hbWUoKTsKLQkJCXJldHVybiBzZXJ2aWNlOwotCQl9Ci0JCS8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2aWNlcywgdHJ5IHRvIGZpbmQgYSBkZWZhdWx0IG5hbWUKLQkJaWYgKHNlcnZpY2VDb3VudCA+IDEpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZUNvdW50OyBpKyspIHsKLQkJCQlTZXJ2aWNlIHN2YyA9IHNlcnZlci5nZXRTZXJ2aWNlKGkpOwotCQkJCVN0cmluZyBzdmNOYW1lID0gc3ZjLmdldE5hbWUoKTsKLQkJCQlpZiAoREVGQVVMVF9TRVJWSUNFLmVxdWFsc0lnbm9yZUNhc2Uoc3ZjLmdldE5hbWUoKSkpIHsKLQkJCQkJc2VydmljZSA9IHN2YzsKLQkJCQkJc2VydmljZU5hbWUgPSBzdmNOYW1lOwotCQkJCQlyZXR1cm4gc2VydmljZTsKLQkJCQl9Ci0JCQkJaWYgKERFRkFVTFRfU0VSVklDRTIuZXF1YWxzSWdub3JlQ2FzZShzdmMuZ2V0TmFtZSgpKSkgewotCQkJCQlzZXJ2aWNlID0gc3ZjOwotCQkJCQlzZXJ2aWNlTmFtZSA9IHN2Y05hbWU7Ci0JCQkJCXJldHVybiBzZXJ2aWNlOwotCQkJCX0KLQkJCX0KLQkJCS8vIElmIG5vdCBmb3VuZCwgdXNlIHRoZSBmaXJzdCBzZXJ2aWNlCi0JCQlzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2UoMCk7Ci0JCQlzZXJ2aWNlTmFtZSA9IHNlcnZpY2UuZ2V0TmFtZSgpOwotCQkJcmV0dXJuIHNlcnZpY2U7Ci0JCX0KLQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJTWVzc2FnZXMuZXJyb3JYTUxOb1NlcnZpY2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25uZWN0b3IgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gSWYgYSBDb25uZWN0b3IKLQkgKiBkb2VzIG5vdCBleGlzdCBhdCB0aGF0IGluZGV4IGEgbmV3IENvbm5lY3RvciBpcyBhcHBlbmRlZAotCSAqIGFuZCByZXR1cm5lZC4gIFRoaXMgbWV0aG9kIGNhbGwgd2lsbCByZXR1cm4gPGI+bnVsbDwvYj4KLQkgKiBpZiB0aGUgc2VsZWN0ZWQgU2VydmljZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc2VydmVyCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIENvbm5lY3RvciB0byByZXR1cm4uCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBDb25uZWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvcgotCSAqIGEgbmV3IENvbm5lY3RvciBpZiBvbmUgYXQgdGhhdCBpbmRleCBkb2Vzbid0IGV4aXN0LgotCSAqIFJldHVybnMgPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkIFNlcnZpY2UgaXMgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKGludCBpbmRleCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoc2VydmljZSA9PSBudWxsICYmIGdldFNlcnZpY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gc2VydmljZS5nZXRDb25uZWN0b3IoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIENvbm5lY3RvcnMgZm91bmQgaW4gdGhlIHNlbGVjdGVkIFNlcnZpY2UgaW4gdGhlCi0JICogc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0JICogICAgCi0JICogQHJldHVybiBBcnJheSBvZiBDb25uZWN0b3JzIGZvdW5kIGluIHRoZSBzZWxlY3RlZCBTZXJ2aWNlIGluIHRoZQotCSAqIHNlcnZlciBjb25maWd1cmF0aW9uLiAgUmV0dXJucyA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQKLQkgKiBTZXJ2aWNlIGNhbiBub3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIENvbm5lY3RvciBbXSBnZXRDb25uZWN0b3JzKCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoc2VydmljZSA9PSBudWxsICYmIGdldFNlcnZpY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpbnQgc2l6ZSA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yQ291bnQoKTsKLQkJQ29ubmVjdG9yIFtdIGNvbm5lY3RvcnMgPSBuZXcgQ29ubmVjdG9yIFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWNvbm5lY3RvcnNbaV0gPSBzZXJ2aWNlLmdldENvbm5lY3RvcihpKTsKLQkJfQotCQlyZXR1cm4gY29ubmVjdG9yczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgc2VsZWN0ZWQgRW5naW5lIGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBvZgotCSAqIHRoaXMgU2VydmVySW5zdGFuY2UuIFRoZSBFbmdpbmUgaXMgc2VsZWN0ZWQgYnkgYmVpbmcgdGhlCi0JICogb25lIGNoaWxkIEVuZ2luZSBvZiB0aGUgc2VsZWN0ZWQgU2VydmljZS4gVGhlIG1ldGhvZCB3aWxsCi0JICogcmV0dXJuIDxiPm51bGw8L2I+IGlmIHRoZSBzZWxlY3RlZCBTZXJ2aWNlIGlzIG5vdCBmb3VuZAotCSAqIGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBvciB0aGUgc2VsZWN0ZWQgU2VydmljZQotCSAqIGRvZXMgbm90IGNvbnRhaW4gYSBjaGlsZCBFbmdpbmUuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBvbmUgRW5naW5lIHRoYXQgaXMgYSBjaGlsZCBvZiB0aGUKLQkgKiBzZWxlY3RlZCBTZXJ2aWNlLiBSZXR1cm5zIDxiPm51bGw8L2I+IGlmIHRoZSBzZWxlY3RlZAotCSAqIFNlcnZpY2UgaXMgbm90IGZvdW5kIG9yIGl0IGNvbnRhaW5zIG5vIGNoaWxkIEVuZ2luZS4KLQkgKi8KLQlwdWJsaWMgRW5naW5lIGdldEVuZ2luZSgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGVuZ2luZSAhPSBudWxsKQotCQkJcmV0dXJuIGVuZ2luZTsKLQotCQlpZiAoc2VydmljZSA9PSBudWxsICYmIGdldFNlcnZpY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQllbmdpbmUgPSBzZXJ2aWNlLmdldEVuZ2luZSgpOwotCQlpZiAoZW5naW5lID09IG51bGwgfHwgZW5naW5lLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JYTUxFbmdpbmVOb3RGb3VuZCwgc2VydmljZU5hbWUpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWVuZ2luZU5hbWUgPSBlbmdpbmUuZ2V0TmFtZSgpOwotCQlpZiAoaG9zdE5hbWUgPT0gbnVsbCB8fCBob3N0TmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlob3N0TmFtZSA9IGVuZ2luZS5nZXREZWZhdWx0SG9zdCgpOwotCQkJaWYgKGhvc3ROYW1lID09IG51bGwpCi0JCQkJaG9zdE5hbWUgPSBERUZBVUxUX0hPU1Q7Ci0JCX0KLQkJcmV0dXJuIGVuZ2luZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgc2VsZWN0ZWQgSG9zdCBpbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gb2YKLQkgKiB0aGlzIFNlcnZlckluc3RhbmNlLiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Yj5udWxsPC9iPgotCSAqIGlmIHNlbGVjdGVkIEVuZ2luZSBpcyBub3QgZm91bmQgb3IgdGhlIHNlbGVjdGVkIEVuZ2luZQotCSAqIGRvZXMgbm90IGNvbnRhaW4gYSBIb3N0IHdpdGggdGhlIG5hbWUgc3BlY2lmaWVkIGluIHRoaXMKLQkgKiBTZXJ2ZXJJbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbGVjdGVkIEhvc3QgZm9yIHRoaXMgU2VydmVySW5zdGFuY2UuCi0JICogUmV0dXJucyA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQgRW5naW5lIGlzIG5vdCBmb3VuZAotCSAqIG9yIGl0IGRvZXMgbm90IGNvbnRhaW4gYSBIb3N0IHdpdGggdGhlIGV4cGVjdGVkIG5hbWUuCi0JICovCi0JcHVibGljIEhvc3QgZ2V0SG9zdCgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGhvc3QgIT0gbnVsbCkKLQkJCXJldHVybiBob3N0OwotCQkKLQkJaWYgKGVuZ2luZSA9PSBudWxsICYmIGdldEVuZ2luZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWludCBzaXplID0gZW5naW5lLmdldEhvc3RDb3VudCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSG9zdCBoID0gZW5naW5lLmdldEhvc3QoaSk7Ci0JCQlpZiAoaG9zdE5hbWUuZXF1YWxzKGguZ2V0TmFtZSgpKSkgewotCQkJCWhvc3QgPSBoOwotCQkJCXJldHVybiBob3N0OwotCQkJfQotCQl9Ci0JCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixUb21jYXRQbHVnaW4uUExVR0lOX0lELAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yWE1MSG9zdE5vdEZvdW5kLCBuZXcgU3RyaW5nIFtdIHsgaG9zdE5hbWUsIGVuZ2luZU5hbWUsIHNlcnZpY2VOYW1lIH0pKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIENvbnRleHQgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCBwYXRoIHdpdGhpbiB0aGUgc2VsZWN0ZWQKLQkgKiBIb3N0LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQgSG9zdCBvcgotCSAqIENvbnRleHQgd2l0aCB0aGUgcmVxdWlyZWQgcGF0aCBpcyBub3QgZm91bmQgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0UGF0aCBQYXRoIG9mIHRoZSBDb250ZXh0IHRvIGJlIHJldHVybmVkLiAgQSBsZWFkaW5nICcvJyBpcyBvcHRpb25hbC4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIENvbnRleHQgd2hvc2UgPGI+cGF0aDwvYj4gYXR0cmlidXRlIG1hdGNoZXMKLQkgKiB0aGUgc3BlY2lmaWVkIGNvbnRleHRQYXRoLiBSZXR1cm5zIDxiPm51bGw8L2I+IGlmIHRoZSBzZWxlY3RlZAotCSAqIEhvc3Qgb3IgYSBDb250ZXh0IHdpdGggdGhlIHJlcXVpcmVkIHBhdGggaXMgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoU3RyaW5nIGNvbnRleHRQYXRoKSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChob3N0ID09IG51bGwgJiYgZ2V0SG9zdCgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWlmIChjb250ZXh0UGF0aCAhPSBudWxsICYmIGNvbnRleHRQYXRoLmxlbmd0aCgpID4gMCAmJiAhY29udGV4dFBhdGguc3RhcnRzV2l0aCgiLyIpKQotCQkJY29udGV4dFBhdGggPSAiLyIgKyBjb250ZXh0UGF0aDsKLQkJCi0JCWludCBzaXplID0gaG9zdC5nZXRDb250ZXh0Q291bnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUNvbnRleHQgY3R4ID0gaG9zdC5nZXRDb250ZXh0KGkpOwotCQkJaWYgKGN0eC5nZXRQYXRoKCkuZXF1YWxzKGNvbnRleHRQYXRoKSkgewotCQkJCXJldHVybiBjdHg7Ci0JCQl9Ci0JCX0KLQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JYTUxDb250ZXh0Tm90Rm91bmRQYXRoLAotCQkJCQkJbmV3IFN0cmluZyBbXSB7IGNvbnRleHRQYXRoLCBzZXJ2aWNlTmFtZSwgZW5naW5lTmFtZSwgaG9zdE5hbWUgfSkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgQ29udGV4dCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHdpdGhpbiB0aGUgc2VsZWN0ZWQKLQkgKiBIb3N0LiBJZiBhIENvbm5lY3RvciBkb2VzIG5vdCBleGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LAotCSAqIGEgbmV3IENvbnRleHQgd2lsbCBiZSBhcHBlbmRlZCBhbmQgcmV0dXJuZWQuIFRoaXMgbWV0aG9kIHdpbGwKLQkgKiByZXR1cm4gPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkIEhvc3QgY2FuIG5vdCBiZSBmb3VuZCBpbiB0aGUKLQkgKiBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIENvbnRleHQgdG8gcmV0dXJuLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgQ29udGV4dCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBvcgotCSAqIGEgbmV3IGFwcGVuZGVkIENvbnRleHQgaWYgdGhlIGluZGV4IGlzIGJleW9uZCBhbnkgZXhpc3RpbmcKLQkgKiBDb250ZXh0cy4gUmV0dXJucyA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQgSG9zdCBjYW4gbm90Ci0JICogYmUgZm91bmQuCi0JICovCi0JcHVibGljIENvbnRleHQgZ2V0Q29udGV4dChpbnQgaW5kZXgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGhvc3QgPT0gbnVsbCAmJiBnZXRIb3N0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIGhvc3QuZ2V0Q29udGV4dChpbmRleCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIENvbnRleHRzIGNvbnRhaW5lZCBpbiB0aGUgc2VsZWN0ZWQgSG9zdC4gIFRoaXMKLQkgKiBtZXRob2Qgd2lsbCByZXR1cm4gPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkIEhvc3QgY2FuCi0JICogbm90IGJlIGZvdW5kIGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEFycmF5IG9mIENvbnRleHRzIGNvbnRhaW5lZCBpbiB0aGUgc2VsZWN0ZWQgSG9zdC4KLQkgKiBSZXR1cm5zIDxiPm51bGw8L2I+IGlmIHRoZSBzZWxlY3RlZCBIb3N0IGlzIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dCBbXSBnZXRDb250ZXh0cygpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGhvc3QgPT0gbnVsbCAmJiBnZXRIb3N0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaW50IHNpemUgPSBob3N0LmdldENvbnRleHRDb3VudCgpOwotCQlDb250ZXh0IFtdIGNvbnRleHRzID0gbmV3IENvbnRleHQgW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY29udGV4dHNbaV0gPSBob3N0LmdldENvbnRleHQoaSk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRleHRzOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IENvbnRleHQgYW5kIGluc2VydHMgaXQgYmVmb3JlIHRoZSBzcGVjaWZlZCBpbmRleAotCSAqIG9yIGFwcGVuZHMgaXQgaWYgdGhlIGluZGV4IGlzIGJleW9uZCBhbnkgZXhpc3RpbmcgQ29udGV4dHMgaW4gdGhlCi0JICogc2VsZWN0ZWQgSG9zdC4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkCi0JICogSG9zdCBpcyBub3QgZm91bmQgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleCBJbmRleCBwcmlvciB0byB3aGljaCB0byBpbnNlcnQgdGhlIG5ldyBDb250ZXh0cy4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNyZWF0ZWQgQ29udGV4dC4gUmV0dXJucyA8Yj5udWxsPC9iPiBpZiB0aGUKLQkgKiBzZWxlY3RlZCBIb3N0IGlzIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dCBjcmVhdGVDb250ZXh0KGludCBpbmRleCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoaG9zdCA9PSBudWxsICYmIGdldEhvc3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIChDb250ZXh0KWhvc3QuY3JlYXRlRWxlbWVudChpbmRleCwgIkNvbnRleHQiKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgQ29udGV4dCB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aCwgaWYgaXQgY2FuIGJlIGZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0UGF0aCBQYXRoIG9mIHRoZSBDb250ZXh0IHRvIGJlIHJlbW92ZWQuICBBIGxlYWRpbmcgJy8nIGlzIG9wdGlvbmFsLgotCSAqIEByZXR1cm4gUmV0dXJucyA8Yj50cnVlPC9iPiBpZiB0aGUgQ29udGV4dCB3YXMgcmVtb3ZlZC4gIFJldHVybnMgPGI+ZmFsc2U8L2I+Ci0JICogaWYgdGhlIENvbnRleHQgb3IgdGhlIHNlbGVjdGVkIEhvc3QgaXMgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUNvbnRleHQoU3RyaW5nIGNvbnRleHRQYXRoKSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChob3N0ID09IG51bGwgJiYgZ2V0SG9zdCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoY29udGV4dFBhdGggIT0gbnVsbCAmJiBjb250ZXh0UGF0aC5sZW5ndGgoKSA+IDAgJiYgIWNvbnRleHRQYXRoLnN0YXJ0c1dpdGgoIi8iKSkKLQkJCWNvbnRleHRQYXRoID0gIi8iICsgY29udGV4dFBhdGg7Ci0JCQotCQlpbnQgc2l6ZSA9IGhvc3QuZ2V0Q29udGV4dENvdW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlDb250ZXh0IGN0eCA9IGhvc3QuZ2V0Q29udGV4dChpKTsKLQkJCWlmIChjdHguZ2V0UGF0aCgpLmVxdWFscyhjb250ZXh0UGF0aCkpIHsKLQkJCQlob3N0LnJlbW92ZUVsZW1lbnQoIkNvbnRleHQiLCBpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvclhNTENvbnRleHROb3RGb3VuZFBhdGgsCi0JCQkJCQluZXcgU3RyaW5nIFtdIHsgY29udGV4dFBhdGgsIHNlcnZpY2VOYW1lLCBlbmdpbmVOYW1lLCBob3N0TmFtZSB9KSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBDb250ZXh0IHRvIHJlbW92ZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgPGI+dHJ1ZTwvYj4gaWYgYSBDb250ZXh0IGlzIHJlbW92ZWQgYXQgdGhlIHNwZWNpZmllZAotCSAqIGluZGV4LiAgUmV0dXJucyA8Yj5mYWxzZTwvYj4gbm8gQ29udGV4dCBleGlzdHMgYXQgdGhhdCBpbmRleCBvcgotCSAqIHRoZSBzZWxlY3RlZCBIb3N0IGlzIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVDb250ZXh0KGludCBpbmRleCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoaG9zdCA9PSBudWxsICYmIGdldEhvc3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBob3N0LnJlbW92ZUVsZW1lbnQoIkNvbnRleHQiLCBpbmRleCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY29udGV4dCBYTUwgZmlsZXMgYXJlIHN0b3JlZAotCSAqIGZvciB0aGUgc2VsZWN0ZWQgU2VydmljZSwgRW5naW5lLCBhbmQgSG9zdCBmb3VuZCBpbiB0aGUKLQkgKiBzZXJ2ZXIgY29uZmlndXJhdGlvbi4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gPGI+bnVsbDwvYj4KLQkgKiBpZiB0aGUgc2VsZWN0ZWQgSG9zdCBpcyBub3QgZm91bmQgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25mRGlyIFBhdGggdG8gdGhlICZxdW90O2NvbmYmcXVvdDsgZGlyZWN0b3J5IGZvcgotCSAqIHRoZSBzZXJ2ZXIuCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBjb250ZXh0IFhNTCBkaXJlY3RvcnkuCi0JICogUmV0dXJucyA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQgSG9zdCBjYW4gbm90IGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRDb250ZXh0WG1sRGlyZWN0b3J5KElQYXRoIGNvbmZEaXIpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGhvc3QgPT0gbnVsbCAmJiBnZXRIb3N0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIGNvbmZEaXIuYXBwZW5kKGVuZ2luZU5hbWUpLmFwcGVuZChob3N0TmFtZSk7Ci0JfQotCQotCQotCS8qKgotCSAqIEdldHMgdGhlIHBhdGggZm9yIHRoZSBjb250ZXh0IFhNTCBmaWxlIHRoYXQgd291bGQgYmUgdXNlZAotCSAqIGlmIHRoaXMgY29udGV4dCB3ZXJlIHdyaXR0ZW4gdG8gYSBzZXBhcmF0ZSBmaWxlcy4gVGhpcwotCSAqIG1ldGhvZCB3aWxsIHJldHVybiA8Yj5udWxsPC9iPiBpZiB0aGUgc2VsZWN0ZWQgSG9zdCBpcwotCSAqIG5vdCBmb3VuZCBpbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uIFRoaXMgbWV0aG9kIGRvZXMKLQkgKiBub3QgdmVyaWZ5IGlmIHRoZSBzcGVjaWZpZWQgQ29udGV4dCBjdXJyZW50bHkgZXhpc3RzCi0JICogd2l0aGluIHRoZSBzZWxlY3RlZCBIb3N0LgotCSAqIAotCSAqIEBwYXJhbSBiYXNlRGlyIFBhdGggdG8gdGhlIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgc2VydmVyLgotCSAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hvc2UgY29udGV4dCBYTUwgZmlsZSBwYXRoIHRvIHJldHVybi4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIGNvbnRleHQgWE1MIGZpbGUgZm9yIHRoZSBzcGVjaWZlZAotCSAqIENvbnRleHQuIFJldHVybnMgPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkIEhvc3QgY2FuIG5vdCBiZQotCSAqIGZvdW5kIG9yIHRoZSBjb250ZXh0IGhhcyBubyBwYXRoIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0Q29udGV4dEZpbGVQYXRoKElQYXRoIGJhc2VEaXIsIENvbnRleHQgY29udGV4dCkgewotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5lcnJvclhNTE51bGxDb250ZXh0QXJnKTsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGhvc3QgPT0gbnVsbCAmJiBnZXRIb3N0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQYXRoIGNvbnRleHRGaWxlUGF0aCA9IG51bGw7Ci0JCUlQYXRoIGNvbnRleHREaXIgPSBnZXRDb250ZXh0WG1sRGlyZWN0b3J5KGJhc2VEaXIuYXBwZW5kKCJjb25mIikpOwotCQlTdHJpbmcgbmFtZSA9IGNvbnRleHQuZ2V0UGF0aCgpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAobmFtZS5zdGFydHNXaXRoKCIvIikpCi0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCQluYW1lID0gIlJPT1QiOwotCQkJY29udGV4dEZpbGVQYXRoID0gY29udGV4dERpci5hcHBlbmQobmFtZSArICIueG1sIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUT0RPIFNldCBlcnJvciBzdGF0dXMKLQkJfQotCQlyZXR1cm4gY29udGV4dEZpbGVQYXRoOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB3b3JrIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCAKLQkgKiBDb250ZXh0LiBJZiB0aGUgd29yayBkaXJlY3Rvcnkgb2J0YWluZWQgaXMgcmVsYXRpdmUsCi0JICogaXQgaXMgYXBwZW5kZWQgdG8gdGhlIHNwZWNpZmllZCBiYXNlIHBhdGguIFRoaXMgbWV0aG9kCi0JICogd2lsbCByZXR1cm4gPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkIEhvc3QgaXMgbm90Ci0JICogZm91bmQgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLiAgVGhpcyBtZXRob2QgZG9lcwotCSAqIG5vdCB2ZXJpZnkgaWYgdGhlIHNwZWNpZmllZCBDb250ZXh0IGN1cnJlbnRseSBleGlzdHMKLQkgKiB3aXRoaW4gdGhlIHNlbGVjdGVkIEhvc3QuIAotCSAqIAotCSAqIEBwYXJhbSBiYXNlUGF0aCBQYXRoIHRvIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlci4KLQkgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdob3NlIHdvcmsgZGlyZWN0b3J5IHRvIHJldHVybi4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHdvcmsgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmZWQKLQkgKiBDb250ZXh0LiBSZXR1cm5zIDxiPm51bGw8L2I+IGlmIHRoZSBzZWxlY3RlZCBIb3N0IGNhbiBub3QgYmUKLQkgKiBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0Q29udGV4dFdvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgsIENvbnRleHQgY29udGV4dCkgewotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5lcnJvclhNTE51bGxDb250ZXh0QXJnKTsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGhvc3QgPT0gbnVsbCAmJiBnZXRIb3N0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIElmIHRoZSB3b3JrIGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbnRleHQsIHVzZSB0aGF0IG9uZQotCQlTdHJpbmcgd29ya0RpciA9IGNvbnRleHQuZ2V0QXR0cmlidXRlVmFsdWUoIndvcmtEaXIiKTsKLQkJaWYgKHdvcmtEaXIgPT0gbnVsbCkgewotCQkJLy8gSWYgY29udGV4dCBkb2Vzbid0IHNwZWNpZnkgdGhlIHdvcmsgZGlyZWN0b3J5LCBjaGVjayB0aGUgaG9zdAotCQkJaWYgKGhvc3RXb3JrRGlyID09IG51bGwpIHsKLQkJCQlob3N0V29ya0RpciA9IGhvc3QuZ2V0QXR0cmlidXRlVmFsdWUoIndvcmtEaXIiKTsKLQkJCQlpZiAoaG9zdFdvcmtEaXIgPT0gbnVsbCB8fCBob3N0V29ya0Rpci5sZW5ndGgoKSA9PSAwKQotCQkJCQkvLyBJZiBob3N0IGRvZXNuJ3Qgc3BlY2lmeSB0aGUgd29yayBkaXJlY3RvcnksIGJ1aWxkIHRoZSBkZWZhdWx0Ci0JCQkJCWhvc3RXb3JrRGlyID0gIndvcmsvIiArIGVuZ2luZU5hbWUgKyAiLyIgKyBob3N0TmFtZTsKLQkJCX0KLQkJCVN0cmluZyBjdHhOYW1lID0gY29udGV4dC5nZXRQYXRoKCk7Ci0JCQlpZiAoY3R4TmFtZS5zdGFydHNXaXRoKCIvIikpCi0JCQkJY3R4TmFtZSA9IGN0eE5hbWUuc3Vic3RyaW5nKDEpOwotCQkJY3R4TmFtZSA9IGN0eE5hbWUucmVwbGFjZSgnLycsICdfJyk7Ci0JCQljdHhOYW1lID0gY3R4TmFtZS5yZXBsYWNlKCdcXCcsICdfJyk7Ci0JCQlpZiAoY3R4TmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJCWN0eE5hbWUgPSAiXyI7Ci0JCQl3b3JrRGlyID0gaG9zdFdvcmtEaXIgKyAiLyIgKyBjdHhOYW1lOwotCQl9Ci0JCUlQYXRoIHdvcmtQYXRoID0gbmV3IFBhdGgod29ya0Rpcik7Ci0JCWlmICghd29ya1BhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlpZiAoYmFzZVBhdGggPT0gbnVsbCkKLQkJCQliYXNlUGF0aCA9IG5ldyBQYXRoKCIiKTsKLQkJCXdvcmtQYXRoID0gYmFzZVBhdGguYXBwZW5kKHdvcmtQYXRoKTsKLQkJfQotCQlyZXR1cm4gd29ya1BhdGg7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd29yayBkaXJlY3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWxlY3RlZCAKLQkgKiBIb3N0LiBJZiB0aGUgd29yayBkaXJlY3Rvcnkgb2J0YWluZWQgaXMgcmVsYXRpdmUsCi0JICogaXQgaXMgYXBwZW5kZWQgdG8gdGhlIHNwZWNpZmllZCBiYXNlIHBhdGguIFRoaXMgbWV0aG9kCi0JICogd2lsbCByZXR1cm4gPGI+bnVsbDwvYj4gaWYgdGhlIHNlbGVjdGVkIEhvc3QgaXMgbm90Ci0JICogZm91bmQgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlUGF0aCBQYXRoIHRvIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHNlcnZlci4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHdvcmsgZGlyZWN0b3J5IGZvciB0aGUgc2VsZWN0ZWQKLQkgKiBIb3N0LiBSZXR1cm5zIDxiPm51bGw8L2I+IGlmIHRoZSBzZWxlY3RlZCBIb3N0IGNhbiBub3QgYmUKLQkgKiBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0SG9zdFdvcmtEaXJlY3RvcnkoSVBhdGggYmFzZVBhdGgpIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKGhvc3QgPT0gbnVsbCAmJiBnZXRIb3N0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBJZiBjb250ZXh0IGRvZXNuJ3Qgc3BlY2lmeSB0aGUgd29yayBkaXJlY3RvcnksIGNoZWNrIHRoZSBob3N0Ci0JCWlmIChob3N0V29ya0RpciA9PSBudWxsKSB7Ci0JCQlob3N0V29ya0RpciA9IGhvc3QuZ2V0QXR0cmlidXRlVmFsdWUoIndvcmtEaXIiKTsKLQkJCWlmIChob3N0V29ya0RpciA9PSBudWxsIHx8IGhvc3RXb3JrRGlyLmxlbmd0aCgpID09IDApCi0JCQkJLy8gSWYgaG9zdCBkb2Vzbid0IHNwZWNpZnkgdGhlIHdvcmsgZGlyZWN0b3J5LCBidWlsZCB0aGUgZGVmYXVsdAotCQkJCWhvc3RXb3JrRGlyID0gIndvcmsvIiArIGVuZ2luZU5hbWUgKyAiLyIgKyBob3N0TmFtZTsKLQkJfQotCQlJUGF0aCB3b3JrUGF0aCA9IG5ldyBQYXRoKGhvc3RXb3JrRGlyKTsKLQkJaWYgKCF3b3JrUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCWlmIChiYXNlUGF0aCA9PSBudWxsKQotCQkJCWJhc2VQYXRoID0gbmV3IFBhdGgoIiIpOwotCQkJd29ya1BhdGggPSBiYXNlUGF0aC5hcHBlbmQod29ya1BhdGgpOwotCQl9Ci0JCXJldHVybiB3b3JrUGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9TZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMjRhNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZSBleHRlbmRzIFhNTEVsZW1lbnQgewotCXB1YmxpYyBTZXJ2aWNlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQ29ubmVjdG9yKSBmaW5kRWxlbWVudCgiQ29ubmVjdG9yIiwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29ubmVjdG9yQ291bnQoKSB7Ci0JCXJldHVybiBzaXplT2ZFbGVtZW50KCJDb25uZWN0b3IiKTsKLQl9Ci0KLQlwdWJsaWMgRW5naW5lIGdldEVuZ2luZSgpIHsKLQkJcmV0dXJuIChFbmdpbmUpIGZpbmRFbGVtZW50KCJFbmdpbmUiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiLCBuYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3ZlcmlmeUluc3RhbGwucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS92ZXJpZnlJbnN0YWxsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyM2MxNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3ZlcmlmeUluc3RhbGwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyB0aGlzIGZpbGUgbXVzdCBub3QgYmUgdHJhbnNsYXRlZAotCi12ZXJpZnkzMmluc3RhbGw9bGliL2phc3Blci5qYXIsbGliL3NlcnZsZXQuamFyfFtzZXJ2bGV0YXBpM10uamFyLGJpbixjb25mLHdlYmFwcHMKLXZlcmlmeTQwaW5zdGFsbD1saWIvbmFtaW5nLWZhY3RvcnkuamFyLGJpbi9ib290c3RyYXAuamFyLGNvbmYsd2ViYXBwcwotdmVyaWZ5NDFpbnN0YWxsPWNvbW1vbi9saWIvbmFtaW5nLWZhY3RvcnkuamFyLGNvbW1vbi9saWIvc2VydmxldC5qYXJ8W3NlcnZsZXRhcGk0XS5qYXIsYmluL2Jvb3RzdHJhcC5qYXIsY29uZix3ZWJhcHBzCi12ZXJpZnk1MGluc3RhbGw9Y29tbW9uL2xpYi9zZXJ2bGV0LWFwaS5qYXJ8W3NlcnZsZXRhcGk1XS5qYXIsY29tbW9uL2xpYi9uYW1pbmctY29tbW9uLmphcixiaW4vYm9vdHN0cmFwLmphcixjb25mLHdlYmFwcHMKLXZlcmlmeTU1aW5zdGFsbD1jb21tb24vaTE4bixiaW4vYm9vdHN0cmFwLmphcixjb25mLHdlYmFwcHMKLXZlcmlmeTYwaW5zdGFsbD1saWIvamFzcGVyLWVsLmphcixsaWIvc2VydmxldC1hcGkuamFyfFtzZXJ2bGV0YXBpNl0uamFyLGJpbi9ib290c3RyYXAuamFyLGNvbmYsd2ViYXBwcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmJlYjg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idG9tY2F0dWkvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzFmMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWlfMy4wLjAuamFyCi10b21jYXR1aS5qYXIKLXRlbXAuZm9sZGVyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4YjAzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkgcGx1Z2luCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZwotb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMWY3NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmU0MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgTm92IDEwIDE3OjExOjM1IEhTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMWYwODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jVHVlIEphbiAxNiAxNzowMTo1NiBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODRiZGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTg6MDY6MTEgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9dXNlcgotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTA2ZTk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNNb24gSmFuIDE1IDIxOjU2OjQ4IEVTVCAyMDA3Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubWlzc2luZy1wYWNrYWdlcz0yCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjYwZTkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Ub21jYXRVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMjA0LDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDQsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAzLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDMsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYjQ5NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNvdXJjZS4uID0gdG9tY2F0dWkvCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi9taW1lX2V4dGVuc2lvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L21pbWVfZXh0ZW5zaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU4NTAxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L21pbWVfZXh0ZW5zaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvbWltZV9tYXBwaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvbWltZV9tYXBwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4ZTRiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L21pbWVfbWFwcGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L3BvcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi9wb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzNTRiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L3BvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi9wcm9qZWN0X21pc3NpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi9wcm9qZWN0X21pc3NpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2I0YzE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvcHJvamVjdF9taXNzaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvdG9tY2F0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxYWUzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L3RvbWNhdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L3dlYl9tb2R1bGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyMGY3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L3dlYl9tb2R1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy93aXpiYW4vdG9tY2F0X3dpei5wbmcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL3dpemJhbi90b21jYXRfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NTY3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL3dpemJhbi90b21jYXRfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzBjOWIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUFwYWNoZSBUb21jYXQgVUkgU3VwcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLWNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVzUGFnZT1Nb2R1bGVzCi0KLWNsZWFuVG9tY2F0V29ya0Rpcj1DbGVhbiBUb21jYXQgV29yayBEaXJlY3RvcnkuLi4KLWNsZWFuVG9tY2F0TW9kdWxlV29ya0Rpcj1DbGVhbiBNb2R1bGUgV29yayBEaXJlY3RvcnkuLi4KLQotcHVibGlzaGVyQ29udGV4dEZpeExhYmVsPVVwZGF0ZSBjb250ZXh0IHBhdGhzCi1wdWJsaXNoZXJDb250ZXh0Rml4RGVzY3JpcHRpb249UHJvbXB0IHRvIHVwZGF0ZSBtb2R1bGUgY29udGV4dHMgd2hlbiB0aGV5IGFyZSBvdXQgb2Ygc3luYy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYWVmZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnNlcnZlckltYWdlcyI+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4zMiIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3RvbWNhdC5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjMyIi8+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MCIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3RvbWNhdC5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQwIi8+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MSIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3RvbWNhdC5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQxIi8+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3RvbWNhdC5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwIi8+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41NSIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3RvbWNhdC5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1Ii8+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC42MCIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3RvbWNhdC5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjYwIi8+Ci0KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjMyIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjMyIi8+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MCIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3RvbWNhdC5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MCIvPgotICAgICAgPGltYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi90b21jYXQuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIi8+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41NSIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3RvbWNhdC5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41NSIvPgotICAgICAgPGltYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNjAiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi90b21jYXQuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNjAiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0gICAgICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5wcm9wZXJ0eVRlc3RlciIKLSAgICAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkiCi0gICAgICAgICBwcm9wZXJ0aWVzPSJoYXNDb25maWd1cmF0aW9uIgotICAgICAgICAgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db25maWd1cmF0aW9uUHJvcGVydHlUZXN0ZXIiPgotICAgICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvclBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29uZmlndXJhdGlvbi5lZGl0b3Iud2VibW9kdWxlIgotICAgICAgICAgb3JkZXI9IjIwIgotICAgICAgICAgbmFtZT0iJWNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVzUGFnZSIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LioiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuZWRpdG9yLkNvbmZpZ3VyYXRpb25XZWJNb2R1bGVFZGl0b3JQYXJ0Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaGFzQ29uZmlndXJhdGlvbiIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvclBhZ2VTZWN0aW9ucyI+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnNlcnZlci5lZGl0b3IuaW5zdGFuY2UiCi0gICAgICAgICBvcmRlcj0iMCIKLSAgICAgICAgIGluc2VydGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmVkaXRvci5vdmVydmlldy5sZWZ0IgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuKiIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uIi8+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnNlcnZlci5lZGl0b3IuZ2VuZXJhbCIKLSAgICAgICAgIG9yZGVyPSI1IgotICAgICAgICAgaW5zZXJ0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZWRpdG9yLm92ZXJ2aWV3LmxlZnQiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4qIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbiIvPgotICAgICAgPHNlY3Rpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb25maWd1cmF0aW9uLmVkaXRvci5wb3J0IgotICAgICAgICAgb3JkZXI9IjEwIgotICAgICAgICAgaW5zZXJ0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZWRpdG9yLm92ZXJ2aWV3LnJpZ2h0IgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuKiIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5lZGl0b3IuQ29uZmlndXJhdGlvblBvcnRFZGl0b3JTZWN0aW9uIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaGFzQ29uZmlndXJhdGlvbiIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvc2VjdGlvbj4KLSAgICAgIDxzZWN0aW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29uZmlndXJhdGlvbi5lZGl0b3IubWltZSIKLSAgICAgICAgIG9yZGVyPSIyMCIKLSAgICAgICAgIGluc2VydGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmVkaXRvci5vdmVydmlldy5yaWdodCIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LioiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuZWRpdG9yLkNvbmZpZ3VyYXRpb25NaW1lRWRpdG9yU2VjdGlvbiI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmhhc0NvbmZpZ3VyYXRpb24iIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmRGcmFnbWVudHMiPgotICAgICAgPGZyYWdtZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4zMiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuMzIiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVG9tY2F0UnVudGltZVdpemFyZEZyYWdtZW50Ii8+Ci0gICAgICA8ZnJhZ21lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQwIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MCIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Ub21jYXRSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4KLSAgICAgIDxmcmFnbWVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDEiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQxIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPgotICAgICAgPGZyYWdtZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MCIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVG9tY2F0UnVudGltZVdpemFyZEZyYWdtZW50Ii8+Ci0gICAgICA8ZnJhZ21lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1IgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41NSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Ub21jYXRSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4KLSAgICAgIDxmcmFnbWVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNjAiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjYwIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZXMiPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZSIKLSAgICAgIGNvbmZpZ1R5cGVJRD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgIGljb249Imljb25zL29iajE2L3RvbWNhdC5naWYiPgotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwcyI+Ci0gICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cAotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCIKLSAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIj4KLSAgICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cD4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmltYWdlcyI+Ci0gICAgPGltYWdlIHJ1bnRpbWUtY29tcG9uZW50LXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgcGF0aD0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0Ii8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5SdW50aW1lTGFiZWxQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLnNlcnZlcmFjdGlvbnMiCi0gICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIiPgotICAgICAgPHZpc2liaWxpdHk+Ci0gICAgICAgICAgPG9iamVjdFN0YXRlIG5hbWU9InNlcnZlclR5cGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4qIi8+Ci0gICAgICA8L3Zpc2liaWxpdHk+Ci0gICAgICA8YWN0aW9uIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuYWN0aW9ucy5DbGVhbldvcmtEaXJBY3Rpb24iCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5jbGVhbnNlcnZlcndvcmtkaXIiCi0gICAgICAgIGxhYmVsPSIlY2xlYW5Ub21jYXRXb3JrRGlyIj4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5zZXJ2ZXJhY3Rpb25zIgotICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLk1vZHVsZVNlcnZlciI+Ci0gICAgICA8dmlzaWJpbGl0eT4KLSAgICAgICAgPGFuZD4KLSAgICAgICAgICA8b2JqZWN0U3RhdGUgbmFtZT0ic2VydmVyVHlwZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LioiLz4KLSAgICAgICAgICA8b2JqZWN0U3RhdGUgbmFtZT0ibW9kdWxlVHlwZSIgdmFsdWU9ImpzdC53ZWIiLz4KLSAgICAgICAgPC9hbmQ+Ci0gICAgICA8L3Zpc2liaWxpdHk+Ci0gICAgICA8YWN0aW9uCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5hY3Rpb25zLkNsZWFuV29ya0RpckFjdGlvbiIKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmNsZWFubW9kdWxld29ya2RpciIKLSAgICAgICAgbGFiZWw9IiVjbGVhblRvbWNhdE1vZHVsZVdvcmtEaXIiPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5wdWJsaXNoZXJzIj4KLSAgICAgPHB1Ymxpc2hlcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuY29udGV4dCIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuKiIKLSAgICAgICAgbmFtZT0iJXB1Ymxpc2hlckNvbnRleHRGaXhMYWJlbCIKLSAgICAgICAgZGVzY3JpcHRpb249IiVwdWJsaXNoZXJDb250ZXh0Rml4RGVzY3JpcHRpb24iCi0gICAgICAgIG9yZGVyPSIiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0UHVibGlzaGVyRGVsZWdhdGUiLz4KLSAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL0NsZWFuV29ya0RpckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9DbGVhbldvcmtEaXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhOWQ4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL0NsZWFuV29ya0RpckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FTIEluc3RpdHV0ZSwgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIExhcnJ5IElzYWFjcyAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRXZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXJCZWhhdmlvdXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyOwotCi0vKioKLSAqIERpYWxvZyB0byBjb25maXJtIGRlbGV0aW9uIG9mIHRoZSB3b3JrIGRpcmVjdG9yeSBmb3IgYSBtb2R1bGUgb24gYQotICogc2VydmVyLCBvciB0aGUgd29yayBkaXJlY3RvcnkgZm9yIHRoZSBlbnRpcmUgc2VydmVyLiAgSGFuZGxpbmcKLSAqIGluY2x1ZGVzIHN0b3BwaW5nIGFuZCByZXN0YXJ0aW5nIHRoZSBzZXJ2ZXIgaWYgaXQgaXMgcnVubmluZyBhdAotICogdGhlIHRpbWUgb2YgdGhlIGRlbGV0aW9uLiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGVhbldvcmtEaXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU7Ci0JcHJvdGVjdGVkIGludCBzdGF0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1vZGU7Ci0JcHJvdGVjdGVkIElTdGF0dXMgY29tcGxldGlvblN0YXR1czsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgZGlhbG9nIGluc3RhbmNlIGNvbmZpcm0gZGVsZXRpb24gb2YgdGhlIHdvcmsgZGlyZWN0b3J5IGZvciBhCi0JICogbW9kdWxlIG9uIGEgc2VydmVyLCBvciB0aGUgd29yayBkaXJlY3RvcnkgZm9yIHRoZSBlbnRpcmUgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCB0aGUgcGFyZW50IHNoZWxsLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBjcmVhdGUgYQotCSAqICB0b3AtbGV2ZWwgc2hlbGwKLQkgKiBAcGFyYW0gc2VydmVyIHNlcnZlciBvbiB3aGljaCB0byBkZWxldGUgdGhlIHdvcmsgZGlyZWN0b3J5Ci0JICogQHBhcmFtIG1vZHVsZSBtb2R1bGUgd2hvc2Ugd29yayBkaXJlY3RvcnkgaXMgdG8gYmUgZGVsZXRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgaWYgdGhlc2Ugc2VydmVyJ3MgZW50aXJlIHdvcmsgZGlyZWN0b3J5IGlzIHRvIGJlIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIENsZWFuV29ya0RpckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGUgbW9kdWxlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJCi0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuY29uZmlybUNsZWFuV29ya0RpclRpdGxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pIAotCQkJY2FwdHVyZVNlcnZlclN0YXRlKCk7Ci0KLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCS8vIFNpbmNlIHRoZXJlIGFyZSBvbmx5IGxhYmVsIHdpZGdldHMgb24gdGhpcyBwYWdlLCBzZXQgdGhlIGhlbHAgb24gdGhlIHBhcmVudAotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgQ29udGV4dElkcy5TRVJWRVJfQ0xFQU5fV09SS19ESVIpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORyB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikgewotCQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy5jbGVhblNlcnZlclN0YXRlQ2hhbmdpbmcsIHNlcnZlci5nZXROYW1lKCkpKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChtb2R1bGUgIT0gbnVsbCkKLQkJCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLmNsZWFuTW9kdWxlV29ya0RpciwgbW9kdWxlLmdldE5hbWUoKSwgc2VydmVyLmdldE5hbWUoKSkpOwotCQkJZWxzZQotCQkJCWxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMuY2xlYW5TZXJ2ZXJXb3JrRGlyLCBzZXJ2ZXIuZ2V0TmFtZSgpKSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKLQkJCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmNsZWFuU2VydmVyUnVubmluZyk7Ci0JCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihwYXJlbnQpOwotCi0JCWlmIChzdGF0ZSA8IDAgfHwgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKSAKLQkJCWNhcHR1cmVTZXJ2ZXJTdGF0ZSgpOwotCi0JCS8vIElmIHNlcnZlciBpcyB0cmFuc2l0aW9uaW5nLCBvbmx5IGFsbG93IENhbmNlbAotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORyB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCQkJaWYgKGJ1dHRvbiAhPSBudWxsKQotCQkJCWJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJU3RyaW5nIGpvYk5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5jbGVhblNlcnZlclRhc2ssCi0JCQkJbW9kdWxlICE9IG51bGwgPyBtb2R1bGUuZ2V0TmFtZSgpIDogc2VydmVyLmdldE5hbWUoKSk7Ci0JCS8vIENyZWF0ZSBqb2IgdG8gcGVyZm9ybSB0aGUgY2xlYW5pbmcsIGluY2x1ZGluZyBzdG9wcGluZyBhbmQgc3RhcnRpbmcgdGhlIHNlcnZlciBpZiBuZWNlc3NhcnkKLQkJQ2xlYW5Xb3JrRGlySm9iIGpvYiA9IG5ldyBDbGVhbldvcmtEaXJKb2Ioam9iTmFtZSk7Ci0JCS8vIE5vdGU6IFNpbmNlIHN0b3AgYW5kIHN0YXJ0LCBpZiBuZWVkZWQsIHdpbGwgc2V0IHNjaGVkdWxpbmcgcnVsZXMgaW4gdGhlaXIgam9icywKLQkJLy8gZG9uJ3Qgc2V0IG9uZSBoZXJlLiBJbnN0ZWFkIGRvIHRoZSBhY3R1YWwgZGVsZXRpb24gaW4gYSBjaGlsZCBqb2IgdG9vIHdpdGggdGhlCi0JCS8vIHNjaGVkdWxpbmcgcnVsZSBvbiB0aGF0IGpvYiwgbGlrZSBzdG9wIGFuZCBzdGFydC4KLQkJam9iLnNjaGVkdWxlKCk7Ci0JCQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0JCi0JLyoKLQkgKiBKb2IgdG8gY2xlYW4gdGhlIGFwcHJvcHJpYXRlIFRvbWNhdCB3b3JrIGRpcmVjdG9yeS4gIEl0IGluY2x1ZGVzCi0JICogc3RvcHBpbmcgYW5kIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIgaWYgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgcnVubmluZy4KLQkgKiBUaGUgc3RvcHBpbmcsIGRlbGV0aW9uLCBhbmQgc3RhcnRpbmcgYXJlIGFsbCBkb25lIHdpdGggY2hpbGQgam9icywKLQkgKiBlYWNoIHVzaW5nIHRoZSBzZXJ2ZXIgc2NoZWR1bGluZyBydWxlLiAgVGh1cywgdGhpcyBqb2Igc2hvdWxkCi0JICogbm90IHVzZSB0aGlzIHJ1bGUgb3IgaXQgd2lsbCBibG9jayB0aGVzZSBjaGlsZCBqb2JzLiAKLQkgKi8KLQljbGFzcyBDbGVhbldvcmtEaXJKb2IgZXh0ZW5kcyBKb2IgewotCQkvKioKLQkJICogQHBhcmFtIG5hbWUgbmFtZSBmb3Igam9iCi0JCSAqLwotCQlwdWJsaWMgQ2xlYW5Xb3JrRGlySm9iKFN0cmluZyBqb2JOYW1lKSB7Ci0JCQlzdXBlcihqb2JOYW1lKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIEpvYiNiZWxvbmdzVG8oT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJZmluYWwgT2JqZWN0IG11dGV4ID0gbmV3IE9iamVjdCgpOwotCi0JCQlJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IG51bGw7Ci0JCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCQl3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSltb2R1bGUubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKHdlYk1vZHVsZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXdFcnJvclN0YXR1cyhOTFMuYmluZChNZXNzYWdlcy5lcnJvckNhbnRJZGVudGlmeVdlYkFwcCwgbW9kdWxlLmdldE5hbWUoKSksIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gSWYgc3RhdGUgaGFzIGNoYW5nZWQgc2luY2UgZGlhbG9nIHdhcyBvcGVuLCBhYm9ydAotCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IHN0YXRlKSB7Ci0JCQkJcmV0dXJuIG5ld0Vycm9yU3RhdHVzKAotCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdENsZWFuU3RhdGVDaGFuZ2UsIHNlcnZlci5nZXROYW1lKCkpLCBudWxsKTsKLQkJCX0KLQotCQkJSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElPcGVyYXRpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0KSB7Ci0JCQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCQkJCWNvbXBsZXRpb25TdGF0dXMgPSByZXN1bHQ7Ci0JCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQkKLQkJCWJvb2xlYW4gcmVzdGFydCA9IGZhbHNlOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJLy8gSWYgc2VydmVyIGlzbid0IHN0b3BwZWQsIHRyeSB0byBzdG9wLCBjbGVhbiwgYW5kIHJlc3RhcnQKLQkJCWlmIChzdGF0ZSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCQlzdGF0dXMgPSBzZXJ2ZXIuY2FuU3RvcCgpOwotCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlyZXR1cm4gd3JhcEVycm9yU3RhdHVzKHN0YXR1cywgCi0JCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdENsZWFuQ2FudFN0b3AsIHNlcnZlci5nZXROYW1lKCkpKTsKLQkJCQl9Ci0KLQkJCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJCQlib29sZWFuIGZvcmNlID0gZmFsc2U7Ci0JCQkJd2hpbGUgKCFkb25lKSB7Ci0JCQkJCS8vIFN0b3AgdGhlIHNlcnZlciBhbmQgd2FpdCBmb3IgY29tcGxldGlvbgotCQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQkJCQlzZXJ2ZXIuc3RvcChmb3JjZSwgbGlzdGVuZXIpOwotCi0JCQkJCQl3aGlsZSAoY29tcGxldGlvblN0YXR1cyA9PSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbXV0ZXgud2FpdCgpOwotCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gSWdub3JlCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIElmIGZvcmNlZCwgb3IgdGhlcmUgd2FzIGFuIGVycm9yIChkb2Vzbid0IGluY2x1ZGUgdGltZW91dCksIG9yIHdlIGFyZSBzdG9wcGVkLCB0aW1lIHRvIGV4aXQKLQkJCQkJaWYgKGZvcmNlIHx8ICFjb21wbGV0aW9uU3RhdHVzLmlzT0soKSB8fCBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZm9yY2UgPSBUb21jYXRVSVBsdWdpbi5xdWVyeUNsZWFuVGVybWluYXRpb24oc2VydmVyKTsKLQkJCQkJCWNvbXBsZXRpb25TdGF0dXMgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCi0JCQkJaWYgKCFjb21wbGV0aW9uU3RhdHVzLmlzT0soKSkgewotCQkJCQkvLyBJZiBzdG9wIGpvYiBmYWlsZWQsIGFzc3VtZSBlcnJvciB3YXMgZGlzcGxheWVkIGZvciB0aGF0IGpvYgotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJCQlyZXR1cm4gbmV3RXJyb3JTdGF0dXMoCi0JCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdENsZWFuU3RvcEZhaWxlZCwgc2VydmVyLmdldE5hbWUoKSksIG51bGwpOwotCQkJCX0KLQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKLQkJCQljb21wbGV0aW9uU3RhdHVzID0gbnVsbDsKLQkJCX0KLQkJCQotCQkJRGVsZXRlV29ya0RpckpvYiBkZWxldGVKb2IgPSBuZXcgRGVsZXRlV29ya0RpckpvYihnZXROYW1lKCksIHdlYk1vZHVsZSwgcmVzdGFydCk7Ci0JCQlkZWxldGVKb2Iuc2V0UnVsZShTZXJ2ZXJVdGlsLmdldFNlcnZlclNjaGVkdWxpbmdSdWxlKHNlcnZlcikpOwotCi0JCQlkZWxldGVKb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJCQkJY29tcGxldGlvblN0YXR1cyA9IGV2ZW50LmdldFJlc3VsdCgpOwotCQkJCQkJbXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0pOwotCi0JCQkvLyBQZXJmb3JtIHRoZSB3b3JrIGRpcmVjdG9yeSBkZWxldGlvbiBqb2IKLQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCQlkZWxldGVKb2Iuc2NoZWR1bGUoKTsKLQotCQkJCXdoaWxlIChjb21wbGV0aW9uU3RhdHVzID09IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW11dGV4LndhaXQoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gSWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWNvbXBsZXRpb25TdGF0dXMuaXNPSygpKSB7Ci0JCQkJLy8gSWYgZGVsZXRlIGpvYiBmYWlsZWQsIGFzc3VtZSBlcnJvciB3YXMgZGlzcGxheWVkIGZvciB0aGF0IGpvYgotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQkJY29tcGxldGlvblN0YXR1cyA9IG51bGw7Ci0KLQkJCWlmIChyZXN0YXJ0KSB7Ci0JCQkJc3RhdHVzID0gc2VydmVyLmNhblN0YXJ0KG1vZGUpOwotCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlyZXR1cm4gd3JhcEVycm9yU3RhdHVzKHN0YXR1cywgCi0JCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDbGVhbkNhbnRSZXN0YXJ0LCBzZXJ2ZXIuZ2V0TmFtZSgpKSk7Ci0JCQkJfQotCi0JCQkJLy8gUmVzdGFydCB0aGUgc2VydmVyIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uCi0JCQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJCQlzZXJ2ZXIuc3RhcnQobW9kZSwgbGlzdGVuZXIpOwotCi0JCQkJCXdoaWxlIChjb21wbGV0aW9uU3RhdHVzID09IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbXV0ZXgud2FpdCgpOwotCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIElnbm9yZQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmICghY29tcGxldGlvblN0YXR1cy5pc09LKCkpIHsKLQkJCQkJLy8gSWYgc3RhcnQgam9iIGZhaWxlZCwgYXNzdW1lIGVycm9yIHdhcyBkaXNwbGF5ZWQgZm9yIHRoYXQgam9iCi0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBKb2IgdG8gYWN0dWFsbHkgZGVsZXRlIHRoZSB3b3JrIGRpcmVjdG9yeS4gIFRoaXMgaXMgZG9uZQotCSAqIGluIGEgc2VwYXJhdGUgam9iIHNvIGl0IGNhbiBiZSBhICJzaWJsaW5nIiBvZiBwb3RlbnRpYWwKLQkgKiBzdG9wIGFuZCBzdGFydCBqb2JzLiBUaGlzIGFsbG93cyBpdCB0byBoYXZlIGEgc2VydmVyCi0JICogc2NoZWR1bGluZyBydWxlLgotCSAqLwotCWNsYXNzIERlbGV0ZVdvcmtEaXJKb2IgZXh0ZW5kcyBKb2IgewotCQlwcml2YXRlIElXZWJNb2R1bGUgd2ViTW9kdWxlOwotCQlwcml2YXRlIGJvb2xlYW4gcmVzdGFydDsKLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gbmFtZSBuYW1lIGZvciBqb2IKLQkJICovCi0JCXB1YmxpYyBEZWxldGVXb3JrRGlySm9iKFN0cmluZyBqb2JOYW1lLCBJV2ViTW9kdWxlIHdlYk1vZHVsZSwgYm9vbGVhbiByZXN0YXJ0KSB7Ci0JCQlzdXBlcihqb2JOYW1lKTsKLQkJCXRoaXMud2ViTW9kdWxlID0gd2ViTW9kdWxlOwotCQkJdGhpcy5yZXN0YXJ0ID0gcmVzdGFydDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIEpvYiNiZWxvbmdzVG8oT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCi0JCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkvLyBJZiBzZXJ2ZXIgaXNuJ3Qgc3RvcHBlZCwgYWJvcnQgdGhlIGF0dGVtcHQgdG8gZGVsZXRlIHRoZSB3b3JrIGRpcmVjdG9yeQotCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJCXJldHVybiBuZXdFcnJvclN0YXR1cygKLQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ2FudERlbGV0ZVNlcnZlck5vdFN0b3BwZWQsIAotCQkJCQkJCQl3ZWJNb2R1bGUgIT0gbnVsbCA/IG1vZHVsZS5nZXROYW1lKCkgOiBzZXJ2ZXIuZ2V0TmFtZSgpKSwgbnVsbCk7Ci0JCQl9CQkJCQotCi0JCQkvLyBEZWxldGUgdGhlIHdvcmsgZGlyZWN0b3J5Ci0JCQlUb21jYXRTZXJ2ZXJCZWhhdmlvdXIgdHNiID0gKFRvbWNhdFNlcnZlckJlaGF2aW91cilzZXJ2ZXIubG9hZEFkYXB0ZXIoCi0JCQkJCVRvbWNhdFNlcnZlckJlaGF2aW91ci5jbGFzcywgbW9uaXRvcik7Ci0JCQl0cnkgewotCQkJCWlmICh3ZWJNb2R1bGUgIT0gbnVsbCkgewotCQkJCQlJVG9tY2F0V2ViTW9kdWxlIHRjV2ViTW9kdWxlID0gbmV3IFdlYk1vZHVsZSh3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKSwgIiIsICIiLCB0cnVlKTsKLQkJCQkJc3RhdHVzID0gdHNiLmNsZWFuQ29udGV4dFdvcmtEaXIodGNXZWJNb2R1bGUsIG51bGwpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3RhdHVzID0gdHNiLmNsZWFuU2VydmVyV29ya0RpcihudWxsKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0JCQl9Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgY2xlYW5OYW1lID0gbW9kdWxlICE9IG51bGwgPyBtb2R1bGUuZ2V0TmFtZSgpIDogc2VydmVyLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gd3JhcEVycm9yU3RhdHVzKHN0YXR1cywKLQkJCQkJCXJlc3RhcnQgPwotCQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckVycm9yRHVyaW5nQ2xlYW5XYXNSdW5uaW5nLCAKLQkJCQkJCQkJCQljbGVhbk5hbWUgLCBzZXJ2ZXIuZ2V0TmFtZSgpKSA6Ci0JCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRXJyb3JEdXJpbmdDbGVhbiwgY2xlYW5OYW1lKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjYXB0dXJlU2VydmVyU3RhdGUoKSB7Ci0JCXN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCWlmIChzdGF0ZSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCW1vZGUgPSBzZXJ2ZXIuZ2V0TW9kZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgbmV3RXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCW1lc3NhZ2UsIHRocm93YWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJU3RhdHVzIHdyYXBFcnJvclN0YXR1cyhJU3RhdHVzIHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTXVsdGlTdGF0dXMgbXMgPSBuZXcgTXVsdGlTdGF0dXMoVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lELCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJbXMuYWRkKHN0YXR1cyk7Ci0JCXJldHVybiBtczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Db25maWd1cmF0aW9uUHJvcGVydHlUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvQ29uZmlndXJhdGlvblByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MmIyZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Db25maWd1cmF0aW9uUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXM7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSVByb3BlcnR5VGVzdGVyI3Rlc3QoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIgPSAoSVNlcnZlckF0dHJpYnV0ZXMpIHJlY2VpdmVyOwotCQkJVG9tY2F0U2VydmVyIHRvbWNhdFNlcnZlciA9IChUb21jYXRTZXJ2ZXIpIHNlcnZlci5sb2FkQWRhcHRlcihJVG9tY2F0U2VydmVyLmNsYXNzLCBudWxsKTsKLQkJCWlmICh0b21jYXRTZXJ2ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gdG9tY2F0U2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSAhPSBudWxsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjYwNjExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotLyoqCi0gKiBDb25zdGFudCBpZHMgZm9yIGNvbnRleHQgaGVscC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZXh0SWRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfRURJVE9SID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZWlnMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0VESVRPUl9URVNUX0VOVklST05NRU5UID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZWlnMDAwMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0VESVRPUl9TRUNVUkUgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlaWcwMDA0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfRURJVE9SX0RFQlVHX01PREUgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlaWcwMDA2IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVMgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY3cwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTX0xJU1QgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY3cwMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTX0FERF9QUk9KRUNUID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZWN3MDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFU19BRERfRVhURVJOQUwgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY3cwMDA2IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTX0VESVQgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY3cwMDA4IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTX1JFTU9WRSA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjdzAwMTAiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPRyA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGR3bTAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRV9ESUFMT0dfUFJPSkVDVCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGRwcjAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRV9ESUFMT0dfUEFUSCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGRwcjAwMDQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRV9ESUFMT0dfRE9DQkFTRSA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGRwcjAwMDYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRV9ESUFMT0dfUkVMT0FEID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZHByMDAwOCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HUyA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjbTAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdTX0xJU1QgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY20wMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HU19BREQgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY20wMDA0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HU19FRElUID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZWNtMDAwNiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR1NfUkVNT1ZFID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZWNtMDAwOCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HX0RJQUxPRyA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGRtbTAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdfRElBTE9HX1RZUEUgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRkbW0wMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HX0RJQUxPR19FWFRFTlNJT04gPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRkbW0wMDA0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1BPUlRTID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZWNwMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfUE9SVFNfTElTVCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjcDAwMDIiOwotCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX0NPTVBPU0lURSA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudHducjAwMDAiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0NMRUFOX1dPUktfRElSID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50dmNwMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0NMRUFOX1dPUktfRElSX1RFUk1JTkFURSA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudHZjcDAwMDEiOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Db250ZXh0UHVibGlzaGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvQ29udGV4dFB1Ymxpc2hlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyN2U1MTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Db250ZXh0UHVibGlzaGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoZXJEZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIENvbnRleHRQdWJsaXNoZXJEZWxlZ2F0ZSBleHRlbmRzIFB1Ymxpc2hlckRlbGVnYXRlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFFVQUxJRklFRF9OQU1FID0gbmV3IFF1YWxpZmllZE5hbWUoVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lELCAiY29udGV4dFJvb3QiKTsKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoaW50IGtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHRoaXMgcHVibGlzaGVyIG9ubHkgcnVucyB3aGVuIHRoZXJlIGlzIGEgVUkKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSAoU2hlbGwpIGluZm8uZ2V0QWRhcHRlcihTaGVsbC5jbGFzcyk7Ci0JCWlmIChzaGVsbCA9PSBudWxsKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJVG9tY2F0U2VydmVyIHRvbWNhdFNlcnZlciA9IChUb21jYXRTZXJ2ZXIpIHNlcnZlci5sb2FkQWRhcHRlcihUb21jYXRTZXJ2ZXIuY2xhc3MsIG1vbml0b3IpOwotCQlmaW5hbCBUb21jYXRDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSB0b21jYXRTZXJ2ZXIuZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCQkKLQkJZmluYWwgYm9vbGVhbltdIHNhdmUgPSBuZXcgYm9vbGVhblsxXTsKLQkJTGlzdCBtb2R1bGVzID0gKExpc3QpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19NT0RVTEVTKTsKLQkJaW50IHNpemUgPSBtb2R1bGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlNb2R1bGVbXSBtb2R1bGUgPSAoSU1vZHVsZVtdKSBtb2R1bGVzLmdldChpKTsKLQkJCWZpbmFsIElNb2R1bGUgbSA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07Ci0JCQlJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChJV2ViTW9kdWxlKSBtLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG1vbml0b3IpOwotCQkJZmluYWwgV2ViTW9kdWxlIHdlYk1vZHVsZTIgPSBjb25maWd1cmF0aW9uLmdldFdlYk1vZHVsZShtKTsKLQkJCWlmICh3ZWJNb2R1bGUgIT0gbnVsbCAmJiB3ZWJNb2R1bGUyICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgY29udGV4dFJvb3QgPSB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKTsKLQkJCQlpZiAoY29udGV4dFJvb3QgIT0gbnVsbCAmJiAhY29udGV4dFJvb3Quc3RhcnRzV2l0aCgiLyIpICYmIGNvbnRleHRSb290Lmxlbmd0aCgpID4gMCkKLQkJCQkJY29udGV4dFJvb3QgPSAiLyIgKyBjb250ZXh0Um9vdDsKLQkJCQkKLQkJCQlpZiAoIWNvbnRleHRSb290LmVxdWFscyh3ZWJNb2R1bGUyLmdldFBhdGgoKSkgJiYgc2hvdWxkUHJvbXB0KG0sIGNvbnRleHRSb290KSkgewotCQkJCQlmaW5hbCBTdHJpbmcgY29udGV4dCA9IGNvbnRleHRSb290OwotCQkJCQlzaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihzaGVsbCwgTWVzc2FnZXMud2l6YXJkVGl0bGUsIE5MUy5iaW5kKE1lc3NhZ2VzLmNvbnRleHRDbGVhbnVwLCBtLmdldE5hbWUoKSkpKSB7Ci0JCQkJCQkJCWludCBpbmRleCA9IGNvbmZpZ3VyYXRpb24uZ2V0V2ViTW9kdWxlcygpLmluZGV4T2Yod2ViTW9kdWxlMik7Ci0JCQkJCQkJCWNvbmZpZ3VyYXRpb24ubW9kaWZ5V2ViTW9kdWxlKGluZGV4LCB3ZWJNb2R1bGUyLmdldERvY3VtZW50QmFzZSgpLCBjb250ZXh0LCB3ZWJNb2R1bGUyLmlzUmVsb2FkYWJsZSgpKTsKLQkJCQkJCQkJc2F2ZVswXSA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJbWFya1Byb2plY3QobSwgY29udGV4dFJvb3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2F2ZVswXSkKLQkJCXRvbWNhdFNlcnZlci5zYXZlQ29uZmlndXJhdGlvbihtb25pdG9yKTsKLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFByb21wdChJTW9kdWxlIG0sIFN0cmluZyBjb250ZXh0Um9vdCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gbS5nZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCXRyeSB7Ci0JCQlTdHJpbmcgcyA9IHByb2plY3QuZ2V0UGVyc2lzdGVudFByb3BlcnR5KFFVQUxJRklFRF9OQU1FKTsKLQkJCWlmIChzID09IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gIWNvbnRleHRSb290LmVxdWFscyhzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtYXJrUHJvamVjdChJTW9kdWxlIG0sIFN0cmluZyBjb250ZXh0Um9vdCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gbS5nZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQkJcHJvamVjdC5zZXRQZXJzaXN0ZW50UHJvcGVydHkoUVVBTElGSUVEX05BTUUsIGNvbnRleHRSb290KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gaWdub3JlLCBpdCdzIG9rIHRvIHByb21wdCBhZ2FpbiBsYXRlcgotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0ZGI4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpemFyZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpemFyZERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxEaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbERpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEluc3RhbGxEaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbGVkSlJFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxlZEpSRXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZURlZmF1bHRKUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yQWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvckVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvckJyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdXZWJNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwaW5nc1NlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwaW5nc0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0c1NlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvclBvcnRzRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvclBvcnROYW1lQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0VmFsdWVDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNQYWdlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNTZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVzRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvclBhdGhDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckRvY0Jhc2VDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvclByb2plY3RDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvclJlbG9hZENvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWRkUHJvamVjdE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWRkRXh0ZXJuYWxNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvclByb2plY3RNaXNzaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWRFbmFibGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWREaXNhYmxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBwaW5nRGlhbG9nVGl0bGVFZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dUaXRsZUFkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBwaW5nRGlhbG9nTWltZVR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ01pbWVFeHRlbnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yTG9jYXRpb25zU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JMb2NhdGlvbnNEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JMb2NhdGlvbnNEZXNjcmlwdGlvbjI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yR2VuZXJhbFNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yR2VuZXJhbERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvclNlcnZlckRpck1ldGFkYXRhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvclNlcnZlckRpckluc3RhbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yU2VydmVyRGlyQ3VzdG9tOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvclNldEludGVybmFsU2VydmVyRGlyTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JTZXRJbnRlcm5hbFNlcnZlckRpckxpbmsyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvclNldEluc3RhbGxTZXJ2ZXJEaXJMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvclNldEluc3RhbGxTZXJ2ZXJEaXJMaW5rMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JTZXREZWZhdWx0RGVwbG95RGlyTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JTZXREZWZhdWx0RGVwbG95RGlyTGluazI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yU2VydmVyRGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvckRlcGxveURpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JUZXN0RW52aXJvbm1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yTm9QdWJsaXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvclNlcGFyYXRlQ29udGV4dEZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvclNlY3VyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JEZWJ1Z01vZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yTm90U3VwcG9ydGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvckRvZXNOb3RNb2RpZnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yVGFrZXNDb250cm9sOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU2VydmVyTXVzdEJlU3RvcHBlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclNlcnZlckRpcklzUm9vdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclNlcnZlckRpclVuZGVyUm9vdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclNlcnZlckRpckN1c3RvbU5vdE1ldGFkYXRhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU2VydmVyRGlyQ3VzdG9tTm90SW5zdGFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRlcGxveURpck5vdFNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JCcm93c2VTZXJ2ZXJNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvckJyb3dzZURlcGxveU1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1RpdGxlRWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nVGl0bGVBZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1Byb2plY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dEb2N1bWVudEJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1NlbGVjdERpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nUGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nUmVsb2FkRW5hYmxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRlZmF1bHREaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtQ2xlYW5Xb3JrRGlyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYW5TZXJ2ZXJTdGF0ZUNoYW5naW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFuTW9kdWxlV29ya0RpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhblNlcnZlcldvcmtEaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYW5TZXJ2ZXJSdW5uaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFuU2VydmVyVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90Q2xlYW5TdGF0ZUNoYW5nZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90Q2xlYW5DYW50U3RvcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90Q2xlYW5TdG9wRmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ2FudElkZW50aWZ5V2ViQXBwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ2FudERlbGV0ZVNlcnZlck5vdFN0b3BwZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JFcnJvckR1cmluZ0NsZWFuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRXJyb3JEdXJpbmdDbGVhbldhc1J1bm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDbGVhbkNhbnRSZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRleHRDbGVhbnVwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFuVGVybWluYXRlU2VydmVyRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYW5UZXJtaW5hdGVTZXJ2ZXJEaWFsb2dNZXNzYWdlOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmludGVybmFsLk1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZTgwZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAtLS0tLS0tLS0tLS0tLS0gR2VuZXJhbCBVSSAtLS0tLS0tLS0tLS0tLS0KLQotcnVudGltZU5hbWU9TmEmbWU6Ci1icm93c2U9QiZyb3dzZS4uLgotaW5zdGFsbD1Eb3dubG9hZCBhbmQgSW5zdGFsbC4uLgotaW5zdGFsbERpYWxvZ1RpdGxlPURvd25sb2FkIGFuZCBJbnN0YWxsCi1pbnN0YWxsRGlyPVRvbWNhdCBpbnN0YWxsYXRpb24gJmRpcmVjdG9yeToKLWluc3RhbGxlZEpSRT0mSlJFOgotaW5zdGFsbGVkSlJFcz0mSW5zdGFsbGVkIEpSRXMuLi4KLXNlbGVjdEluc3RhbGxEaXI9U2VsZWN0IFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotcnVudGltZURlZmF1bHRKUkU9V29ya2JlbmNoIGRlZmF1bHQgSlJFCi1jb250ZXh0Q2xlYW51cD1UaGUgY29udGV4dCByb290IG9mIG1vZHVsZSB7MH0gaGFzIGJlZW4gbW9kaWZpZWQuIERvIHlvdSB3YW50IHRvIHVwZGF0ZSB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gdG8gbWF0Y2g/Ci0KLSMgTmV3IFRvbWNhdCBzZXJ2ZXIgd2l6YXJkCi13aXphcmRUaXRsZT1Ub21jYXQgU2VydmVyCi13aXphcmREZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5Ci0KLSMgLS0tLS0tLS0tLS0tLS0tIEVkaXRvcnMgLS0tLS0tLS0tLS0tLS0tCi0KLSMgR2VuZXJhbCB0ZXh0IHVzZWQgaW4gYm90aCBlZGl0b3JzCi1lZGl0b3JSZW1vdmU9UmVtb3ZlCi1lZGl0b3JBZGQ9QWRkLi4uCi1lZGl0b3JFZGl0PUVkaXQuLi4KLWVkaXRvckJyb3dzZT1Ccm93c2UuLi4KLQotIyAtLS0gQ29uZmlndXJhdGlvbiBFZGl0b3IgLS0tCi1jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlc1BhZ2VUaXRsZT1XZWIgTW9kdWxlcwotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNTZWN0aW9uPVdlYiBNb2R1bGVzCi1jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlc0Rlc2NyaXB0aW9uPUNvbmZpZ3VyZSB0aGUgV2ViIE1vZHVsZXMgb24gdGhpcyBzZXJ2ZXIuCi1jb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBpbmdzU2VjdGlvbj1NSU1FIE1hcHBpbmdzCi1jb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBpbmdzRGVzY3JpcHRpb249Q29uZmlndXJlIE1JTUUgdHlwZSBtYXBwaW5ncy4KLWNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0c1NlY3Rpb249UG9ydHMKLWNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0c0Rlc2NyaXB0aW9uPU1vZGlmeSB0aGUgc2VydmVyIHBvcnRzLgotCi0jIEZpZWxkcwotY29uZmlndXJhdGlvbkVkaXRvclBvcnROYW1lQ29sdW1uPVBvcnQgTmFtZQotY29uZmlndXJhdGlvbkVkaXRvclBvcnRWYWx1ZUNvbHVtbj1Qb3J0IE51bWJlcgotY29uZmlndXJhdGlvbkVkaXRvclBhdGhDb2x1bW49UGF0aAotY29uZmlndXJhdGlvbkVkaXRvckRvY0Jhc2VDb2x1bW49RG9jdW1lbnQgQmFzZQotY29uZmlndXJhdGlvbkVkaXRvclByb2plY3RDb2x1bW49TW9kdWxlCi1jb25maWd1cmF0aW9uRWRpdG9yUmVsb2FkQ29sdW1uPUF1dG8gUmVsb2FkCi1jb25maWd1cmF0aW9uRWRpdG9yUHJvamVjdE1pc3Npbmc9ezB9IG1pc3NpbmcKLWNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWRFbmFibGVkPUVuYWJsZWQKLWNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWREaXNhYmxlZD1EaXNhYmxlZAotY29uZmlndXJhdGlvbkVkaXRvckFkZFByb2plY3RNb2R1bGU9QWRkIFdlYiBNb2R1bGUuLi4KLWNvbmZpZ3VyYXRpb25FZGl0b3JBZGRFeHRlcm5hbE1vZHVsZT1BZGQgRXh0ZXJuYWwgV2ViIE1vZHVsZS4uLgotCi0jIEFkZC9FZGl0IE1pbWUgTWFwcGluZyBkaWFsb2cKLWNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dUaXRsZUVkaXQ9RWRpdCBNSU1FIE1hcHBpbmcKLWNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dUaXRsZUFkZD1BZGQgTUlNRSBNYXBwaW5nCi1jb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBwaW5nRGlhbG9nTWltZVR5cGU9TUlNRSAmdHlwZToKLWNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dNaW1lRXh0ZW5zaW9uPU1JTUUgJmV4dGVuc2lvbjoKLQotIyBBZGQvRWRpdCBXZWIgTW9kdWxlIGRpYWxvZwotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1RpdGxlRWRpdD1FZGl0IFdlYiBNb2R1bGUKLWNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dUaXRsZUFkZD1BZGQgV2ViIE1vZHVsZQotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1Byb2plY3RzPSZNb2R1bGVzOgotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1BhdGg9UCZhdGg6Ci1jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nRG9jdW1lbnRCYXNlPSZEb2N1bWVudCBiYXNlOgotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1JlbG9hZEVuYWJsZWQ9QXV0byByJmVsb2FkaW5nIGVuYWJsZWQKLWNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dTZWxlY3REaXJlY3Rvcnk9U2VsZWN0IHRoZSBXZWIgbW9kdWxlIGRpcmVjdG9yeS4KLWVycm9yTWlzc2luZ1dlYk1vZHVsZT1UaGUgV2ViIG1vZHVsZSBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uIGNhbm5vdCBiZSBmb3VuZDogezB9LgotCi0jIC0tLSBTZXJ2ZXIgRWRpdG9yIC0tLQotc2VydmVyRWRpdG9yTG9jYXRpb25zU2VjdGlvbj1TZXJ2ZXIgTG9jYXRpb25zCi1zZXJ2ZXJFZGl0b3JMb2NhdGlvbnNEZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBzZXJ2ZXIgYW5kIGRlcGxveSBwYXRocy4gU2VydmVyIG11c3QgYmUgcHVibGlzaGVkIHdpdGggbm8gbW9kdWxlcyBwcmVzZW50IHRvIG1ha2UgY2hhbmdlcy4KLXNlcnZlckVkaXRvckxvY2F0aW9uc0Rlc2NyaXB0aW9uMj1TcGVjaWZ5IHRoZSBzZXJ2ZXIgcGF0aCAoaS5lLiBjYXRhbGluYS5iYXNlKSBhbmQgZGVwbG95IHBhdGguIFNlcnZlciBtdXN0IGJlIHB1Ymxpc2hlZCB3aXRoIG5vIG1vZHVsZXMgcHJlc2VudCB0byBtYWtlIGNoYW5nZXMuCi1zZXJ2ZXJFZGl0b3JHZW5lcmFsU2VjdGlvbj1TZXJ2ZXIgT3B0aW9ucwotc2VydmVyRWRpdG9yR2VuZXJhbERlc2NyaXB0aW9uPUVudGVyIHNldHRpbmdzIGZvciB0aGUgc2VydmVyLgotCi0jIExpbmsgRmllbGRzIAotc2VydmVyRWRpdG9yU2V0SW50ZXJuYWxTZXJ2ZXJEaXJMaW5rPVNldCBzZXJ2ZXIgcGF0aCB0byBpbnRlcm5hbGx5IHN1cHBsaWVkIGxvY2F0aW9uCi1zZXJ2ZXJFZGl0b3JTZXRJbnRlcm5hbFNlcnZlckRpckxpbmsyPVNldCBzZXJ2ZXIgcGF0aCB0byBpbnRlcm5hbGx5IHN1cHBsaWVkIGxvY2F0aW9uIChjdXJyZW50bHkgc2V0KQotc2VydmVyRWRpdG9yU2V0SW5zdGFsbFNlcnZlckRpckxpbms9U2V0IHNlcnZlciBwYXRoIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgVG9tY2F0IGluc3RhbGxhdGlvbgotc2VydmVyRWRpdG9yU2V0SW5zdGFsbFNlcnZlckRpckxpbmsyPVNldCBzZXJ2ZXIgcGF0aCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIFRvbWNhdCBpbnN0YWxsYXRpb24gKGN1cnJlbnRseSBzZXQpCi1zZXJ2ZXJFZGl0b3JTZXREZWZhdWx0RGVwbG95RGlyTGluaz1TZXQgZGVwbG95IHBhdGggdG8gdGhlIGRlZmF1bHQgdmFsdWUKLXNlcnZlckVkaXRvclNldERlZmF1bHREZXBsb3lEaXJMaW5rMj1TZXQgZGVwbG95IHBhdGggdG8gdGhlIGRlZmF1bHQgdmFsdWUgKGN1cnJlbnRseSBzZXQpCi0KLSMgRmllbGRzCi0jIE5vdGU6IFRoZSBhcmd1bWVudCBmb3IgdGhlIGZvbGxvd2luZyB0aHJlZSBzdHJpbmdzIHdpbGwgYmUgdGhlIHN0cmluZyBmb3IKLSMgICAgICAgb25lIG9mIHNlcnZlckVkaXRvckRvZXNOb3RNb2RpZnkgb3Igc2VydmVyRWRpdG9yVGFrZXNDb250cm9sIG9yIGFuZCBlbXB0eSBzdHJpbmcuCi1zZXJ2ZXJFZGl0b3JTZXJ2ZXJEaXJNZXRhZGF0YT1Vc2Ugd29ya3NwYWNlIG1ldGFkYXRhIHswfQotc2VydmVyRWRpdG9yU2VydmVyRGlySW5zdGFsbD1Vc2UgVG9tY2F0IGluc3RhbGxhdGlvbiB7MH0KLXNlcnZlckVkaXRvclNlcnZlckRpckN1c3RvbT1Vc2UgY3VzdG9tIGxvY2F0aW9uIHswfQotc2VydmVyRWRpdG9yU2VydmVyRGlyPVNlcnZlciBwYXRoOgotc2VydmVyRWRpdG9yRGVwbG95RGlyPURlcGxveSBwYXRoOgotc2VydmVyRWRpdG9yU2VjdXJlPUVuYWJsZSBzZWN1cml0eQotIyBOb3RlOiBUaGUgYXJndW1lbnQgZm9yIHRoZSBmb2xsb3dpbmcgc3RyaW5nIHdpbGwgYmUgdGhlIHNlcnZlckVkaXRvck5vdFN1cHBvcnRlZCBzdHJpbmcgb3IgYW4gZW1wdHkgc3RyaW5nCi1zZXJ2ZXJFZGl0b3JEZWJ1Z01vZGU9RW5hYmxlIFRvbWNhdCBkZWJ1ZyBsb2dnaW5nIHswfQotc2VydmVyRWRpdG9yVGVzdEVudmlyb25tZW50PVJ1biBtb2R1bGVzIGRpcmVjdGx5IGZyb20gdGhlIHdvcmtzcGFjZSAoZG8gbm90IG1vZGlmeSB0aGUgVG9tY2F0IGluc3RhbGxhdGlvbikKLSMgTm90ZTogVGhlIGFyZ3VtZW50IGZvciB0aGUgZm9sbG93aW5nIHN0cmluZyB3aWxsIGJlIHRoZSBzZXJ2ZXJFZGl0b3JOb3RTdXBwb3J0ZWQgc3RyaW5nIG9yIGFuIGVtcHR5IHN0cmluZwotc2VydmVyRWRpdG9yTm9QdWJsaXNoPVNlcnZlIG1vZHVsZXMgd2l0aG91dCBwdWJsaXNoaW5nIHswfQotc2VydmVyRWRpdG9yU2VwYXJhdGVDb250ZXh0RmlsZXM9UHVibGlzaCBtb2R1bGUgY29udGV4dHMgdG8gc2VwYXJhdGUgWE1MIGZpbGVzIHswfQotZXJyb3JTZXJ2ZXJEaXJJc1Jvb3Q9VGhlIHNlcnZlciBwYXRoIG1heSBub3QgYmUgc2V0IHRvIHRoZSB0aGUgcm9vdCBvZiB5b3VyIHdvcmtzcGFjZS4KLWVycm9yU2VydmVyRGlyVW5kZXJSb290PVRoZSBzZXJ2ZXIgcGF0aCBtYXkgbm90IGJlIHVuZGVyIHRoZSBcInswfVwiIGZvbGRlciBvZiB5b3VyIHdvcmtzcGFjZSB1bmxlc3MgaXQgaXMgdGhlIHdvcmtzcGFjZSBtZXRhZGF0YSBsb2NhdGlvbi4KLSMgTm90ZTogVGhlIGFyZ3VtZW50IGZvciB0aGUgZm9sbG93aW5nIHN0cmluZyB3aWxsIGJlIHRoZSBzdHJpbmcgZm9yIHNlcnZlckVkaXRvclNlcnZlckRpck1ldGFkYXRhIHdpdGggYSBibGFuayBzdHJpbmcgZm9yIGl0cyBhcmd1bWVudAotZXJyb3JTZXJ2ZXJEaXJDdXN0b21Ob3RNZXRhZGF0YT1Pbmx5IHRoZSBcInswfVwiIHNlbGVjdGlvbiBtYXkgc2V0IHRoZSBzZXJ2ZXIgcGF0aCB0byB0aGUgd29ya3NwYWNlIG1ldGFkYXRhIGxvY2F0aW9uLgotIyBOb3RlOiBUaGUgYXJndW1lbnQgZm9yIHRoZSBmb2xsb3dpbmcgc3RyaW5nIHdpbGwgYmUgdGhlIHN0cmluZyBmb3Igc2VydmVyRWRpdG9yU2VydmVyRGlySW5zdGFsbCB3aXRoIGEgYmxhbmsgc3RyaW5nIGZvciBpdHMgYXJndW1lbnQKLWVycm9yU2VydmVyRGlyQ3VzdG9tTm90SW5zdGFsbD1Pbmx5IHRoZSBcInswfVwiIHNlbGVjdGlvbiBtYXkgc2V0IHRoZSBzZXJ2ZXIgcGF0aCB0byB0aGUgVG9tY2F0IGluc3RhbGxhdGlvbi4KLWVycm9yRGVwbG95RGlyTm90U3BlY2lmaWVkPUEgZGVwbG95IHBhdGggbXVzdCBiZSBzcGVjaWZpZWQuCi1zZXJ2ZXJFZGl0b3JOb3RTdXBwb3J0ZWQ9KG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBUb21jYXQgdmVyc2lvbikKLXNlcnZlckVkaXRvckRvZXNOb3RNb2RpZnk9KGRvZXMgbm90IG1vZGlmeSBUb21jYXQgaW5zdGFsbGF0aW9uKQotc2VydmVyRWRpdG9yVGFrZXNDb250cm9sPSh0YWtlcyBjb250cm9sIG9mIFRvbWNhdCBpbnN0YWxsYXRpb24pCi1lcnJvclNlcnZlck11c3RCZVN0b3BwZWQ9VGhlIHNlcnZlciBtdXN0IGJlIHN0b3BwZWQgYmVmb3JlIGEgY2hhbmdlIHRvIHRoZSBcInswfVwiIHNldHRpbmcgY2FuIGJlIHNhdmVkLgotCi0jIEJyb3dzZSBmb3IgU2VydmVyIGRpYWxvZwotc2VydmVyRWRpdG9yQnJvd3NlU2VydmVyTWVzc2FnZT1TZWxlY3QgYSBzZXJ2ZXIgZGlyZWN0b3J5LgotCi0jIEJyb3dzZSBmb3IgRGVwbG95IGRpYWxvZwotc2VydmVyRWRpdG9yQnJvd3NlRGVwbG95TWVzc2FnZT1TZWxlY3QgYSBkZXBsb3kgZGlyZWN0b3J5LgotCi0jIC0tLSBDbGVhbiBXb3JrIERpcmVjdG9yeSAtLS0KLWNvbmZpcm1DbGVhbldvcmtEaXJUaXRsZT1Db25maXJtIENsZWFuIFdvcmsgRGlyZWN0b3J5Ci1jbGVhblNlcnZlclN0YXRlQ2hhbmdpbmc9VGhlIHN0YXRlIG9mIHswfSBpcyBpbiB0cmFuc2l0aW9uIG9yIHVua25vd24uICBUcnkgYWdhaW4gd2hlbiB0aGUgc2VydmVyIGhhcyByZWFjaGVkIGEgc3RhYmxlIHN0YXRlLgotY2xlYW5Nb2R1bGVXb3JrRGlyPUNsZWFuIHdvcmsgZGlyZWN0b3J5IGZvciBtb2R1bGUgezB9IG9uIHsxfS4KLWNsZWFuU2VydmVyV29ya0Rpcj1DbGVhbiB3b3JrIGRpcmVjdG9yaWVzIGZvciBhbGwgV2ViIGFwcGxpY2F0aW9ucyBvbiB7MH0uCi1jbGVhblNlcnZlclJ1bm5pbmc9VGhlIHNlcnZlciBtdXN0IGJlIHN0b3BwZWQgdG8gY2xlYW4gdGhlIHdvcmsgZGlyZWN0b3J5LiAgQ2xpY2tpbmcgT0sgd2lsbCBpbmNsdWRlIHN0b3BwaW5nIGFuZCByZXN0YXJ0aW5nIHRoZSBzZXJ2ZXIuCi1jbGVhblNlcnZlclRhc2s9Q2xlYW5pbmcgezB9IHdvcmsgZGlyZWN0b3J5Ci0KLSMgLS0tIEVycm9yIFN0cmluZ3MgLS0tCi1lcnJvckRlZmF1bHREaWFsb2dUaXRsZT1Ub21jYXQgU2VydmVyIEVycm9yCi0KLSMgLS0tIENsZWFuIFdvcmsgRGlyZWN0b3J5IEVycm9ycyAtLS0KLWVycm9yQ291bGROb3RDbGVhblN0YXRlQ2hhbmdlPUNsZWFuIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCBiZWNhdXNlIHswfSBpbmRlcGVuZGVudGx5IGNoYW5nZWQgc3RhdGUgYWZ0ZXIgY29uZmlybWF0aW9uIGRpYWxvZyB3YXMgZGlzcGxheWVkLiAgVHJ5IGFnYWluIG9uY2UgdGhlIHNlcnZlciBoYXMgcmVhY2hlZCBhIHN0YWJsZSBzdGF0ZS4KLWVycm9yQ291bGROb3RDbGVhbkNhbnRTdG9wPXswfSBjYW4gbm90IGJlIHN0b3BwZWQgYXQgdGhpcyB0aW1lLiAgVHJ5IGFnYWluIHdoZW4gdGhlIHNlcnZlciBpcyBzdG9wcGVkIG9yIGNhbiBiZSBzdG9wcGVkLgotZXJyb3JDb3VsZE5vdENsZWFuU3RvcEZhaWxlZD17MH0gZmFpbGVkIHRvIHN0b3AuICBUcnkgYWdhaW4gd2hlbiB0aGUgc2VydmVyIGlzIHN0b3BwZWQgb3IgY2FuIGJlIHN0b3BwZWQuCi0KLWVycm9yQ2FudElkZW50aWZ5V2ViQXBwPU1vZHVsZSB7MH0gY291bGQgbm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhIFdlYiBhcHBsaWNhdGlvbiBvbiBhIHNlcnZlci4KLWVycm9yQ2FudERlbGV0ZVNlcnZlck5vdFN0b3BwZWQ9ezB9IHdvcmsgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBkZWxldGVkLiAgU2VydmVyIHdhcyBub3Qgc3RvcHBlZC4gIFRyeSBhZ2FpbiB3aGVuIHRoZSBzZXJ2ZXIgaXMgc3RvcHBlZCBvciBjYW4gYmUgc3RvcHBlZC4KLWVycm9yRXJyb3JEdXJpbmdDbGVhbj1BbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjbGVhbmluZyB7MH0gd29yayBkaXJlY3RvcnkuCi1lcnJvckVycm9yRHVyaW5nQ2xlYW5XYXNSdW5uaW5nPUFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNsZWFuaW5nIHswfSB3b3JrIGRpcmVjdG9yeS4gIHsxfSB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IHJlc3RhcnRlZC4KLQotZXJyb3JDbGVhbkNhbnRSZXN0YXJ0PXswfSBpcyB1bmFibGUgdG8gcmVzdGFydCBhdCB0aGlzIHRpbWUuCi0KLSMgVGVybWluYXRlIFNlcnZlciBkaWFsb2cKLWNsZWFuVGVybWluYXRlU2VydmVyRGlhbG9nVGl0bGU9Q2xlYW4gV29yayBEaXJlY3RvcnkgVGVybWluYXRlIFNlcnZlcgotY2xlYW5UZXJtaW5hdGVTZXJ2ZXJEaWFsb2dNZXNzYWdlPXswfSBoYXMgbm90IGZpbmlzaGVkIHN0b3BwaW5nIHdpdGhpbiB0aGUgdGltZW91dCBwZXJpb2QuIERvIHlvdSB3YW50IHRvIHRlcm1pbmF0ZSB0aGlzIHNlcnZlciBpbW1lZGlhdGVseT8gQ2xpY2sgT0sgdG8gdGVybWluYXRlIHRoZSBzZXJ2ZXIgb3IgY2xpY2sgQ2FuY2VsIHRvIGNvbnRpbnVlIHdhaXRpbmcuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1NXVFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmUwM2M1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0vKioKLSAqIFNXVCBVdGlsaXR5IGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKENvbnRyb2wgdGVzdENvbnRyb2wpIHsKLQkJLy8gQ29tcHV0ZSBhbmQgc3RvcmUgYSBmb250IG1ldHJpYwotCQlHQyBnYyA9IG5ldyBHQyh0ZXN0Q29udHJvbCk7Ci0JCWdjLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJZm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHdpZHRoIGhpbnQgZm9yIGEgYnV0dG9uIGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0QnV0dG9uV2lkdGhIaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJaW50IHdpZHRoSGludCA9IERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYnV0dG9uIHdpdGggdGhlIHN0YW5kYXJkIHNpemUuCi0JICogCi0JICogQHBhcmFtIGNvbXAgdGhlIGNvbXBvbmVudCB0byBhZGQgdGhlIGJ1dHRvbiB0bwotCSAqIEBwYXJhbSBsYWJlbCB0aGUgYnV0dG9uIGxhYmVsCi0JICogQHJldHVybiBhIGJ1dHRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29tcCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dChsYWJlbCk7Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXApOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGIpOwotCQliLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1Rlcm1pbmF0aW9uRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1Rlcm1pbmF0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA1ZmI2Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9UZXJtaW5hdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKioKLSAqIERpYWxvZyB0aGF0IHByb21wdHMgYSB1c2VyIHRvIHNlZSBpZiBhIHNlcnZlciBzaG91bGQKLSAqIGJlIHRlcm1pbmF0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXJtaW5hdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0KLQkvKioKLQkgKiBUZXJtaW5hdGlvbkRpYWxvZyBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSB0aXRsZSB0aXRsZSBvZiBkaWFsb2cKLQkgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGRpc3BsYXkKLQkgKi8KLQlwdWJsaWMgVGVybWluYXRpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCXNldEJsb2NrT25PcGVuKHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIHVwcGVyIHBhcnQgCi0JICogb2YgdGhpcyBkaWFsb2cgKGFib3ZlIHRoZSBidXR0b24gYmFyKS4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgZGlhbG9nIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgYXJlYSBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgQ29udGV4dElkcy5TRVJWRVJfQ0xFQU5fV09SS19ESVJfVEVSTUlOQVRFKTsKLQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzZmNzI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5zb3VyY2Vsb29rdXAuU291cmNlTG9va3VwVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhQXJndW1lbnRzVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhQ2xhc3NwYXRoVGFiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotLyoqCi0gKiBBIGRlYnVnIHRhYiBncm91cCBmb3IgbGF1bmNoaW5nIFRvbWNhdC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCB7Ci0JLyoKLQkgKiBAc2VlIElMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAjY3JlYXRlVGFicyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cgZGlhbG9nLCBTdHJpbmcgbW9kZSkgewotCQlJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdIHRhYnMgPSBuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbNl07Ci0JCXRhYnNbMF0gPSBuZXcgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYihuZXcgU3RyaW5nW10geyAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiIH0pOwotCQl0YWJzWzBdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1sxXSA9IG5ldyBKYXZhQXJndW1lbnRzVGFiKCk7Ci0JCXRhYnNbMV0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzJdID0gbmV3IEphdmFDbGFzc3BhdGhUYWIoKTsKLQkJdGFic1syXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbM10gPSBuZXcgU291cmNlTG9va3VwVGFiKCk7Ci0JCXRhYnNbM10uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzRdID0gbmV3IEVudmlyb25tZW50VGFiKCk7Ci0JCXRhYnNbNF0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzVdID0gbmV3IENvbW1vblRhYigpOwotCQl0YWJzWzVdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJc2V0VGFicyh0YWJzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFJ1bnRpbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5NWQwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFJ1bnRpbWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklJbnN0YWxsYWJsZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5UYXNrV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50LkxpY2Vuc2VXaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiBXaXphcmQgcGFnZSB0byBzZXQgdGhlIHNlcnZlciBpbnN0YWxsIGRpcmVjdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdFJ1bnRpbWVDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCXByb3RlY3RlZCBJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXQzsKLQlwcm90ZWN0ZWQgSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lOwotCQotCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIHdpemFyZDsKLQkKLQlwcm90ZWN0ZWQgVGV4dCBpbnN0YWxsRGlyOwotCXByb3RlY3RlZCBUZXh0IG5hbWU7Ci0JcHJvdGVjdGVkIENvbWJvIGNvbWJvOwotCXByb3RlY3RlZCBMaXN0IGluc3RhbGxlZEpSRXM7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGpyZU5hbWVzOwotCXByb3RlY3RlZCBJSW5zdGFsbGFibGVSdW50aW1lIGlyOwotCXByb3RlY3RlZCBMYWJlbCBpbnN0YWxsTGFiZWw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBpbnN0YWxsOwotCi0JLyoqCi0JICogVG9tY2F0UnVudGltZVdpemFyZFBhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpemFyZCB0aGUgd2l6YXJkIGhhbmRsZQotCSAqLwotCXByb3RlY3RlZCBUb21jYXRSdW50aW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkJCi0JCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy53aXphcmRUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXphcmREZXNjcmlwdGlvbik7Ci0JCXdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoVG9tY2F0VUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKFRvbWNhdFVJUGx1Z2luLklNR19XSVpfVE9NQ0FUKSk7Ci0JCQotCQljcmVhdGVDb250cm9sKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UnVudGltZShJUnVudGltZVdvcmtpbmdDb3B5IG5ld1J1bnRpbWUpIHsKLQkJaWYgKG5ld1J1bnRpbWUgPT0gbnVsbCkgewotCQkJcnVudGltZVdDID0gbnVsbDsKLQkJCXJ1bnRpbWUgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcnVudGltZVdDID0gbmV3UnVudGltZTsKLQkJCXJ1bnRpbWUgPSAoSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weSkgbmV3UnVudGltZS5sb2FkQWRhcHRlcihJVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5LmNsYXNzLCBudWxsKTsKLQkJfQotCQkKLQkJaWYgKHJ1bnRpbWVXQyA9PSBudWxsKSB7Ci0JCQlpciA9IG51bGw7Ci0JCQlpbnN0YWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaW5zdGFsbExhYmVsLnNldFRleHQoIiIpOwotCQl9IGVsc2UgewotCQkJaXIgPSBTZXJ2ZXJQbHVnaW4uZmluZEluc3RhbGxhYmxlUnVudGltZShydW50aW1lV0MuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCWlmIChpciAhPSBudWxsKSB7Ci0JCQkJaW5zdGFsbC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWluc3RhbGxMYWJlbC5zZXRUZXh0KGlyLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWluaXQoKTsKLQkJdmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlIGEgd2l6YXJkIHBhZ2UgdG8gY2hhbmdlIHRoZSBUb21jYXQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuUlVOVElNRV9DT01QT1NJVEUpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnJ1bnRpbWVOYW1lKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCW5hbWUgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQluYW1lLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW5hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJcnVudGltZVdDLnNldE5hbWUobmFtZS5nZXRUZXh0KCkpOwotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuaW5zdGFsbERpcik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCWluc3RhbGxEaXIgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlpbnN0YWxsRGlyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWluc3RhbGxEaXIuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJcnVudGltZVdDLnNldExvY2F0aW9uKG5ldyBQYXRoKGluc3RhbGxEaXIuZ2V0VGV4dCgpKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gYnJvd3NlID0gU1dUVXRpbC5jcmVhdGVCdXR0b24odGhpcywgTWVzc2FnZXMuYnJvd3NlKTsKLQkJYnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhUb21jYXRSdW50aW1lQ29tcG9zaXRlLnRoaXMuZ2V0U2hlbGwoKSk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuc2VsZWN0SW5zdGFsbERpcik7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoaW5zdGFsbERpci5nZXRUZXh0KCkpOwotCQkJCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpCi0JCQkJCWluc3RhbGxEaXIuc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaW5zdGFsbExhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5SSUdIVCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCWluc3RhbGxMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJaW5zdGFsbCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHRoaXMsIE1lc3NhZ2VzLmluc3RhbGwpOwotCQlpbnN0YWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCQlpbnN0YWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQlTdHJpbmcgbGljZW5zZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbGljZW5zZSA9IGlyLmdldExpY2Vuc2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgbGljZW5zZSIsIGUpOwotCQkJCX0KLQkJCQlUYXNrTW9kZWwgdGFza01vZGVsID0gbmV3IFRhc2tNb2RlbCgpOwotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoTGljZW5zZVdpemFyZEZyYWdtZW50LkxJQ0VOU0UsIGxpY2Vuc2UpOwotCQkJCVRhc2tXaXphcmQgd2l6YXJkMiA9IG5ldyBUYXNrV2l6YXJkKE1lc3NhZ2VzLmluc3RhbGxEaWFsb2dUaXRsZSwgbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0IGxpc3QpIHsKLQkJCQkJCWxpc3QuYWRkKG5ldyBMaWNlbnNlV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQkJCX0KLQkJCQl9LCB0YXNrTW9kZWwpOwotCQkJCQotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cyID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQyKTsKLQkJCQlpZiAoZGlhbG9nMi5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCQkJcmV0dXJuOwotCQkJCQotCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKFRvbWNhdFJ1bnRpbWVDb21wb3NpdGUudGhpcy5nZXRTaGVsbCgpKTsKLQkJCQlkaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlcy5zZWxlY3RJbnN0YWxsRGlyKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChpbnN0YWxsRGlyLmdldFRleHQoKSk7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJCQlpci5pbnN0YWxsKG5ldyBQYXRoKHNlbGVjdGVkRGlyZWN0b3J5KSk7Ci0JCQkJCWluc3RhbGxEaXIuc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCXVwZGF0ZUpSRXMoKTsKLQkJCi0JCS8vIEpESyBsb2NhdGlvbgotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuaW5zdGFsbGVkSlJFKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNvbWJvID0gbmV3IENvbWJvKHRoaXMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW50IHNlbCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBudWxsOwotCQkJCWlmIChzZWwgPiAwKQotCQkJCQl2bUluc3RhbGwgPSAoSVZNSW5zdGFsbCkgaW5zdGFsbGVkSlJFcy5nZXQoc2VsIC0gMSk7Ci0JCQkJCi0JCQkJcnVudGltZS5zZXRWTUluc3RhbGwodm1JbnN0YWxsKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBidXR0b24gPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbih0aGlzLCBNZXNzYWdlcy5pbnN0YWxsZWRKUkVzKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyBjdXJyZW50Vk0gPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKHNob3dQcmVmZXJlbmNlUGFnZSgpKSB7Ci0JCQkJCXVwZGF0ZUpSRXMoKTsKLQkJCQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQkJCQljb21iby5zZXRUZXh0KGN1cnJlbnRWTSk7Ci0JCQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IC0xKQotCQkJCQkJY29tYm8uc2VsZWN0KDApOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlpbml0KCk7Ci0JCXZhbGlkYXRlKCk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCQkKLQkJbmFtZS5mb3JjZUZvY3VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSlJFcygpIHsKLQkJLy8gZ2V0IGFsbCBpbnN0YWxsZWQgSlZNcwotCQlpbnN0YWxsZWRKUkVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVk1JbnN0YWxsVHlwZVtdIHZtSW5zdGFsbFR5cGVzID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZXMoKTsKLQkJaW50IHNpemUgPSB2bUluc3RhbGxUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJVk1JbnN0YWxsW10gdm1JbnN0YWxscyA9IHZtSW5zdGFsbFR5cGVzW2ldLmdldFZNSW5zdGFsbHMoKTsKLQkJCWludCBzaXplMiA9IHZtSW5zdGFsbHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJaW5zdGFsbGVkSlJFcy5hZGQodm1JbnN0YWxsc1tqXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGdldCBuYW1lcwotCQlzaXplID0gaW5zdGFsbGVkSlJFcy5zaXplKCk7Ci0JCWpyZU5hbWVzID0gbmV3IFN0cmluZ1tzaXplKzFdOwotCQlqcmVOYW1lc1swXSA9IE1lc3NhZ2VzLnJ1bnRpbWVEZWZhdWx0SlJFOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSAoSVZNSW5zdGFsbCkgaW5zdGFsbGVkSlJFcy5nZXQoaSk7Ci0JCQlqcmVOYW1lc1tpKzFdID0gdm1JbnN0YWxsLmdldE5hbWUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQcmVmZXJlbmNlUGFnZSgpIHsKLQkJU3RyaW5nIGlkID0gIm9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5wcmVmZXJlbmNlcy5WTVByZWZlcmVuY2VQYWdlIjsKLQkJCi0JCS8vIHNob3VsZCBiZSB1c2luZyB0aGUgZm9sbG93aW5nIEFQSSwgYnV0IGl0IG9ubHkgYWxsb3dzIGEgc2luZ2xlIHByZWZlcmVuY2UgcGFnZSBpbnN0YW5jZS4KLQkJLy8gc2VlIGJ1ZyAxNjgyMTEgZm9yIGRldGFpbHMKLQkJLy9QcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgaWQsIG5ldyBTdHJpbmdbXSB7IGlkIH0sIG51bGwpOwotCQkvL3JldHVybiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spOwkJCi0JCQotCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IG1hbmFnZXIuZmluZCgib3JnLmVjbGlwc2UuamR0LnVpLnByZWZlcmVuY2VzLkphdmFCYXNlUHJlZmVyZW5jZVBhZ2UiKS5maW5kU3ViTm9kZShpZCk7Ci0JCVByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIyID0gbmV3IFByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCW1hbmFnZXIyLmFkZFRvUm9vdChub2RlKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhnZXRTaGVsbCgpLCBtYW5hZ2VyMik7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJcmV0dXJuIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAocnVudGltZVdDLmdldE5hbWUoKSAhPSBudWxsKQotCQkJbmFtZS5zZXRUZXh0KHJ1bnRpbWVXQy5nZXROYW1lKCkpOwotCQllbHNlCi0JCQluYW1lLnNldFRleHQoIiIpOwotCQkKLQkJaWYgKHJ1bnRpbWVXQy5nZXRMb2NhdGlvbigpICE9IG51bGwpCi0JCQlpbnN0YWxsRGlyLnNldFRleHQocnVudGltZVdDLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJZWxzZQotCQkJaW5zdGFsbERpci5zZXRUZXh0KCIiKTsKLQkJCi0JCS8vIHNldCBzZWxlY3Rpb24KLQkJaWYgKHJ1bnRpbWUuaXNVc2luZ0RlZmF1bHRKUkUoKSkKLQkJCWNvbWJvLnNlbGVjdCgwKTsKLQkJZWxzZSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlpbnQgc2l6ZSA9IGluc3RhbGxlZEpSRXMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IChJVk1JbnN0YWxsKSBpbnN0YWxsZWRKUkVzLmdldChpKTsKLQkJCQlpZiAodm1JbnN0YWxsLmVxdWFscyhydW50aW1lLmdldFZNSW5zdGFsbCgpKSkgewotCQkJCQljb21iby5zZWxlY3QoaSArIDEpOwotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkKLQkJCQljb21iby5zZWxlY3QoMCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkgewotCQkJd2l6YXJkLnNldE1lc3NhZ2UoIiIsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IHJ1bnRpbWVXQy52YWxpZGF0ZShudWxsKTsKLQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5pc09LKCkpCi0JCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQllbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQllbHNlCi0JCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0UnVudGltZVdpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFJ1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2ZkMzYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0UnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRSdW50aW1lV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJvdGVjdGVkIFRvbWNhdFJ1bnRpbWVDb21wb3NpdGUgY29tcDsKLQotCXB1YmxpYyBUb21jYXRSdW50aW1lV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSk7Ci0JCQotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJU3RhdHVzIHN0YXR1cyA9IHJ1bnRpbWUudmFsaWRhdGUobnVsbCk7Ci0JCXJldHVybiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS50YXNrLldpemFyZEZyYWdtZW50I2NyZWF0ZUNvbXBvc2l0ZSgpCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJY29tcCA9IG5ldyBUb21jYXRSdW50aW1lQ29tcG9zaXRlKHBhcmVudCwgd2l6YXJkKTsKLQkJcmV0dXJuIGNvbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSk7Ci0JCQljb21wLnNldFJ1bnRpbWUocnVudGltZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGl0KCkgewotCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQlJUGF0aCBwYXRoID0gcnVudGltZS5nZXRMb2NhdGlvbigpOwotCQlpZiAocnVudGltZS52YWxpZGF0ZShudWxsKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpCi0JCQlUb21jYXRQbHVnaW4uc2V0UHJlZmVyZW5jZSgibG9jYXRpb24iICsgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCksIHBhdGgudG9TdHJpbmcoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0VUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0VUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhMzI5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBUaGUgYWN0dWFsIFRvbWNhdCBwbHVnaW4uIEl0IGFsbG93cyB0aGUgcmVzdCBvZiB0aGUgY2xhc3NlcwotICogdG8gbG9hZCBpbWFnZXMgYW5kIGdldCBhIGhhbmRsZSB0byB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBUb21jYXRVSVBsdWdpbiBzaW5nbGV0b247Ci0KLQlwcm90ZWN0ZWQgTWFwIGltYWdlRGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gYmFzZSB1cmwgZm9yIGljb25zCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIElDT05fQkFTRV9VUkw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX09CSiA9ICJvYmoxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfV0laQkFOID0gIndpemJhbi8iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpfVE9NQ0FUID0gIndpelRvbWNhdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0VCX01PRFVMRSA9ICJ3ZWJNb2R1bGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NSU1FX01BUFBJTkcgPSAibWltZU1hcHBpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NSU1FX0VYVEVOU0lPTiA9ICJtaW1lRXh0ZW5zaW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUE9SVCA9ICJwb3J0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPSkVDVF9NSVNTSU5HID0gInByb2plY3RNaXNzaW5nIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVE9NQ0FUMzJfSU5TVEFMTF9ESVIgPSAidG9tY2F0MzJpbnN0YWxsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1RPTUNBVDQwX0lOU1RBTExfRElSID0gInRvbWNhdDQwaW5zdGFsbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9UT01DQVQ0MV9JTlNUQUxMX0RJUiA9ICJ0b21jYXQ0MWluc3RhbGwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVE9NQ0FUNTBfSU5TVEFMTF9ESVIgPSAidG9tY2F0NTBpbnN0YWxsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pES19JTlNUQUxMX0RJUiA9ICJqZGtpbnN0YWxsIjsKLQotCS8qKgotCSAqIFRvbWNhdFVJUGx1Z2luIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFRvbWNhdFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlzaW5nbGV0b24gPSB0aGlzOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZVJlZ2lzdHJ5IGNyZWF0ZUltYWdlUmVnaXN0cnkoKSB7Ci0JCUltYWdlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX1dJWl9UT01DQVQsIFVSTF9XSVpCQU4gKyAidG9tY2F0X3dpei5wbmciKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19XRUJfTU9EVUxFLCBVUkxfT0JKICsgIndlYl9tb2R1bGUuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19NSU1FX01BUFBJTkcsIFVSTF9PQkogKyAibWltZV9tYXBwaW5nLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfTUlNRV9FWFRFTlNJT04sIFVSTF9PQkogKyAibWltZV9leHRlbnNpb24uZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19QT1JULCBVUkxfT0JKICsgInBvcnQuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19QUk9KRUNUX01JU1NJTkcsIFVSTF9PQkogKyAicHJvamVjdF9taXNzaW5nLmdpZiIpOwotCQotCQlyZXR1cm4gcmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5wYXJ0cy5JSW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucGFydHMuSUltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCWdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQkJcmV0dXJuIChJbWFnZURlc2NyaXB0b3IpIGdldEluc3RhbmNlKCkuaW1hZ2VEZXNjcmlwdG9ycy5nZXQoa2V5KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuaW50ZXJuYWwuVG9tY2F0VUlQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRvbWNhdFVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgbG9nZ2luZy4KLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGdldCBhIERpc3BsYXkuIFRoZSBtZXRob2QgZmlyc3QgY2hlY2tzLCBpZgotCSAqIHRoZSB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgYW4gYXNzb2NpYXRlZCBkaXNwbGF5LiBJZiBzbywgdGhpcwotCSAqIGRpc3BsYXkgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgZGlzcGxheS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBkaXNwbGF5OwkJCi0JfQkKLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRpdGxlIHRpdGxlIGZvciB0aGUgZGlhbG9nIG9yIG51bGwgZm9yIGRlZmF1bHQgdGl0bGUKLQkgKiBAcGFyYW0gbWVzc2FnZSBwcmltYXJ5IG1lc3NhZ2UgdG8gZGlzcGxheQotCSAqIEBwYXJhbSBzdGF0dXMgcmVhc29uIGZvciB0aGUgZXJyb3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwKLQkJCQkJCXRpdGxlICE9IG51bGwgPyB0aXRsZSA6IE1lc3NhZ2VzLmVycm9yRGVmYXVsdERpYWxvZ1RpdGxlLAotCQkJCQkJbWVzc2FnZSwgc3RhdHVzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBxdWVyeUNsZWFuVGVybWluYXRpb24oSVNlcnZlciBzZXJ2ZXIpIHsKLQkJQ2xlYW5UZXJtaW5hdGlvblJ1bm5hYmxlIHRyID0gbmV3IENsZWFuVGVybWluYXRpb25SdW5uYWJsZShzZXJ2ZXIpOwotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyh0cik7Ci0JCXJldHVybiB0ci5zaG91bGRUZXJtaW5hdGUoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDbGVhblRlcm1pbmF0aW9uUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCUlTZXJ2ZXIgc2VydmVyOwotCQlib29sZWFuIHRlcm1pbmF0ZTsKLQkJCi0JCUNsZWFuVGVybWluYXRpb25SdW5uYWJsZShJU2VydmVyIHNlcnZlcikgewotCQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCQlUZXJtaW5hdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgVGVybWluYXRpb25EaWFsb2coc2hlbGwsCi0JCQkJCU1lc3NhZ2VzLmNsZWFuVGVybWluYXRlU2VydmVyRGlhbG9nVGl0bGUsCi0JCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmNsZWFuVGVybWluYXRlU2VydmVyRGlhbG9nTWVzc2FnZSwgc2VydmVyLmdldE5hbWUoKSkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCQl0ZXJtaW5hdGUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCi0JCWJvb2xlYW4gc2hvdWxkVGVybWluYXRlKCkgewotCQkJcmV0dXJuIHRlcm1pbmF0ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgYSBzaGVsbAotCSAqCi0JICogQHJldHVybiBTaGVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBnZXRTdGFuZGFyZERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBhbiBpbWFnZSB3aXRoIHRoZSByZWdpc3RyeS4KLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGFydGlhbFVSTCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVySW1hZ2UoSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIGtleSwgU3RyaW5nIHBhcnRpYWxVUkwpIHsKLQkJaWYgKElDT05fQkFTRV9VUkwgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGhTdWZmaXggPSAiaWNvbnMvIjsKLQkJCUlDT05fQkFTRV9VUkwgPSBzaW5nbGV0b24uZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aFN1ZmZpeCk7Ci0JCX0KLQotCQl0cnkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobmV3IFVSTChJQ09OX0JBU0VfVVJMLCBwYXJ0aWFsVVJMKSk7Ci0JCQlyZWdpc3RyeS5wdXQoa2V5LCBpZCk7Ci0JCQlpbWFnZURlc2NyaXB0b3JzLnB1dChrZXksIGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciByZWdpc3RlcmluZyBpbWFnZSIsIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTdhODc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05GSUcgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VWRVJFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVNUID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVIgPSA0OwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgewotCQlUcmFjZS50cmFjZShsZXZlbCwgcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKCFUb21jYXRVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIgIiArIHMpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW5Xb3JrRGlyQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW5Xb3JrRGlyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTM2Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFuV29ya0RpckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVMgSW5zdGl0dXRlLCBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgTGFycnkgSXNhYWNzIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLkNsZWFuV29ya0RpckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5JU2VydmVyTW9kdWxlOwotCi0vKioKLSAqIEFjdGlvbiB0byBkZWxldGUgVG9tY2F0IHNlcnZlciB3b3JrIGRpcmVjdG9yaWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGVhbldvcmtEaXJBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQlwcml2YXRlIElTZXJ2ZXIgc2VsZWN0ZWRTZXJ2ZXI7Ci0JcHJpdmF0ZSBJTW9kdWxlIHNlbGVjdGVkTW9kdWxlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFjdGlvbjEuCi0JICovCi0JcHVibGljIENsZWFuV29ya0RpckFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KElBY3Rpb24sIElXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4oSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJQ2xlYW5Xb3JrRGlyRGlhbG9nIGRsZyA9IG5ldyBDbGVhbldvcmtEaXJEaWFsb2codGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgc2VsZWN0ZWRTZXJ2ZXIsIHNlbGVjdGVkTW9kdWxlKTsKLQkJZGxnLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24sIElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWRTZXJ2ZXIgPSBudWxsOwotCQlzZWxlY3RlZE1vZHVsZSA9IG51bGw7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCQlzZWxlY3RlZFNlcnZlciA9IChJU2VydmVyKW9iajsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlck1vZHVsZSkgewotCQkJCQlJU2VydmVyTW9kdWxlIHNtID0gKElTZXJ2ZXJNb2R1bGUpb2JqOwotCQkJCQlJTW9kdWxlIFtdIG1vZHVsZSA9IHNtLmdldE1vZHVsZSgpOwotCQkJCQlzZWxlY3RlZE1vZHVsZSA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07Ci0JCQkJCWlmIChzZWxlY3RlZE1vZHVsZSAhPSBudWxsKQotCQkJCQkJc2VsZWN0ZWRTZXJ2ZXIgPSBzbS5nZXRTZXJ2ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2VkaXRvci9Db25maWd1cmF0aW9uTWltZUVkaXRvclNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25NaW1lRWRpdG9yU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTk3YjEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25NaW1lRWRpdG9yU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0vKioKLSAqIFRvbWNhdCBjb25maWd1cmF0aW9uIG1pbWUgZWRpdG9yIHNlY3Rpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWltZUVkaXRvclNlY3Rpb24gZXh0ZW5kcyBTZXJ2ZXJFZGl0b3JTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgVG9tY2F0Q29uZmlndXJhdGlvbiB0b21jYXRDb25maWd1cmF0aW9uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQkKLQlwcm90ZWN0ZWQgVHJlZSBtaW1lVHlwZXM7Ci0JcHJvdGVjdGVkIGludCBpbmRleCA9IC0xOwotCXByb3RlY3RlZCBMaXN0IG1hcHBpbmdzOwotCXByb3RlY3RlZCBCdXR0b24gYWRkOwotCXByb3RlY3RlZCBCdXR0b24gcmVtb3ZlOwotCXByb3RlY3RlZCBCdXR0b24gZWRpdDsKLQotCS8qKgotCSAqIENvbmZpZ3VyYXRpb25NaW1lRWRpdG9yU2VjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uTWltZUVkaXRvclNlY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCWxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKFRvbWNhdENvbmZpZ3VyYXRpb24uQUREX01BUFBJTkdfUFJPUEVSVFkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCQkJCU1pbWVNYXBwaW5nIG1hcHBpbmcgPSAoTWltZU1hcHBpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWFkZE1pbWVNYXBwaW5nKGluLmludFZhbHVlKCksIG1hcHBpbmcpOwotCQkJCX0gZWxzZSBpZiAoVG9tY2F0Q29uZmlndXJhdGlvbi5SRU1PVkVfTUFQUElOR19QUk9QRVJUWS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJcmVtb3ZlTWltZU1hcHBpbmcoaW4uaW50VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmIChUb21jYXRDb25maWd1cmF0aW9uLk1PRElGWV9NQVBQSU5HX1BST1BFUlRZLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBldmVudC5nZXRPbGRWYWx1ZSgpOwotCQkJCQlNaW1lTWFwcGluZyBtYXBwaW5nID0gKE1pbWVNYXBwaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQltb2RpZnlNaW1lTWFwcGluZyhpbi5pbnRWYWx1ZSgpLCBtYXBwaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRvbWNhdENvbmZpZ3VyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJCi0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBnZXRGb3JtVG9vbGtpdChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLQkJCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSCi0JCQl8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcGluZ3NTZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBpbmdzRGVzY3JpcHRpb24pOwotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDE1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR1MpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQkKLQkJbWltZVR5cGVzID0gdG9vbGtpdC5jcmVhdGVUcmVlKGNvbXBvc2l0ZSwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQkJbWltZVR5cGVzLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXdocy5zZXRIZWxwKG1pbWVUeXBlcywgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HU19MSVNUKTsKLQkJCi0JCS8vIGFkZCBsaXN0ZW5lciB0byB0aGUgdGFibGUKLQkJbWltZVR5cGVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdE1pbWVNYXBwaW5nKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJCi0JCWFkZCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLmVkaXRvckFkZCwgU1dULlBVU0gpOwotCQlhZGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWltZU1hcHBpbmdEaWFsb2cgZGlhbG9nID0gbmV3IE1pbWVNYXBwaW5nRGlhbG9nKGdldFNoZWxsKCkpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQlleGVjdXRlKG5ldyBBZGRNaW1lTWFwcGluZ0NvbW1hbmQodG9tY2F0Q29uZmlndXJhdGlvbiwgZGlhbG9nLmdldE1pbWVNYXBwaW5nKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl3aHMuc2V0SGVscChhZGQsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR1NfQUREKTsKLQkJCi0JCWVkaXQgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5lZGl0b3JFZGl0LCBTV1QuUFVTSCk7Ci0JCWVkaXQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQllZGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChpbmRleCA8IDApCi0JCQkJCXJldHVybjsKLQkJCQlNaW1lTWFwcGluZ0RpYWxvZyBkaWFsb2cgPSBuZXcgTWltZU1hcHBpbmdEaWFsb2coZ2V0U2hlbGwoKSwgKE1pbWVNYXBwaW5nKSB0b21jYXRDb25maWd1cmF0aW9uLmdldE1pbWVNYXBwaW5ncygpLmdldChpbmRleCkpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQlleGVjdXRlKG5ldyBNb2RpZnlNaW1lTWFwcGluZ0NvbW1hbmQodG9tY2F0Q29uZmlndXJhdGlvbiwgaW5kZXgsIGRpYWxvZy5nZXRNaW1lTWFwcGluZygpKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJd2hzLnNldEhlbHAoZWRpdCwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HU19FRElUKTsKLQkJCi0JCXJlbW92ZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLmVkaXRvclJlbW92ZSwgU1dULlBVU0gpOwotCQlyZW1vdmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCXJlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoaW5kZXggPCAwKQotCQkJCQlyZXR1cm47Ci0JCQkJZXhlY3V0ZShuZXcgUmVtb3ZlTWltZU1hcHBpbmdDb21tYW5kKHRvbWNhdENvbmZpZ3VyYXRpb24sIGluZGV4KSk7Ci0JCQkJaW5kZXggPSAtMTsKLQkJCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKHJlbW92ZSwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HU19SRU1PVkUpOwotCQkKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodG9tY2F0Q29uZmlndXJhdGlvbiAhPSBudWxsKQotCQkJdG9tY2F0Q29uZmlndXJhdGlvbi5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJCi0JCVRvbWNhdFNlcnZlciB0cyA9IChUb21jYXRTZXJ2ZXIpIHNlcnZlci5nZXRBZGFwdGVyKFRvbWNhdFNlcnZlci5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQl0b21jYXRDb25maWd1cmF0aW9uID0gdHMuZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJYWRkQ2hhbmdlTGlzdGVuZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGZpZWxkcyBpbiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAobWltZVR5cGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJbWltZVR5cGVzLnJlbW92ZUFsbCgpOwotCQkKLQkJbWFwcGluZ3MgPSB0b21jYXRDb25maWd1cmF0aW9uLmdldE1pbWVNYXBwaW5ncygpOwotCQkKLQkJLy8gc29ydCBtYXBwaW5ncwotCQlpbnQgc2l6ZSA9IG1hcHBpbmdzLnNpemUoKTsKLQkJaW50W10gbWFwID0gbmV3IGludFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQltYXBbaV0gPSBpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gaSArIDE7IGogPCBzaXplOyBqKyspIHsKLQkJCQlNaW1lTWFwcGluZyBtYXBwaW5nQSA9IChNaW1lTWFwcGluZykgbWFwcGluZ3MuZ2V0KG1hcFtpXSk7Ci0JCQkJTWltZU1hcHBpbmcgbWFwcGluZ0IgPSAoTWltZU1hcHBpbmcpIG1hcHBpbmdzLmdldChtYXBbal0pOwotCQkJCWlmIChtYXBwaW5nQS5nZXRNaW1lVHlwZSgpLmNvbXBhcmVUbyhtYXBwaW5nQi5nZXRNaW1lVHlwZSgpKSA+IDAgfHwKLQkJCQkJCSgobWFwcGluZ0EuZ2V0TWltZVR5cGUoKS5lcXVhbHMobWFwcGluZ0IuZ2V0TWltZVR5cGUoKSkpICYmCi0JCQkJCQkJCW1hcHBpbmdBLmdldEV4dGVuc2lvbigpLmNvbXBhcmVUbyhtYXBwaW5nQi5nZXRFeHRlbnNpb24oKSkgPiAwKSkgewotCQkJCQlpbnQgdGVtcCA9IG1hcFtpXTsKLQkJCQkJbWFwW2ldID0gbWFwW2pdOwotCQkJCQltYXBbal0gPSB0ZW1wOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gZGlzcGxheSB0aGVtCi0JCU1hcCBoYXNoID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlNaW1lTWFwcGluZyBtYXBwaW5nID0gKE1pbWVNYXBwaW5nKSBtYXBwaW5ncy5nZXQobWFwW2ldKTsKLQkJCS8vIGdldCBwYXJlbnQgbm9kZQotCQkJVHJlZUl0ZW0gcGFyZW50ID0gKFRyZWVJdGVtKSBoYXNoLmdldChtYXBwaW5nLmdldE1pbWVUeXBlKCkpOwotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gbmV3IFRyZWVJdGVtKG1pbWVUeXBlcywgU1dULk5PTkUpOwotCQkJCXBhcmVudC5zZXRUZXh0KG1hcHBpbmcuZ2V0TWltZVR5cGUoKSk7Ci0JCQkJcGFyZW50LnNldEltYWdlKFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19NSU1FX01BUFBJTkcpKTsKLQkJCQloYXNoLnB1dChtYXBwaW5nLmdldE1pbWVUeXBlKCksIHBhcmVudCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGFkZCBub2RlCi0JCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHBhcmVudCwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KG1hcHBpbmcuZ2V0RXh0ZW5zaW9uKCkpOwotCQkJaXRlbS5zZXRJbWFnZShUb21jYXRVSVBsdWdpbi5nZXRJbWFnZShUb21jYXRVSVBsdWdpbi5JTUdfTUlNRV9FWFRFTlNJT04pKTsKLQkJCWl0ZW0uc2V0RGF0YShuZXcgSW50ZWdlcihtYXBbaV0pKTsKLQkJfQotCQkKLQkJaWYgKHJlYWRPbmx5KSB7Ci0JCQlhZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlzZWxlY3RNaW1lTWFwcGluZygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFkZCBhIG1pbWUgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgyCi0JICogQHBhcmFtIG1hcAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1pbWVNYXBwaW5nKGludCBpbmRleDIsIE1pbWVNYXBwaW5nIG1hcCkgewotCQltYXBwaW5ncy5hZGQoaW5kZXgyLCBtYXApOwotCQkKLQkJLy8gY29ycmVjdCBhbGwgaW5kZXggbnVtYmVycwotCQlpbnQgc2l6ZSA9IG1pbWVUeXBlcy5nZXRJdGVtQ291bnQoKTsKLQkJVHJlZUl0ZW1bXSBwYXJlbnRzID0gbWltZVR5cGVzLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBwYXJlbnQgPSBwYXJlbnRzW2ldOwotCQkJCi0JCQlpbnQgc2l6ZTIgPSBwYXJlbnQuZ2V0SXRlbUNvdW50KCk7Ci0JCQlUcmVlSXRlbVtdIGNoaWxkcmVuID0gcGFyZW50LmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGNoaWxkcmVuW2pdLmdldERhdGEoKTsKLQkJCQlpZiAoaW4uaW50VmFsdWUoKSA+PSBpbmRleDIpCi0JCQkJCWNoaWxkcmVuW2pdLnNldERhdGEobmV3IEludGVnZXIoaW4uaW50VmFsdWUoKSArIDEpKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSBwYXJlbnQuIElmIHNvLCBqdXN0IGFkZCBhIG5ldyBjaGlsZAotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVHJlZUl0ZW0gcGFyZW50ID0gcGFyZW50c1tpXTsKLQkJCWlmIChwYXJlbnQuZ2V0VGV4dCgpLmVxdWFscyhtYXAuZ2V0TWltZVR5cGUoKSkpIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHBhcmVudCwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dChtYXAuZ2V0RXh0ZW5zaW9uKCkpOwotCQkJCWl0ZW0uc2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uZ2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uSU1HX01JTUVfRVhURU5TSU9OKSk7Ci0JCQkJaXRlbS5zZXREYXRhKG5ldyBJbnRlZ2VyKGluZGV4MikpOwotCQkJCW1pbWVUeXBlcy5zaG93SXRlbShpdGVtKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGlmIG5vdCwgYWRkIGEgbmV3IHBhcmVudCBhbmQgY2hpbGQgdG8gdGhlIGVuZAotCQlUcmVlSXRlbSBwYXJlbnQgPSBuZXcgVHJlZUl0ZW0obWltZVR5cGVzLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRUZXh0KG1hcC5nZXRNaW1lVHlwZSgpKTsKLQkJcGFyZW50LnNldEltYWdlKFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19NSU1FX01BUFBJTkcpKTsKLQkJCi0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChtYXAuZ2V0RXh0ZW5zaW9uKCkpOwotCQlpdGVtLnNldEltYWdlKFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19NSU1FX0VYVEVOU0lPTikpOwotCQlpdGVtLnNldERhdGEobmV3IEludGVnZXIoaW5kZXgyKSk7Ci0JCW1pbWVUeXBlcy5zaG93SXRlbShpdGVtKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGluZGV4MgotCSAqIEBwYXJhbSBtYXAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlNaW1lTWFwcGluZyhpbnQgaW5kZXgyLCBNaW1lTWFwcGluZyBtYXApIHsKLQkJTWltZU1hcHBpbmcgb2xkTWFwID0gKE1pbWVNYXBwaW5nKSBtYXBwaW5ncy5nZXQoaW5kZXgyKTsKLQkJbWFwcGluZ3Muc2V0KGluZGV4MiwgbWFwKTsKLQkJCi0JCWludCBzaXplID0gbWltZVR5cGVzLmdldEl0ZW1Db3VudCgpOwotCQlUcmVlSXRlbVtdIHBhcmVudHMgPSBtaW1lVHlwZXMuZ2V0SXRlbXMoKTsKLQkJCi0JCWlmIChvbGRNYXAuZ2V0TWltZVR5cGUoKS5lcXVhbHMobWFwLmdldE1pbWVUeXBlKCkpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVRyZWVJdGVtIHBhcmVudCA9IHBhcmVudHNbaV07Ci0JCQkJCi0JCQkJaWYgKHBhcmVudC5nZXRUZXh0KCkuZXF1YWxzKG1hcC5nZXRNaW1lVHlwZSgpKSkgewotCQkJCQlpbnQgc2l6ZTIgPSBwYXJlbnQuZ2V0SXRlbUNvdW50KCk7Ci0JCQkJCVRyZWVJdGVtW10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0SXRlbXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGNoaWxkcmVuW2pdLmdldERhdGEoKTsKLQkJCQkJCWlmIChpbi5pbnRWYWx1ZSgpID09IGluZGV4MikgewotCQkJCQkJCWNoaWxkcmVuW2pdLnNldFRleHQobWFwLmdldEV4dGVuc2lvbigpKTsKLQkJCQkJCQljaGlsZHJlbltqXS5zZXREYXRhKG5ldyBJbnRlZ2VyKGluZGV4MikpOwotCQkJCQkJCW1pbWVUeXBlcy5zaG93SXRlbShjaGlsZHJlbltqXSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBvdGhlcndpc2UsIGxldCdzIHRyeSBhIHJlbW92ZSBhbmQgYW4gYWRkCi0JCXJlbW92ZU1pbWVNYXBwaW5nKGluZGV4Mik7Ci0JCWFkZE1pbWVNYXBwaW5nKGluZGV4MiwgbWFwKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBtaW1lIG1hcHBpbmcgYXQgdGhlIGdpdmVuIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleDIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNaW1lTWFwcGluZyhpbnQgaW5kZXgyKSB7Ci0JCW1hcHBpbmdzLnJlbW92ZShpbmRleDIpOwotCQkKLQkJLy8gcmVtb3ZlIGl0ZW0KLQkJaW50IHNpemUgPSBtaW1lVHlwZXMuZ2V0SXRlbUNvdW50KCk7Ci0JCVRyZWVJdGVtW10gcGFyZW50cyA9IG1pbWVUeXBlcy5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVHJlZUl0ZW0gcGFyZW50ID0gcGFyZW50c1tpXTsKLQkJCQotCQkJaW50IHNpemUyID0gcGFyZW50LmdldEl0ZW1Db3VudCgpOwotCQkJVHJlZUl0ZW1bXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBjaGlsZHJlbltqXS5nZXREYXRhKCk7Ci0JCQkJaWYgKGluLmludFZhbHVlKCkgPT0gaW5kZXgyKSB7Ci0JCQkJCWNoaWxkcmVuW2pdLmRpc3Bvc2UoKTsKLQkJCQkJaWYgKHNpemUyID09IDEpCi0JCQkJCQlwYXJlbnQuZGlzcG9zZSgpOwotCQkJCQlpICs9IHNpemU7Ci0JCQkJCWogKz0gc2l6ZTI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBjb3JyZWN0IGFsbCBpbmRleCBudW1iZXJzCi0JCXNpemUgPSBtaW1lVHlwZXMuZ2V0SXRlbUNvdW50KCk7Ci0JCXBhcmVudHMgPSBtaW1lVHlwZXMuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVRyZWVJdGVtIHBhcmVudCA9IHBhcmVudHNbaV07Ci0JCQkKLQkJCWludCBzaXplMiA9IHBhcmVudC5nZXRJdGVtQ291bnQoKTsKLQkJCVRyZWVJdGVtW10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgY2hpbGRyZW5bal0uZ2V0RGF0YSgpOwotCQkJCWlmIChpbi5pbnRWYWx1ZSgpID4gaW5kZXgyKQotCQkJCQljaGlsZHJlbltqXS5zZXREYXRhKG5ldyBJbnRlZ2VyKGluLmludFZhbHVlKCkgLSAxKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RNaW1lTWFwcGluZygpIHsKLQkJaWYgKHJlYWRPbmx5KQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gbWltZVR5cGVzLmdldFNlbGVjdGlvbigpWzBdOwotCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBpdGVtLmdldERhdGEoKTsKLQkJCWlmIChpbiA9PSBudWxsKSB7Ci0JCQkJaW5kZXggPSAtMTsKLQkJCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpbmRleCA9IGluLmludFZhbHVlKCk7Ci0JCQkKLQkJCXJlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJZWRpdC5zZXRFbmFibGVkKHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaW5kZXggPSAtMTsKLQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2VkaXRvci9Db25maWd1cmF0aW9uUG9ydEVkaXRvclNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25Qb3J0RWRpdG9yU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmJmNDY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25Qb3J0RWRpdG9yU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0vKioKLSAqIFRvbWNhdCBjb25maWd1cmF0aW9uIHBvcnQgZWRpdG9yIHBhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uUG9ydEVkaXRvclNlY3Rpb24gZXh0ZW5kcyBTZXJ2ZXJFZGl0b3JTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgVG9tY2F0Q29uZmlndXJhdGlvbiB0b21jYXRDb25maWd1cmF0aW9uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgcG9ydHM7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHZpZXdlcjsKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JLyoqCi0JICogQ29uZmlndXJhdGlvblBvcnRFZGl0b3JTZWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25Qb3J0RWRpdG9yU2VjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoVG9tY2F0Q29uZmlndXJhdGlvbi5NT0RJRllfUE9SVF9QUk9QRVJUWS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCQkJCUludGVnZXIgaSA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQljaGFuZ2VQb3J0TnVtYmVyKGlkLCBpLmludFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdG9tY2F0Q29uZmlndXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcG9ydCBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VQb3J0TnVtYmVyKFN0cmluZyBpZCwgaW50IHBvcnQpIHsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSBwb3J0cy5nZXRJdGVtcygpOwotCQlpbnQgc2l6ZSA9IGl0ZW1zLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVNlcnZlclBvcnQgc3AgPSAoU2VydmVyUG9ydCkgaXRlbXNbaV0uZ2V0RGF0YSgpOwotCQkJaWYgKHNwLmdldElkKCkuZXF1YWxzKGlkKSkgewotCQkJCWl0ZW1zW2ldLnNldERhdGEobmV3IFNlcnZlclBvcnQoaWQsIHNwLmdldE5hbWUoKSwgcG9ydCwgc3AuZ2V0UHJvdG9jb2woKSkpOwotCQkJCWl0ZW1zW2ldLnNldFRleHQoMSwgcG9ydCArICIiKTsKLQkJCQkvKmlmIChpID09IHNlbGVjdGlvbikgewotCQkJCQlzZWxlY3RQb3J0KCk7Ci0JCQkJfSovCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFNXVCBjb250cm9scyBmb3IgdGhpcyB3b3JrYmVuY2ggcGFydC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwotCQkKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5FWFBBTkRFRAotCQkJfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0c1NlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0c0Rlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQkvLyBwb3J0cwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDg7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDg7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9QT1JUUyk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0KLQkJcG9ydHMgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJcG9ydHMuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJcG9ydHMuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl3aHMuc2V0SGVscChwb3J0cywgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9QT1JUU19MSVNUKTsKLQkJCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCi0JCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbihwb3J0cywgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yUG9ydE5hbWVDb2x1bW4pOwotCQlDb2x1bW5XZWlnaHREYXRhIGNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxNSwgMTUwLCB0cnVlKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2xEYXRhKTsKLQotCQljb2wgPSBuZXcgVGFibGVDb2x1bW4ocG9ydHMsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvclBvcnRWYWx1ZUNvbHVtbik7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4MCwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyMzA7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDEwMDsKLQkJcG9ydHMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcG9ydHMuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkKLQkJdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBvcnRzKTsKLQkJdmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsibmFtZSIsICJwb3J0In0pOwotCi0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBvcnRFZGl0b3JzKCkgewotCQl2aWV3ZXIuc2V0Q2VsbEVkaXRvcnMobmV3IENlbGxFZGl0b3JbXSB7bnVsbCwgbmV3IFRleHRDZWxsRWRpdG9yKHBvcnRzKX0pOwotCQotCQlJQ2VsbE1vZGlmaWVyIGNlbGxNb2RpZmllciA9IG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJU2VydmVyUG9ydCBzcCA9IChTZXJ2ZXJQb3J0KSBlbGVtZW50OwotCQkJCWlmIChzcC5nZXRQb3J0KCkgPCAwKQotCQkJCQlyZXR1cm4gIi0iOwotCQkJCXJldHVybiBzcC5nZXRQb3J0KCkgKyAiIjsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJaWYgKCJwb3J0Ii5lcXVhbHMocHJvcGVydHkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSXRlbSBpdGVtID0gKEl0ZW0pIGVsZW1lbnQ7Ci0JCQkJCVNlcnZlclBvcnQgc3AgPSAoU2VydmVyUG9ydCkgaXRlbS5nZXREYXRhKCk7Ci0JCQkJCWludCBwb3J0ID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJCWV4ZWN1dGUobmV3IE1vZGlmeVBvcnRDb21tYW5kKHRvbWNhdENvbmZpZ3VyYXRpb24sIHNwLmdldElkKCksIHBvcnQpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9OwotCQl2aWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKGNlbGxNb2RpZmllcik7Ci0JCQotCQkvLyBwcmVzZWxlY3Qgc2Vjb25kIGNvbHVtbiAoV2luZG93cy1vbmx5KQotCQlTdHJpbmcgb3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLQkJaWYgKG9zICE9IG51bGwgJiYgb3MudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ3aW4iKSA+PSAwKSB7Ci0JCQlwb3J0cy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQl0cnkgewotCQkJCQkJaW50IG4gPSBwb3J0cy5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCQkJdmlld2VyLmVkaXRFbGVtZW50KHBvcnRzLmdldEl0ZW0obikuZ2V0RGF0YSgpLCAxKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHRvbWNhdENvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLQkJCXRvbWNhdENvbmZpZ3VyYXRpb24ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yIHBhcnQgd2l0aCBhIHNpdGUgYW5kIGlucHV0LgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkKLQkJVG9tY2F0U2VydmVyIHRzID0gKFRvbWNhdFNlcnZlcikgc2VydmVyLmdldEFkYXB0ZXIoVG9tY2F0U2VydmVyLmNsYXNzKTsKLQkJdHJ5IHsKLQkJCXRvbWNhdENvbmZpZ3VyYXRpb24gPSB0cy5nZXRUb21jYXRDb25maWd1cmF0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlhZGRDaGFuZ2VMaXN0ZW5lcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgZmllbGRzIGluIHRoaXMgZWRpdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmIChwb3J0cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXBvcnRzLnJlbW92ZUFsbCgpOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdG9tY2F0Q29uZmlndXJhdGlvbi5nZXRTZXJ2ZXJQb3J0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclBvcnQgcG9ydCA9IChTZXJ2ZXJQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0ocG9ydHMsIFNXVC5OT05FKTsKLQkJCVN0cmluZyBwb3J0U3RyID0gIi0iOwotCQkJaWYgKHBvcnQuZ2V0UG9ydCgpID49IDApCi0JCQkJcG9ydFN0ciA9IHBvcnQuZ2V0UG9ydCgpICsgIiI7IAotCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbXSB7cG9ydC5nZXROYW1lKCksIHBvcnRTdHJ9OwotCQkJaXRlbS5zZXRUZXh0KHMpOwotCQkJaXRlbS5zZXRJbWFnZShUb21jYXRVSVBsdWdpbi5nZXRJbWFnZShUb21jYXRVSVBsdWdpbi5JTUdfUE9SVCkpOwotCQkJaXRlbS5zZXREYXRhKHBvcnQpOwotCQl9Ci0JCQotCQlpZiAocmVhZE9ubHkpIHsKLQkJCXZpZXdlci5zZXRDZWxsRWRpdG9ycyhuZXcgQ2VsbEVkaXRvcltdIHtudWxsLCBudWxsfSk7Ci0JCQl2aWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKG51bGwpOwotCQl9IGVsc2UgewotCQkJc2V0dXBQb3J0RWRpdG9ycygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvQ29uZmlndXJhdGlvbldlYk1vZHVsZUVkaXRvclBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25XZWJNb2R1bGVFZGl0b3JQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MDdmMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvQ29uZmlndXJhdGlvbldlYk1vZHVsZUVkaXRvclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuQWRkTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuQWRkV2ViTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuTW9kaWZ5V2ViTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuUmVtb3ZlTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JQYXJ0OwotLyoqCi0gKiBUb21jYXQgY29uZmlndXJhdGlvbiB3ZWIgbW9kdWxlIGVkaXRvciBwYWdlLgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbldlYk1vZHVsZUVkaXRvclBhcnQgZXh0ZW5kcyBTZXJ2ZXJFZGl0b3JQYXJ0IHsKLQlwcm90ZWN0ZWQgSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjI7Ci0JcHJvdGVjdGVkIFRvbWNhdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLQotCXByb3RlY3RlZCBUYWJsZSB3ZWJBcHBUYWJsZTsKLQlwcm90ZWN0ZWQgaW50IHNlbGVjdGlvbiA9IC0xOwotCXByb3RlY3RlZCBCdXR0b24gYWRkUHJvamVjdDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZEV4dFByb2plY3Q7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBlZGl0OwotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDb25maWd1cmF0aW9uV2ViTW9kdWxlRWRpdG9yUGFydCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uV2ViTW9kdWxlRWRpdG9yUGFydCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoVG9tY2F0Q29uZmlndXJhdGlvbi5NT0RJRllfV0VCX01PRFVMRV9QUk9QRVJUWS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCWluaXRpYWxpemUoKTsKLQkJCQl9IGVsc2UgaWYgKFRvbWNhdENvbmZpZ3VyYXRpb24uQUREX1dFQl9NT0RVTEVfUFJPUEVSVFkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlpbml0aWFsaXplKCk7Ci0JCQkJfSBlbHNlIGlmIChUb21jYXRDb25maWd1cmF0aW9uLlJFTU9WRV9XRUJfTU9EVUxFX1BST1BFUlRZLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJaW5pdGlhbGl6ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY29uZmlndXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCQotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IHRvb2xraXQuY3JlYXRlU2Nyb2xsZWRGb3JtKHBhcmVudCk7Ci0JCXRvb2xraXQuZGVjb3JhdGVGb3JtSGVhZGluZyhmb3JtLmdldEZvcm0oKSk7Ci0JCWZvcm0uc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlc1BhZ2VUaXRsZSk7Ci0JCWZvcm0uc2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uZ2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uSU1HX1dFQl9NT0RVTEUpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luVG9wID0gNjsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSA2OwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVzU2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNEZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJd2hzLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVMpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQkKLQkJd2ViQXBwVGFibGUgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCXdlYkFwcFRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXdlYkFwcFRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJd2hzLnNldEhlbHAod2ViQXBwVGFibGUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFU19MSVNUKTsKLQkJLy90b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih3ZWJBcHBUYWJsZSk7Ci0JCQotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQotCQlUYWJsZUNvbHVtbiBjb2wgPSBuZXcgVGFibGVDb2x1bW4od2ViQXBwVGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvclBhdGhDb2x1bW4pOwotCQlDb2x1bW5XZWlnaHREYXRhIGNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4NSwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCi0JCVRhYmxlQ29sdW1uIGNvbDIgPSBuZXcgVGFibGVDb2x1bW4od2ViQXBwVGFibGUsIFNXVC5OT05FKTsKLQkJY29sMi5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JEb2NCYXNlQ29sdW1uKTsKLQkJY29sRGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEzLCAxMzUsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQotCQlUYWJsZUNvbHVtbiBjb2wzID0gbmV3IFRhYmxlQ29sdW1uKHdlYkFwcFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbDMuc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yUHJvamVjdENvbHVtbik7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4NSwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCi0JCVRhYmxlQ29sdW1uIGNvbDQgPSBuZXcgVGFibGVDb2x1bW4od2ViQXBwVGFibGUsIFNXVC5OT05FKTsKLQkJY29sNC5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWRDb2x1bW4pOwotCQljb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNywgNzUsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQkKLQkJd2ViQXBwVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDQ1MDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTIwOwotCQl3ZWJBcHBUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl3ZWJBcHBUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RXZWJBcHAoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCUNvbXBvc2l0ZSByaWdodFBhbmVsID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXJpZ2h0UGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcmlnaHRQYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJLy90b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihyaWdodFBhbmVsKTsKLQkKLQkJLy8gYnV0dG9ucyBzdGlsbCB0byBhZGQ6Ci0JCS8vIGFkZCBwcm9qZWN0LCBhZGQgZXh0ZXJuYWwgbW9kdWxlLCByZW1vdmUgbW9kdWxlCi0JCWFkZFByb2plY3QgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihyaWdodFBhbmVsLCBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWRkUHJvamVjdE1vZHVsZSwgU1dULlBVU0gpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWFkZFByb2plY3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJd2hzLnNldEhlbHAoYWRkUHJvamVjdCwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTX0FERF9QUk9KRUNUKTsKLQkKLQkJLy8gZGlzYWJsZSB0aGUgYWRkIHByb2plY3QgbW9kdWxlIGJ1dHRvbiBpZiB0aGVyZSBhcmUgbm8KLQkJLy8gd2ViIHByb2plY3RzIGluIHRoZSB3b3JrYmVuY2gKLQkJaWYgKCFjYW5BZGRXZWJNb2R1bGUoKSkKLQkJCWFkZFByb2plY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UgewotCQkJYWRkUHJvamVjdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVdlYk1vZHVsZURpYWxvZyBkaWFsb2cgPSBuZXcgV2ViTW9kdWxlRGlhbG9nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBnZXRTZXJ2ZXIoKSwgc2VydmVyMiwgY29uZmlndXJhdGlvbiwgdHJ1ZSk7Ci0JCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCQkJCWV4ZWN1dGUobmV3IEFkZE1vZHVsZUNvbW1hbmQoZ2V0U2VydmVyKCksIGRpYWxvZy5tb2R1bGU0KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQotCQlhZGRFeHRQcm9qZWN0ID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocmlnaHRQYW5lbCwgTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvckFkZEV4dGVybmFsTW9kdWxlLCBTV1QuUFVTSCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYWRkRXh0UHJvamVjdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlhZGRFeHRQcm9qZWN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVdlYk1vZHVsZURpYWxvZyBkaWFsb2cgPSBuZXcgV2ViTW9kdWxlRGlhbG9nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBnZXRTZXJ2ZXIoKSwgc2VydmVyMiwgY29uZmlndXJhdGlvbiwgZmFsc2UpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQlleGVjdXRlKG5ldyBBZGRXZWJNb2R1bGVDb21tYW5kKGNvbmZpZ3VyYXRpb24sIGRpYWxvZy5nZXRXZWJNb2R1bGUoKSkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKGFkZEV4dFByb2plY3QsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFU19BRERfRVhURVJOQUwpOwotCQkKLQkJZWRpdCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHJpZ2h0UGFuZWwsIE1lc3NhZ2VzLmVkaXRvckVkaXQsIFNXVC5QVVNIKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQllZGl0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVkaXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbiA8IDApCi0JCQkJCXJldHVybjsKLQkJCQlXZWJNb2R1bGUgbW9kdWxlID0gKFdlYk1vZHVsZSkgY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCkuZ2V0KHNlbGVjdGlvbik7Ci0JCQkJV2ViTW9kdWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBXZWJNb2R1bGVEaWFsb2coZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIGdldFNlcnZlcigpLCBzZXJ2ZXIyLCBjb25maWd1cmF0aW9uLCBtb2R1bGUpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQlleGVjdXRlKG5ldyBNb2RpZnlXZWJNb2R1bGVDb21tYW5kKGNvbmZpZ3VyYXRpb24sIHNlbGVjdGlvbiwgZGlhbG9nLmdldFdlYk1vZHVsZSgpKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJd2hzLnNldEhlbHAoZWRpdCwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTX0VESVQpOwotCQotCQlyZW1vdmUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihyaWdodFBhbmVsLCBNZXNzYWdlcy5lZGl0b3JSZW1vdmUsIFNXVC5QVVNIKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlyZW1vdmUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbiA8IDApCi0JCQkJCXJldHVybjsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHdlYkFwcFRhYmxlLmdldEl0ZW0oc2VsZWN0aW9uKTsKLQkJCQlpZiAoaXRlbS5nZXREYXRhKCkgIT0gbnVsbCkgewotCQkJCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVtLmdldERhdGEoKTsKLQkJCQkJZXhlY3V0ZShuZXcgUmVtb3ZlTW9kdWxlQ29tbWFuZChnZXRTZXJ2ZXIoKSwgbW9kdWxlKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXhlY3V0ZShuZXcgUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZChjb25maWd1cmF0aW9uLCBzZWxlY3Rpb24pKTsKLQkJCQl9Ci0JCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJc2VsZWN0aW9uID0gLTE7Ci0JCQl9Ci0JCX0pOwotCQl3aHMuc2V0SGVscChyZW1vdmUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFU19SRU1PVkUpOwotCQkKLQkJZm9ybS5zZXRDb250ZW50KHNlY3Rpb24pOwotCQlmb3JtLnJlZmxvdyh0cnVlKTsKLQkJCi0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5BZGRXZWJNb2R1bGUoKSB7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpKTsKLQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSkgbW9kdWxlc1tpXS5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLCBudWxsKTsKLQkJCQlpZiAod2ViTW9kdWxlICE9IG51bGwpIHsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXIuY2FuTW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlc1tpXSB9LCBudWxsLCBudWxsKTsKLQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5pc09LKCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQljb25maWd1cmF0aW9uLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yIHBhcnQgd2l0aCBhIHNpdGUgYW5kIGlucHV0LgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkKLQkJVG9tY2F0U2VydmVyIHRzID0gKFRvbWNhdFNlcnZlcikgc2VydmVyLmxvYWRBZGFwdGVyKFRvbWNhdFNlcnZlci5jbGFzcywgbnVsbCk7Ci0JCXRyeSB7Ci0JCQljb25maWd1cmF0aW9uID0gdHMuZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLQkJCWFkZENoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIyID0gKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyLmxvYWRBZGFwdGVyKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weS5jbGFzcywgbnVsbCk7Ci0JCQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKHdlYkFwcFRhYmxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJd2ViQXBwVGFibGUucmVtb3ZlQWxsKCk7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpOwotCQlMaXN0IGxpc3QgPSBjb25maWd1cmF0aW9uLmdldFdlYk1vZHVsZXMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVdlYk1vZHVsZSBtb2R1bGUgPSAoV2ViTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0od2ViQXBwVGFibGUsIFNXVC5OT05FKTsKLQkJCQotCQkJU3RyaW5nIG1lbWVudG8gPSBtb2R1bGUuZ2V0TWVtZW50bygpOwotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gIiI7Ci0JCQlJbWFnZSBwcm9qZWN0SW1hZ2UgPSBudWxsOwotCQkJaWYgKG1lbWVudG8gIT0gbnVsbCAmJiBtZW1lbnRvLmxlbmd0aCgpID4gMCkgewotCQkJCXByb2plY3ROYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvclByb2plY3RNaXNzaW5nLCBuZXcgU3RyaW5nW10ge21lbWVudG99KTsKLQkJCQlwcm9qZWN0SW1hZ2UgPSBUb21jYXRVSVBsdWdpbi5nZXRJbWFnZShUb21jYXRVSVBsdWdpbi5JTUdfUFJPSkVDVF9NSVNTSU5HKTsKLQkJCQlJTW9kdWxlIG1vZHVsZTIgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZShtZW1lbnRvKTsKLQkJCQlpZiAobW9kdWxlMiAhPSBudWxsKSB7Ci0JCQkJCXByb2plY3ROYW1lID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KG1vZHVsZTIpOwotCQkJCQlwcm9qZWN0SW1hZ2UgPSBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG1vZHVsZTIpOwotCQkJCQlpdGVtLnNldERhdGEobW9kdWxlMik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlTdHJpbmcgcmVsb2FkID0gbW9kdWxlLmlzUmVsb2FkYWJsZSgpID8gTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvclJlbG9hZEVuYWJsZWQgOiBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yUmVsb2FkRGlzYWJsZWQ7Ci0JCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tdIHttb2R1bGUuZ2V0UGF0aCgpLCBtb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCksIHByb2plY3ROYW1lLCByZWxvYWR9OwotCQkJaXRlbS5zZXRUZXh0KHMpOwotCQkJaXRlbS5zZXRJbWFnZSgwLCBUb21jYXRVSVBsdWdpbi5nZXRJbWFnZShUb21jYXRVSVBsdWdpbi5JTUdfV0VCX01PRFVMRSkpOwotCQkJaWYgKHByb2plY3RJbWFnZSAhPSBudWxsKQotCQkJCWl0ZW0uc2V0SW1hZ2UoMiwgcHJvamVjdEltYWdlKTsKLQkJCQotCQkJaWYgKCFpc0RvY3VtZW50QmFzZVZhbGlkKG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSkpIHsKLQkJCQlpdGVtLnNldEltYWdlKDEsIFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19QUk9KRUNUX01JU1NJTkcpKTsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JNaXNzaW5nV2ViTW9kdWxlLCBtb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCkpKTsKLQkJCX0KLQkJfQotCQlsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQkJCi0JCWlmIChyZWFkT25seSkgewotCQkJYWRkUHJvamVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWFkZEV4dFByb2plY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJYWRkUHJvamVjdC5zZXRFbmFibGVkKGNhbkFkZFdlYk1vZHVsZSgpKTsKLQkJCWFkZEV4dFByb2plY3Quc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlbGVjdFdlYkFwcCgpIHsKLQkJaWYgKHJlYWRPbmx5KQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlzZWxlY3Rpb24gPSB3ZWJBcHBUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQllZGl0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzZWxlY3Rpb24gPSAtMTsKLQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2N1bWVudEJhc2VWYWxpZChTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPCAyKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQkvLyBjaGVjayBhYnNvbHV0ZSBwYXRoCi0JCUZpbGUgZiA9IG5ldyBGaWxlKHMpOwotCQlpZiAoZi5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJLy8gY2hlY2sgd29ya3NwYWNlCi0JCXRyeSB7Ci0JCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHMpLmV4aXN0cygpKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gYmFkIHBhdGgKLQkJfQotCQkKLQkJaWYgKHMuc3RhcnRzV2l0aChjb25maWd1cmF0aW9uLmdldERvY0Jhc2VQcmVmaXgoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHQgPSBzLnN1YnN0cmluZyhjb25maWd1cmF0aW9uLmdldERvY0Jhc2VQcmVmaXgoKS5sZW5ndGgoKSk7Ci0JCQkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh0KS5leGlzdHMoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGJhZCBwYXRoCi0JCQl9Ci0JCX0KLQkJCi0JCS8vIGNoZWNrIHNlcnZlciByZWxhdGl2ZSBwYXRoCi0JCXRyeSB7Ci0JCQlmID0gc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpLmFwcGVuZChzKS50b0ZpbGUoKTsKLQkJCWlmIChmLmV4aXN0cygpKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gYmFkIHBhdGgKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAod2ViQXBwVGFibGUgIT0gbnVsbCkKLQkJCXdlYkFwcFRhYmxlLnNldEZvY3VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvTWltZU1hcHBpbmdEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL01pbWVNYXBwaW5nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNjVmZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvTWltZU1hcHBpbmdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVG9tY2F0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0vKioKLSAqIERpYWxvZyB0byBhZGQgb3IgbW9kaWZ5IG1pbWUgbWFwcGluZ3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBNaW1lTWFwcGluZ0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIE1pbWVNYXBwaW5nIG1hcDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXQ7Ci0KLQkvKioKLQkgKiBNaW1lTWFwcGluZ0RpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotCSAqLwotCXB1YmxpYyBNaW1lTWFwcGluZ0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQl0aGlzKHBhcmVudFNoZWxsLCBuZXcgTWltZU1hcHBpbmcoIiIsICIiKSk7Ci0JCWlzRWRpdCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE1pbWVNYXBwaW5nRGlhbG9nIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIG1hcCBhIG1pbWUgbWFwcGluZwotCSAqLwotCXB1YmxpYyBNaW1lTWFwcGluZ0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5tYXAgPSBtYXA7Ci0JCWlzRWRpdCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldEltYWdlKFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19NSU1FX01BUFBJTkcpKTsKLQkJaWYgKGlzRWRpdCkKLQkJCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ1RpdGxlRWRpdCk7Ci0JCWVsc2UKLQkJCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ1RpdGxlQWRkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgdXBwZXIgcGFydCAKLQkgKiBvZiB0aGlzIGRpYWxvZyAoYWJvdmUgdGhlIGJ1dHRvbiBiYXIpLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZAotCSAqIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoCi0JICogc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZy4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBkaWFsb2cgYXJlYQotCSAqIEByZXR1cm4gdGhlIGRpYWxvZyBhcmVhIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HX0RJQUxPRyk7Ci0JCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dNaW1lVHlwZSk7Ci0JCWZpbmFsIFRleHQgdHlwZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCXR5cGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZS5zZXRUZXh0KG1hcC5nZXRNaW1lVHlwZSgpKTsKLQkJdHlwZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQltYXAgPSBuZXcgTWltZU1hcHBpbmcobWFwLmdldEV4dGVuc2lvbigpLCB0eXBlLmdldFRleHQoKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKHR5cGUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR19ESUFMT0dfVFlQRSk7Ci0JCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dNaW1lRXh0ZW5zaW9uKTsKLQkJZmluYWwgVGV4dCBleHRlbnNpb24gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMTUwOwotCQlleHRlbnNpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZXh0ZW5zaW9uLnNldFRleHQobWFwLmdldEV4dGVuc2lvbigpKTsKLQkJZXh0ZW5zaW9uLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCW1hcCA9IG5ldyBNaW1lTWFwcGluZyhleHRlbnNpb24uZ2V0VGV4dCgpLCBtYXAuZ2V0TWltZVR5cGUoKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKGV4dGVuc2lvbiwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HX0RJQUxPR19FWFRFTlNJT04pOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQkJdmFsaWRhdGUoKTsKLQotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJYm9vbGVhbiBvayA9IHRydWU7Ci0JCWlmIChtYXAuZ2V0RXh0ZW5zaW9uKCkgPT0gbnVsbCB8fCBtYXAuZ2V0RXh0ZW5zaW9uKCkubGVuZ3RoKCkgPCAxKQotCQkJb2sgPSBmYWxzZTsKLQkJaWYgKG1hcC5nZXRNaW1lVHlwZSgpID09IG51bGwgfHwgbWFwLmdldE1pbWVUeXBlKCkubGVuZ3RoKCkgPCAxKQotCQkJb2sgPSBmYWxzZTsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQob2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWltZSBtYXBwaW5nLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5NaW1lTWFwcGluZwotCSAqLwotCXB1YmxpYyBNaW1lTWFwcGluZyBnZXRNaW1lTWFwcGluZygpIHsKLQkJcmV0dXJuIG1hcDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckdlbmVyYWxFZGl0b3JTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNTM3MmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0VmVyc2lvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldERlYnVnTW9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldFNlY3VyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldFNhdmVTZXBhcmF0ZUNvbnRleHRGaWxlc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldFNlcnZlTW9kdWxlc1dpdGhvdXRQdWJsaXNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclNlY3Rpb247Ci0vKioKLSAqIFRvbWNhdCBzZXJ2ZXIgZ2VuZXJhbCBlZGl0b3IgcGFnZS4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckdlbmVyYWxFZGl0b3JTZWN0aW9uIGV4dGVuZHMgU2VydmVyRWRpdG9yU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIFRvbWNhdFNlcnZlciB0b21jYXRTZXJ2ZXI7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHNlY3VyZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlYnVnOwotCXByb3RlY3RlZCBCdXR0b24gbm9QdWJsaXNoOwotCXByb3RlY3RlZCBCdXR0b24gc2VwYXJhdGVDb250ZXh0RmlsZXM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBub1B1Ymxpc2hDaGFuZ2VkOwotCXByb3RlY3RlZCBib29sZWFuIHNlcGFyYXRlQ29udGV4dEZpbGVzQ2hhbmdlZDsKLQotCS8qKgotCSAqIFNlcnZlckdlbmVyYWxFZGl0b3JQYXJ0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlckdlbmVyYWxFZGl0b3JTZWN0aW9uKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCWxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWlmIChUb21jYXRTZXJ2ZXIuUFJPUEVSVFlfU0VDVVJFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCVNlcnZlckdlbmVyYWxFZGl0b3JTZWN0aW9uLnRoaXMuc2VjdXJlLnNldFNlbGVjdGlvbihiLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKFRvbWNhdFNlcnZlci5QUk9QRVJUWV9ERUJVRy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbi50aGlzLmRlYnVnLnNldFNlbGVjdGlvbihiLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKElUb21jYXRTZXJ2ZXIuUFJPUEVSVFlfU0VSVkVfTU9EVUxFU19XSVRIT1VUX1BVQkxJU0guZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24udGhpcy5ub1B1Ymxpc2guc2V0U2VsZWN0aW9uKGIuYm9vbGVhblZhbHVlKCkpOwotCQkJCQkvLyBJbmRpY2F0ZSB0aGlzIHNldHRpbmcgaGFzIGNoYW5nZWQKLQkJCQkJbm9QdWJsaXNoQ2hhbmdlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChJVG9tY2F0U2VydmVyLlBST1BFUlRZX1NBVkVfU0VQQVJBVEVfQ09OVEVYVF9GSUxFUy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbi50aGlzLnNlcGFyYXRlQ29udGV4dEZpbGVzLnNldFNlbGVjdGlvbihiLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJLy8gSW5kaWNhdGUgdGhpcyBzZXR0aW5nIGhhcyBjaGFuZ2VkCi0JCQkJCXNlcGFyYXRlQ29udGV4dEZpbGVzQ2hhbmdlZCA9IHRydWU7Ci0JCQkJfQotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXNlcnZlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgU1dUIGNvbnRyb2xzIGZvciB0aGlzIHdvcmtiZW5jaCBwYXJ0LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlU2VjdGlvbihwYXJlbnQpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCQotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkVYUEFOREVECi0JCQl8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOwotCQlzZWN0aW9uLnNldFRleHQoTWVzc2FnZXMuc2VydmVyRWRpdG9yR2VuZXJhbFNlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnNlcnZlckVkaXRvckdlbmVyYWxEZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDE1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuU0VSVkVSX0VESVRPUik7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCQotCQkvLyBzZXJ2ZSBtb2R1bGVzIHdpdGhvdXQgcHVibGlzaAotCQlub1B1Ymxpc2ggPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvck5vUHVibGlzaCwgIiIpLCBTV1QuQ0hFQ0spOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlub1B1Ymxpc2guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbm9QdWJsaXNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgU2V0U2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2hDb21tYW5kKHRvbWNhdFNlcnZlciwgbm9QdWJsaXNoLmdldFNlbGVjdGlvbigpKSk7Ci0JCQkJLy8gSW5kaWNhdGUgdGhpcyBzZXR0aW5nIGhhcyBjaGFuZ2VkCi0JCQkJbm9QdWJsaXNoQ2hhbmdlZCA9IHRydWU7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCS8vIFRPRE8gQWRkcmVzcyBoZWxwCi0vLwkJd2hzLnNldEhlbHAobm9QdWJsaXNoLCBDb250ZXh0SWRzLlNFUlZFUl9FRElUT1JfU0VDVVJFKTsKLQotCQkvLyBzYXZlIHNlcGFyYXRlIGNvbnRleHQgWE1MIGZpbGVzCi0JCXNlcGFyYXRlQ29udGV4dEZpbGVzID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBOTFMuYmluZChNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JTZXBhcmF0ZUNvbnRleHRGaWxlcywgIiIpLCBTV1QuQ0hFQ0spOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzZXBhcmF0ZUNvbnRleHRGaWxlcy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzZXBhcmF0ZUNvbnRleHRGaWxlcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IFNldFNhdmVTZXBhcmF0ZUNvbnRleHRGaWxlc0NvbW1hbmQodG9tY2F0U2VydmVyLCBzZXBhcmF0ZUNvbnRleHRGaWxlcy5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCS8vIEluZGljYXRlIHRoaXMgc2V0dGluZyBoYXMgY2hhbmdlZAotCQkJCXNlcGFyYXRlQ29udGV4dEZpbGVzQ2hhbmdlZCA9IHRydWU7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCS8vIFRPRE8gQWRkcmVzcyBoZWxwCi0vLwkJd2hzLnNldEhlbHAoc2VwYXJhdGVDb250ZXh0RmlsZXMsIENvbnRleHRJZHMuU0VSVkVSX0VESVRPUl9TRUNVUkUpOwotCQkKLQkJLy8gc2VjdXJpdHkKLQkJc2VjdXJlID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JTZWN1cmUsIFNXVC5DSEVDSyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNlY3VyZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzZWN1cmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCWlmICh1cGRhdGluZykKLQkJCQkJcmV0dXJuOwotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlleGVjdXRlKG5ldyBTZXRTZWN1cmVDb21tYW5kKHRvbWNhdFNlcnZlciwgc2VjdXJlLmdldFNlbGVjdGlvbigpKSk7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKHNlY3VyZSwgQ29udGV4dElkcy5TRVJWRVJfRURJVE9SX1NFQ1VSRSk7Ci0JCi0JCS8vIGRlYnVnIG1vZGUKLQkJZGVidWcgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvckRlYnVnTW9kZSwgIiIpLCBTV1QuQ0hFQ0spOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkZWJ1Zy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkZWJ1Zy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IFNldERlYnVnTW9kZUNvbW1hbmQodG9tY2F0U2VydmVyLCBkZWJ1Zy5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQl3aHMuc2V0SGVscChkZWJ1ZywgQ29udGV4dElkcy5TRVJWRVJfRURJVE9SX0RFQlVHX01PREUpOwotCQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJFZGl0b3JTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNlcnZlckVkaXRvclNlY3Rpb24jaW5pdChJRWRpdG9yU2l0ZSwgSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQl0b21jYXRTZXJ2ZXIgPSAoVG9tY2F0U2VydmVyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoVG9tY2F0U2VydmVyLmNsYXNzLCBudWxsKTsKLQkJCWFkZENoYW5nZUxpc3RlbmVyKCk7Ci0JCX0KLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGZpZWxkcyBpbiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoc2VjdXJlID09IG51bGwgfHwgdG9tY2F0U2VydmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXVwZGF0aW5nID0gdHJ1ZTsKLQkJSVRvbWNhdFZlcnNpb25IYW5kbGVyIHR2aCA9IHRvbWNhdFNlcnZlci5nZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpOwotCQkKLQkJYm9vbGVhbiBzdXBwb3J0ZWQgPSB0dmggIT0gbnVsbCAmJiB0dmguc3VwcG9ydHNTZXJ2ZU1vZHVsZXNXaXRob3V0UHVibGlzaCgpOwotCQlTdHJpbmcgbGFiZWwgPSBOTFMuYmluZChNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JOb1B1Ymxpc2gsCi0JCQkJc3VwcG9ydGVkID8gIiIgOiBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JOb3RTdXBwb3J0ZWQpOwotCQlub1B1Ymxpc2guc2V0VGV4dChsYWJlbCk7Ci0JCW5vUHVibGlzaC5zZXRTZWxlY3Rpb24odG9tY2F0U2VydmVyLmlzU2VydmVNb2R1bGVzV2l0aG91dFB1Ymxpc2goKSk7Ci0JCWlmIChyZWFkT25seSB8fCAhc3VwcG9ydGVkKQotCQkJbm9QdWJsaXNoLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbHNlCi0JCQlub1B1Ymxpc2guc2V0RW5hYmxlZCh0cnVlKTsKLQotCQlzdXBwb3J0ZWQgPSB0dmggIT0gbnVsbCAmJiB0dmguc3VwcG9ydHNTZXBhcmF0ZUNvbnRleHRGaWxlcygpOwotCQlsYWJlbCA9IE5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcGFyYXRlQ29udGV4dEZpbGVzLAotCQkJCXN1cHBvcnRlZCA/ICIiIDogTWVzc2FnZXMuc2VydmVyRWRpdG9yTm90U3VwcG9ydGVkKTsKLQkJc2VwYXJhdGVDb250ZXh0RmlsZXMuc2V0VGV4dChsYWJlbCk7Ci0JCXNlcGFyYXRlQ29udGV4dEZpbGVzLnNldFNlbGVjdGlvbih0b21jYXRTZXJ2ZXIuaXNTYXZlU2VwYXJhdGVDb250ZXh0RmlsZXMoKSk7Ci0JCWlmIChyZWFkT25seSB8fCAhc3VwcG9ydGVkKQotCQkJc2VwYXJhdGVDb250ZXh0RmlsZXMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UKLQkJCXNlcGFyYXRlQ29udGV4dEZpbGVzLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJc2VjdXJlLnNldFNlbGVjdGlvbih0b21jYXRTZXJ2ZXIuaXNTZWN1cmUoKSk7Ci0JCQotCQlzdXBwb3J0ZWQgPSB0dmggIT0gbnVsbCAmJiB0dmguc3VwcG9ydHNEZWJ1Z0FyZ3VtZW50KCk7Ci0JCWxhYmVsID0gTkxTLmJpbmQoTWVzc2FnZXMuc2VydmVyRWRpdG9yRGVidWdNb2RlLAotCQkJCXN1cHBvcnRlZCA/ICIiIDogTWVzc2FnZXMuc2VydmVyRWRpdG9yTm90U3VwcG9ydGVkKTsKLQkJZGVidWcuc2V0VGV4dChsYWJlbCk7Ci0JCWlmIChyZWFkT25seSB8fCAhc3VwcG9ydGVkKQotCQkJZGVidWcuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UgewotCQkJZGVidWcuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWRlYnVnLnNldFNlbGVjdGlvbih0b21jYXRTZXJ2ZXIuaXNEZWJ1ZygpKTsKLQkJfQotCQkKLQkJaWYgKHJlYWRPbmx5KQotCQkJc2VjdXJlLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbHNlCi0JCQlzZWN1cmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCi0JCXVwZGF0aW5nID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJFZGl0b3JTZWN0aW9uI2dldFNhdmVTdGF0dXMoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzW10gZ2V0U2F2ZVN0YXR1cygpIHsKLQkJLy8gSWYgc2VydmUgbW9kdWxlcyB3aXRob3V0IHB1Ymxpc2hpbmcgaGFzIGNoYW5nZWQsIHJlcXVlc3QgY2xlYW4gcHVibGlzaCB0byBiZSBzYWZlCi0JCWlmIChub1B1Ymxpc2hDaGFuZ2VkKSB7Ci0JCQkvLyBJZiBzZXJ2ZXIgaXMgcnVubmluZywgYWJvcnQgdGhlIHNhdmUgc2luY2UgY2xlYW4gcHVibGlzaCB3b24ndCBzdWNjZWVkCi0JCQlpZiAodG9tY2F0U2VydmVyLmdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQkJcmV0dXJuIG5ldyBJU3RhdHVzIFtdIHsKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvclNlcnZlck11c3RCZVN0b3BwZWQsCi0JCQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuc2VydmVyRWRpdG9yTm9QdWJsaXNoLCAiIikudHJpbSgpKSkKLQkJCQl9OwotCQkJfQotCQkJLy8gRm9yY2UgYSBjbGVhbiBwdWJsaXNoCi0JCQl0b21jYXRTZXJ2ZXIuZ2V0U2VydmVyKCkucHVibGlzaChJU2VydmVyLlBVQkxJU0hfQ0xFQU4sIG51bGwsIG51bGwsIG51bGwpOwotCQkJbm9QdWJsaXNoQ2hhbmdlZCA9IGZhbHNlOwotCQl9Ci0JCWlmIChzZXBhcmF0ZUNvbnRleHRGaWxlc0NoYW5nZWQpIHsKLQkJCS8vIElmIHNlcnZlciBpcyBydW5uaW5nLCBhYm9ydCB0aGUgc2F2ZSBzaW5jZSBjb250ZXh0cyB3aWxsIGJlIG1vdmluZwotCQkJaWYgKHRvbWNhdFNlcnZlci5nZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJCXJldHVybiBuZXcgSVN0YXR1cyBbXSB7Ci0JCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTZXJ2ZXJNdXN0QmVTdG9wcGVkLAotCQkJCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcGFyYXRlQ29udGV4dEZpbGVzLCAiIikudHJpbSgpKSkKLQkJCQl9OwotCQkJfQotCQl9Ci0JCS8vIHVzZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHJldHVybiBzdWNjZXNzCi0JCXJldHVybiBzdXBlci5nZXRTYXZlU3RhdHVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJMb2NhdGlvbkVkaXRvclNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2MTg5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJMb2NhdGlvbkVkaXRvclNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldERlcGxveURpcmVjdG9yeUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldEluc3RhbmNlRGlyZWN0b3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRm9ybUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklQdWJsaXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclNlY3Rpb247Ci0vKioKLSAqIFRvbWNhdCBzZXJ2ZXIgZ2VuZXJhbCBlZGl0b3IgcGFnZS4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbiBleHRlbmRzIFNlcnZlckVkaXRvclNlY3Rpb24gewotCXByb3RlY3RlZCBTZWN0aW9uIHNlY3Rpb247Ci0JcHJvdGVjdGVkIFRvbWNhdFNlcnZlciB0b21jYXRTZXJ2ZXI7Ci0KLQlwcm90ZWN0ZWQgSHlwZXJsaW5rIHNldERlZmF1bHREZXBsb3lEaXI7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdERlcGxveURpcklzU2V0OwotCQotCXByb3RlY3RlZCBCdXR0b24gc2VydmVyRGlyTWV0YWRhdGE7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzZXJ2ZXJEaXJJbnN0YWxsOwotCXByb3RlY3RlZCBCdXR0b24gc2VydmVyRGlyQ3VzdG9tOwotCQotCXByb3RlY3RlZCBUZXh0IHNlcnZlckRpcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHNlcnZlckRpckJyb3dzZTsKLQlwcm90ZWN0ZWQgVGV4dCBkZXBsb3lEaXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZXBsb3lEaXJCcm93c2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgSVB1Ymxpc2hMaXN0ZW5lciBwdWJsaXNoTGlzdGVuZXI7Ci0JcHJvdGVjdGVkIElQYXRoIHdvcmtzcGFjZVBhdGg7Ci0JcHJvdGVjdGVkIElQYXRoIGRlZmF1bHREZXBsb3lQYXRoOwotCQotCXByb3RlY3RlZCBib29sZWFuIGFsbG93UmVzdHJpY3RlZEVkaXRpbmc7Ci0JcHJvdGVjdGVkIElQYXRoIHRlbXBEaXJQYXRoOwotCXByb3RlY3RlZCBJUGF0aCBpbnN0YWxsRGlyUGF0aDsKLQotCS8vIEF2b2lkIGhhcmRjb2RpbmcgdGhpcyBhdCBzb21lIHBvaW50Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE1FVEFEQVRBRElSID0gIi5tZXRhZGF0YSI7Ci0JLyoqCi0JICogU2VydmVyR2VuZXJhbEVkaXRvclBhcnQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycyB0byBkZXRlY3QgdW5kbyBjaGFuZ2VzIGFuZCBwdWJsaXNoaW5nIG9mIHRoZSBzZXJ2ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmICh1cGRhdGluZykKLQkJCQkJcmV0dXJuOwotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlpZiAoSVRvbWNhdFNlcnZlci5QUk9QRVJUWV9JTlNUQU5DRV9ESVIuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKQotCQkJCQkJfHwgSVRvbWNhdFNlcnZlci5QUk9QRVJUWV9URVNUX0VOVklST05NRU5ULmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJdXBkYXRlU2VydmVyRGlyQnV0dG9ucygpOwotCQkJCQl1cGRhdGVTZXJ2ZXJEaXJGaWVsZHMoKTsKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoSVRvbWNhdFNlcnZlci5QUk9QRVJUWV9ERVBMT1lfRElSLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlTZXJ2ZXJMb2NhdGlvbkVkaXRvclNlY3Rpb24udGhpcy5kZXBsb3lEaXIuc2V0VGV4dChzKTsKLQkJCQkJdXBkYXRlRGVmYXVsdERlcGxveUxpbmsoKTsJCQkJCQotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJfQotCQl9OwotCQlzZXJ2ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlwdWJsaXNoTGlzdGVuZXIgPSBuZXcgUHVibGlzaEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwdWJsaXNoRmluaXNoZWQoSVNlcnZlciBzZXJ2ZXIyLCBJU3RhdHVzIHN0YXR1cykgewotCQkJCWJvb2xlYW4gZmxhZyA9IGZhbHNlOwotCQkJCWlmIChzdGF0dXMuaXNPSygpICYmIHNlcnZlcjIuZ2V0TW9kdWxlcygpLmxlbmd0aCA9PSAwKQotCQkJCQlmbGFnID0gdHJ1ZTsKLQkJCQlpZiAoZmxhZyAhPSBhbGxvd1Jlc3RyaWN0ZWRFZGl0aW5nKSB7Ci0JCQkJCWFsbG93UmVzdHJpY3RlZEVkaXRpbmcgPSBmbGFnOwotCQkJCQkvLyBVcGRhdGUgdGhlIHN0YXRlIG9mIHRoZSBmaWVsZHMKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlib29sZWFuIGN1c3RvbVNlcnZlckRpciA9IGZhbHNlOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyQ3VzdG9tLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJY3VzdG9tU2VydmVyRGlyID0gU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyQ3VzdG9tLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyTWV0YWRhdGEuaXNEaXNwb3NlZCgpKQotCQkJCQkJCQlTZXJ2ZXJMb2NhdGlvbkVkaXRvclNlY3Rpb24udGhpcy5zZXJ2ZXJEaXJNZXRhZGF0YS5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcpOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlySW5zdGFsbC5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCVNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbi50aGlzLnNlcnZlckRpckluc3RhbGwuc2V0RW5hYmxlZChhbGxvd1Jlc3RyaWN0ZWRFZGl0aW5nKTsKLQkJCQkJCQlpZiAoIVNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbi50aGlzLnNlcnZlckRpckN1c3RvbS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCVNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbi50aGlzLnNlcnZlckRpckN1c3RvbS5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcpOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyLnNldEVuYWJsZWQoYWxsb3dSZXN0cmljdGVkRWRpdGluZyAmJiBjdXN0b21TZXJ2ZXJEaXIpOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyQnJvd3NlLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyRGlyQnJvd3NlLnNldEVuYWJsZWQoYWxsb3dSZXN0cmljdGVkRWRpdGluZyAmJiBjdXN0b21TZXJ2ZXJEaXIpOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuc2V0RGVmYXVsdERlcGxveURpci5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCVNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbi50aGlzLnNldERlZmF1bHREZXBsb3lEaXIuc2V0RW5hYmxlZChhbGxvd1Jlc3RyaWN0ZWRFZGl0aW5nKTsKLQkJCQkJCQlpZiAoIVNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbi50aGlzLmRlcGxveURpci5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCVNlcnZlckxvY2F0aW9uRWRpdG9yU2VjdGlvbi50aGlzLmRlcGxveURpci5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcpOwotCQkJCQkJCWlmICghU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuZGVwbG95RGlyQnJvd3NlLmlzRGlzcG9zZWQoKSkKLQkJCQkJCQkJU2VydmVyTG9jYXRpb25FZGl0b3JTZWN0aW9uLnRoaXMuZGVwbG95RGlyQnJvd3NlLnNldEVuYWJsZWQoYWxsb3dSZXN0cmljdGVkRWRpdGluZyk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJc2VydmVyLmdldE9yaWdpbmFsKCkuYWRkUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFNXVCBjb250cm9scyBmb3IgdGhpcyB3b3JrYmVuY2ggcGFydC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwotCi0JCXNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkVYUEFOREVECi0JCQl8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOwotCQlzZWN0aW9uLnNldFRleHQoTWVzc2FnZXMuc2VydmVyRWRpdG9yTG9jYXRpb25zU2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuc2VydmVyRWRpdG9yTG9jYXRpb25zRGVzY3JpcHRpb24pOwotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxNTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJd2hzLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlNFUlZFUl9FRElUT1IpOwotCQl3aHMuc2V0SGVscChzZWN0aW9uLCBDb250ZXh0SWRzLlNFUlZFUl9FRElUT1IpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCi0JCXNlcnZlckRpck1ldGFkYXRhID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcnZlckRpck1ldGFkYXRhLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JEb2VzTm90TW9kaWZ5KSwgU1dULlJBRElPKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2VydmVyRGlyTWV0YWRhdGEuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2VydmVyRGlyTWV0YWRhdGEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nIHx8ICFzZXJ2ZXJEaXJNZXRhZGF0YS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJcmV0dXJuOwotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlleGVjdXRlKG5ldyBTZXRUZXN0RW52aXJvbm1lbnRDb21tYW5kKHRvbWNhdFNlcnZlciwgdHJ1ZSkpOwotCQkJCXVwZGF0ZVNlcnZlckRpckZpZWxkcygpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2VydmVyRGlySW5zdGFsbCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JTZXJ2ZXJEaXJJbnN0YWxsLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JUYWtlc0NvbnRyb2wpLCBTV1QuUkFESU8pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzZXJ2ZXJEaXJJbnN0YWxsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNlcnZlckRpckluc3RhbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nIHx8ICFzZXJ2ZXJEaXJJbnN0YWxsLmdldFNlbGVjdGlvbigpKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IFNldFRlc3RFbnZpcm9ubWVudENvbW1hbmQodG9tY2F0U2VydmVyLCBmYWxzZSkpOwotCQkJCXVwZGF0ZVNlcnZlckRpckZpZWxkcygpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2VydmVyRGlyQ3VzdG9tID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcnZlckRpckN1c3RvbSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yRG9lc05vdE1vZGlmeSksIFNXVC5SQURJTyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNlcnZlckRpckN1c3RvbS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzZXJ2ZXJEaXJDdXN0b20uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nIHx8ICFzZXJ2ZXJEaXJDdXN0b20uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZCh0b21jYXRTZXJ2ZXIsIHRydWUpKTsKLQkJCQl1cGRhdGVTZXJ2ZXJEaXJGaWVsZHMoKTsKLQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIHNlcnZlciBkaXJlY3RvcnkKLQkJTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcnZlckRpcik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlzZXJ2ZXJEaXIgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCBudWxsLCBTV1QuU0lOR0xFKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLndpZHRoSGludCA9IDc1OwotCQlzZXJ2ZXJEaXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2VydmVyRGlyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmICh1cGRhdGluZykKLQkJCQkJcmV0dXJuOwotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlleGVjdXRlKG5ldyBTZXRJbnN0YW5jZURpcmVjdG9yeUNvbW1hbmQodG9tY2F0U2VydmVyLCBnZXRTZXJ2ZXJEaXIoKSkpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2VydmVyRGlyQnJvd3NlID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBNZXNzYWdlcy5lZGl0b3JCcm93c2UsIFNXVC5QVVNIKTsKLQkJc2VydmVyRGlyQnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzZXJ2ZXJEaXIuZ2V0U2hlbGwoKSk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuc2VydmVyRWRpdG9yQnJvd3NlRGVwbG95TWVzc2FnZSk7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoc2VydmVyRGlyLmdldFRleHQoKSk7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCAmJiAhc2VsZWN0ZWREaXJlY3RvcnkuZXF1YWxzKHNlcnZlckRpci5nZXRUZXh0KCkpKSB7Ci0JCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJLy8gTWFrZSByZWxhdGl2ZSBpZiByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlCi0JCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQkJCWlmICh3b3Jrc3BhY2VQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQkJCWludCBjbnQgPSBwYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyh3b3Jrc3BhY2VQYXRoKTsKLQkJCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoY250KS5zZXREZXZpY2UobnVsbCk7Ci0JCQkJCQlzZWxlY3RlZERpcmVjdG9yeSA9IHBhdGgudG9PU1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCWV4ZWN1dGUobmV3IFNldEluc3RhbmNlRGlyZWN0b3J5Q29tbWFuZCh0b21jYXRTZXJ2ZXIsIHNlbGVjdGVkRGlyZWN0b3J5KSk7Ci0JCQkJCXVwZGF0ZVNlcnZlckRpckJ1dHRvbnMoKTsKLQkJCQkJdXBkYXRlU2VydmVyRGlyRmllbGRzKCk7Ci0JCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2VydmVyRGlyQnJvd3NlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQotCQkvLyBkZXBsb3ltZW50IGRpcmVjdG9yeSBsaW5rCi0JCXNldERlZmF1bHREZXBsb3lEaXIgPSB0b29sa2l0LmNyZWF0ZUh5cGVybGluayhjb21wb3NpdGUsCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuc2VydmVyRWRpdG9yU2V0RGVmYXVsdERlcGxveURpckxpbmssICIiKSwgU1dULldSQVApOwotCQlzZXREZWZhdWx0RGVwbG95RGlyLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IFNldERlcGxveURpcmVjdG9yeUNvbW1hbmQodG9tY2F0U2VydmVyLCBJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkuREVGQVVMVF9ERVBMT1lESVIpKTsKLQkJCQlkZXBsb3lEaXIuc2V0VGV4dChJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkuREVGQVVMVF9ERVBMT1lESVIpOwotCQkJCXVwZGF0ZURlZmF1bHREZXBsb3lMaW5rKCk7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2V0RGVmYXVsdERlcGxveURpci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGRlcGxveW1lbnQgZGlyZWN0b3J5Ci0JCWxhYmVsID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JEZXBsb3lEaXIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZGVwbG95RGlyID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgbnVsbCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLQkJZGVwbG95RGlyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRlcGxveURpci5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgU2V0RGVwbG95RGlyZWN0b3J5Q29tbWFuZCh0b21jYXRTZXJ2ZXIsIGRlcGxveURpci5nZXRUZXh0KCkudHJpbSgpKSk7Ci0JCQkJdXBkYXRlRGVmYXVsdERlcGxveUxpbmsoKTsKLQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWRlcGxveURpckJyb3dzZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgTWVzc2FnZXMuZWRpdG9yQnJvd3NlLCBTV1QuUFVTSCk7Ci0JCWRlcGxveURpckJyb3dzZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZGVwbG95RGlyLmdldFNoZWxsKCkpOwotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLnNlcnZlckVkaXRvckJyb3dzZURlcGxveU1lc3NhZ2UpOwotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRlcGxveURpci5nZXRUZXh0KCkpOwotCQkJCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwgJiYgIXNlbGVjdGVkRGlyZWN0b3J5LmVxdWFscyhkZXBsb3lEaXIuZ2V0VGV4dCgpKSkgewotCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCWV4ZWN1dGUobmV3IFNldERlcGxveURpcmVjdG9yeUNvbW1hbmQodG9tY2F0U2VydmVyLCBzZWxlY3RlZERpcmVjdG9yeSkpOwotCQkJCQlkZXBsb3lEaXIuc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZGVwbG95RGlyQnJvd3NlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQpOwotCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VydmVyRWRpdG9yU2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWlmIChzZXJ2ZXIuZ2V0T3JpZ2luYWwoKSAhPSBudWxsKQotCQkJCXNlcnZlci5nZXRPcmlnaW5hbCgpLnJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJFZGl0b3JTZWN0aW9uI2luaXQoSUVkaXRvclNpdGUsIElFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJCi0JCS8vIENhY2hlIHdvcmtzcGFjZSBhbmQgZGVmYXVsdCBkZXBsb3kgcGF0aHMKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCXdvcmtzcGFjZVBhdGggPSByb290LmdldExvY2F0aW9uKCk7Ci0JCWRlZmF1bHREZXBsb3lQYXRoID0gbmV3IFBhdGgoSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5LkRFRkFVTFRfREVQTE9ZRElSKTsKLQotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXRvbWNhdFNlcnZlciA9IChUb21jYXRTZXJ2ZXIpIHNlcnZlci5sb2FkQWRhcHRlcihUb21jYXRTZXJ2ZXIuY2xhc3MsIG51bGwpOwotCQkJYWRkQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCX0KLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGZpZWxkcyBpbiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoc2VydmVyRGlyPT0gbnVsbCB8fCB0b21jYXRTZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdXBkYXRpbmcgPSB0cnVlOwotCi0JCUlSdW50aW1lIHJ1bnRpbWUgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpOwotCQkvLyBJZiBub3QgVG9tY2F0IDMuMiwgdXBkYXRlIGRlc2NyaXB0aW9uIHRvIG1lbnRpb24gY2F0YWxpbmEuYmFzZQotCQlpZiAocnVudGltZSAhPSBudWxsICYmIHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpLmluZGV4T2YoIjMyIikgPCAwKQotCQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JMb2NhdGlvbnNEZXNjcmlwdGlvbjIpOwotCQlpZiAocnVudGltZSAhPSBudWxsKQotCQkJaW5zdGFsbERpclBhdGggPSBydW50aW1lLmdldExvY2F0aW9uKCk7Ci0KLQkJLy8gZGV0ZXJtaW5lIGlmIGVkaXRpbmcgb2YgbG9jYXRpb25zIGlzIGFsbG93ZWQKLQkJYWxsb3dSZXN0cmljdGVkRWRpdGluZyA9IGZhbHNlOwotCQlJUGF0aCBiYXNlUGF0aCA9IHRvbWNhdFNlcnZlci5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCQlpZiAoIXJlYWRPbmx5KSB7Ci0JCQkvLyBJZiBzZXJ2ZXIgaGFzIG5vdCBiZWVuIHB1Ymxpc2hlZCwgb3Igc2VydmVyIGlzIHB1Ymxpc2hlZCB3aXRoIG5vIG1vZHVsZXMsIGFsbG93IGVkaXRpbmcKLQkJCS8vIFRPRE8gRmluZCBiZXR0ZXIgd2F5IHRvIGRldGVybWluZSBpZiBzZXJ2ZXIgaGFzbid0IGJlZW4gcHVibGlzaGVkCi0JCQlpZiAoKGJhc2VQYXRoICE9IG51bGwgJiYgIWJhc2VQYXRoLmFwcGVuZCgiY29uZiIpLnRvRmlsZSgpLmV4aXN0cygpKQotCQkJCQl8fCAoc2VydmVyLmdldE9yaWdpbmFsKCkuZ2V0U2VydmVyUHVibGlzaFN0YXRlKCkgPT0gSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUKLQkJCQkJCQkmJiBzZXJ2ZXIuZ2V0T3JpZ2luYWwoKS5nZXRNb2R1bGVzKCkubGVuZ3RoID09IDApKSB7Ci0JCQkJYWxsb3dSZXN0cmljdGVkRWRpdGluZyA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIFVwZGF0ZSBzZXJ2ZXIgcmVsYXRlZCBmaWVsZHMKLQkJdXBkYXRlU2VydmVyRGlyQnV0dG9ucygpOwotCQl1cGRhdGVTZXJ2ZXJEaXJGaWVsZHMoKTsKLQotCQlzZXJ2ZXJEaXJNZXRhZGF0YS5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcpOwotCQlzZXJ2ZXJEaXJJbnN0YWxsLnNldEVuYWJsZWQoYWxsb3dSZXN0cmljdGVkRWRpdGluZyk7Ci0JCXNlcnZlckRpckN1c3RvbS5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcpOwotCi0JCS8vIFVwZGF0ZSBkZXBsb3ltZW50IHJlbGF0ZWQgZmllbGRzCi0JCXVwZGF0ZURlZmF1bHREZXBsb3lMaW5rKCk7Ci0JCQotCQlkZXBsb3lEaXIuc2V0VGV4dCh0b21jYXRTZXJ2ZXIuZ2V0RGVwbG95RGlyZWN0b3J5KCkpOwotCi0JCXNldERlZmF1bHREZXBsb3lEaXIuc2V0RW5hYmxlZChhbGxvd1Jlc3RyaWN0ZWRFZGl0aW5nKTsKLQkJZGVwbG95RGlyLnNldEVuYWJsZWQoYWxsb3dSZXN0cmljdGVkRWRpdGluZyk7Ci0JCWRlcGxveURpckJyb3dzZS5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcpOwotCi0JCXVwZGF0aW5nID0gZmFsc2U7Ci0JCXZhbGlkYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VydmVyRGlyKCkgewotCQlTdHJpbmcgZGlyID0gbnVsbDsKLQkJaWYgKHNlcnZlckRpciAhPSBudWxsKSB7Ci0JCQlkaXIgPSBzZXJ2ZXJEaXIuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXIpOwotCQkJLy8gQWRqdXN0IGlmIHRoZSB0ZW1wIGRpciBpcyBrbm93biBhbmQgaGFzIGJlZW4gZW50ZXJlZAotCQkJaWYgKHRlbXBEaXJQYXRoICE9IG51bGwgJiYgdGVtcERpclBhdGguZXF1YWxzKHBhdGgpKQotCQkJCWRpciA9IG51bGw7Ci0JCQkvLyBJZiB1bmRlciB0aGUgd29ya3NwYWNlLCBtYWtlIHJlbGF0aXZlCi0JCQllbHNlIGlmICh3b3Jrc3BhY2VQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQlpbnQgY250ID0gcGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMod29ya3NwYWNlUGF0aCk7Ci0JCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjbnQpLnNldERldmljZShudWxsKTsKLQkJCQlkaXIgPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlyOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZXJ2ZXJEaXJCdXR0b25zKCkgewotCQlpZiAodG9tY2F0U2VydmVyLmdldEluc3RhbmNlRGlyZWN0b3J5KCkgPT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IHRvbWNhdFNlcnZlci5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmVxdWFscyhpbnN0YWxsRGlyUGF0aCkpIHsKLQkJCQlzZXJ2ZXJEaXJJbnN0YWxsLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlzZXJ2ZXJEaXJNZXRhZGF0YS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXNlcnZlckRpckN1c3RvbS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXJ2ZXJEaXJNZXRhZGF0YS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJc2VydmVyRGlySW5zdGFsbC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXNlcnZlckRpckN1c3RvbS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc2VydmVyRGlyQ3VzdG9tLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCXNlcnZlckRpck1ldGFkYXRhLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlzZXJ2ZXJEaXJJbnN0YWxsLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VydmVyRGlyRmllbGRzKCkgewotCQl1cGRhdGVTZXJ2ZXJEaXIoKTsKLQkJYm9vbGVhbiBjdXN0b21TZXJ2ZXJEaXIgPSBzZXJ2ZXJEaXJDdXN0b20uZ2V0U2VsZWN0aW9uKCk7Ci0JCXNlcnZlckRpci5zZXRFbmFibGVkKGFsbG93UmVzdHJpY3RlZEVkaXRpbmcgJiYgY3VzdG9tU2VydmVyRGlyKTsKLQkJc2VydmVyRGlyQnJvd3NlLnNldEVuYWJsZWQoYWxsb3dSZXN0cmljdGVkRWRpdGluZyAmJiBjdXN0b21TZXJ2ZXJEaXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZXJ2ZXJEaXIoKSB7Ci0JCUlQYXRoIHBhdGggPSB0b21jYXRTZXJ2ZXIuZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXNlcnZlckRpci5zZXRUZXh0KCIiKTsKLQkJZWxzZSBpZiAod29ya3NwYWNlUGF0aC5pc1ByZWZpeE9mKHBhdGgpKSB7Ci0JCQlpbnQgY250ID0gcGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMod29ya3NwYWNlUGF0aCk7Ci0JCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGNudCkuc2V0RGV2aWNlKG51bGwpOwotCQkJc2VydmVyRGlyLnNldFRleHQocGF0aC50b09TU3RyaW5nKCkpOwotCQkJLy8gY2FjaGUgdGhlIHJlbGF0aXZlIHRlbXAgZGlyIHBhdGggaWYgdGhhdCBpcyB3aGF0IHdlIGhhdmUKLQkJCWlmICh0ZW1wRGlyUGF0aCA9PSBudWxsKSB7Ci0JCQkJaWYgKHRvbWNhdFNlcnZlci5pc1Rlc3RFbnZpcm9ubWVudCgpICYmIHRvbWNhdFNlcnZlci5nZXRJbnN0YW5jZURpcmVjdG9yeSgpID09IG51bGwpCi0JCQkJCXRlbXBEaXJQYXRoID0gcGF0aDsKLQkJCX0KLQkJfSBlbHNlCi0JCQlzZXJ2ZXJEaXIuc2V0VGV4dChwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHREZXBsb3lMaW5rKCkgewotCQlib29sZWFuIG5ld1N0YXRlID0gZGVmYXVsdERlcGxveVBhdGguZXF1YWxzKG5ldyBQYXRoKHRvbWNhdFNlcnZlci5nZXREZXBsb3lEaXJlY3RvcnkoKSkpOwotCQlpZiAobmV3U3RhdGUgIT0gZGVmYXVsdERlcGxveURpcklzU2V0KSB7Ci0JCQlzZXREZWZhdWx0RGVwbG95RGlyLnNldFRleHQoCi0JCQkJCW5ld1N0YXRlID8gTWVzc2FnZXMuc2VydmVyRWRpdG9yU2V0RGVmYXVsdERlcGxveURpckxpbmsyCi0JCQkJCQkJOiBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JTZXREZWZhdWx0RGVwbG95RGlyTGluayk7Ci0JCQlkZWZhdWx0RGVwbG95RGlySXNTZXQgPSBuZXdTdGF0ZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFNlcnZlckVkaXRvclNlY3Rpb24jZ2V0U2F2ZVN0YXR1cygpCi0JICovCi0JcHVibGljIElTdGF0dXNbXSBnZXRTYXZlU3RhdHVzKCkgewotCQlpZiAodG9tY2F0U2VydmVyICE9IG51bGwpIHsKLQkJCS8vIENoZWNrIHRoZSBpbnN0YW5jZSBkaXJlY3RvcnkKLQkJCVN0cmluZyBkaXIgPSB0b21jYXRTZXJ2ZXIuZ2V0SW5zdGFuY2VEaXJlY3RvcnkoKTsKLQkJCWlmIChkaXIgIT0gbnVsbCkgewotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXIpOwotCQkJCS8vIE11c3Qgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSB3b3Jrc3BhY2UgbG9jYXRpb24KLQkJCQlpZiAoZGlyLmxlbmd0aCgpID09IDAgfHwgd29ya3NwYWNlUGF0aC5lcXVhbHMocGF0aCkpIHsKLQkJCQkJcmV0dXJuIG5ldyBJU3RhdHVzIFtdIHsKLQkJCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCwgTWVzc2FnZXMuZXJyb3JTZXJ2ZXJEaXJJc1Jvb3QpfTsKLQkJCQl9Ci0JCQkJLy8gVXNlciBzcGVjaWZpZWQgdmFsdWUgbWF5IG5vdCBiZSB1bmRlciB0aGUgIi5tZXRhZGF0YSIgZm9sZGVyIG9mIHRoZSB3b3Jrc3BhY2UgCi0JCQkJZWxzZSBpZiAod29ya3NwYWNlUGF0aC5pc1ByZWZpeE9mKHBhdGgpCi0JCQkJCQl8fCAoIXBhdGguaXNBYnNvbHV0ZSgpICYmIE1FVEFEQVRBRElSLmVxdWFscyhwYXRoLnNlZ21lbnQoMCkpKSkgewotCQkJCQlpbnQgY250ID0gcGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMod29ya3NwYWNlUGF0aCk7Ci0JCQkJCWlmIChNRVRBREFUQURJUi5lcXVhbHMocGF0aC5zZWdtZW50KGNudCkpKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IElTdGF0dXMgW10gewotCQkJCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTZXJ2ZXJEaXJVbmRlclJvb3QsIE1FVEFEQVRBRElSKSl9OwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBhdGguZXF1YWxzKGluc3RhbGxEaXJQYXRoKSkKLQkJCQkJcmV0dXJuIG5ldyBJU3RhdHVzIFtdIHsKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvclNlcnZlckRpckN1c3RvbU5vdEluc3RhbGwsCi0JCQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuc2VydmVyRWRpdG9yU2VydmVyRGlySW5zdGFsbCwgIiIpLnRyaW0oKSkpfTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlQYXRoIHBhdGggPSB0b21jYXRTZXJ2ZXIuZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKLQkJCQkvLyBJZiBub24tY3VzdG9tIGluc3RhbmNlIGRpciBpcyBub3QgdGhlIGluc3RhbGwgYW5kIG1ldGFkYXRhIGlzbid0IHRoZSBzZWxlY3Rpb24sIHJldHVybiBlcnJvcgotCQkJCWlmICghcGF0aC5lcXVhbHMoaW5zdGFsbERpclBhdGgpICYmICFzZXJ2ZXJEaXJNZXRhZGF0YS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlyZXR1cm4gbmV3IElTdGF0dXMgW10gewotCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTZXJ2ZXJEaXJDdXN0b21Ob3RNZXRhZGF0YSwgCi0JCQkJCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlcnZlckRpck1ldGFkYXRhLCAiIikudHJpbSgpKSl9OwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQ2hlY2sgdGhlIGRlcGxveW1lbnQgZGlyZWN0b3J5Ci0JCQlkaXIgPSB0b21jYXRTZXJ2ZXIuZ2V0RGVwbG95RGlyZWN0b3J5KCk7Ci0JCQkvLyBEZXBsb3kgZGlyZWN0b3J5IG11c3QgYmUgc2V0Ci0JCQlpZiAoZGlyID09IG51bGwgfHwgZGlyLmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gbmV3IElTdGF0dXMgW10gewotCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLmVycm9yRGVwbG95RGlyTm90U3BlY2lmaWVkKX07Ci0JCQl9Ci0JCX0KLQkJLy8gdXNlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIHN1Y2Nlc3MKLQkJcmV0dXJuIHN1cGVyLmdldFNhdmVTdGF0dXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCWlmICh0b21jYXRTZXJ2ZXIgIT0gbnVsbCkgewotCQkJLy8gVmFsaWRhdGUgaW5zdGFuY2UgZGlyZWN0b3J5Ci0JCQlTdHJpbmcgZGlyID0gdG9tY2F0U2VydmVyLmdldEluc3RhbmNlRGlyZWN0b3J5KCk7Ci0JCQlpZiAoZGlyICE9IG51bGwpIHsKLQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlyKTsKLQkJCQkvLyBNdXN0IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgd29ya3NwYWNlIGxvY2F0aW9uCi0JCQkJaWYgKGRpci5sZW5ndGgoKSA9PSAwIHx8IHdvcmtzcGFjZVBhdGguZXF1YWxzKHBhdGgpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5lcnJvclNlcnZlckRpcklzUm9vdCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJLy8gVXNlciBzcGVjaWZpZWQgdmFsdWUgbWF5IG5vdCBiZSB1bmRlciB0aGUgIi5tZXRhZGF0YSIgZm9sZGVyIG9mIHRoZSB3b3Jrc3BhY2UgCi0JCQkJZWxzZSBpZiAod29ya3NwYWNlUGF0aC5pc1ByZWZpeE9mKHBhdGgpCi0JCQkJCQl8fCAoIXBhdGguaXNBYnNvbHV0ZSgpICYmIE1FVEFEQVRBRElSLmVxdWFscyhwYXRoLnNlZ21lbnQoMCkpKSkgewotCQkJCQlpbnQgY250ID0gcGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMod29ya3NwYWNlUGF0aCk7Ci0JCQkJCWlmIChNRVRBREFUQURJUi5lcXVhbHMocGF0aC5zZWdtZW50KGNudCkpKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTZXJ2ZXJEaXJVbmRlclJvb3QsIE1FVEFEQVRBRElSKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocGF0aC5lcXVhbHMoaW5zdGFsbERpclBhdGgpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChNZXNzYWdlcy5lcnJvclNlcnZlckRpckN1c3RvbU5vdEluc3RhbGwsCi0JCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuc2VydmVyRWRpdG9yU2VydmVyRGlySW5zdGFsbCwgIiIpLnRyaW0oKSkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVBhdGggcGF0aCA9IHRvbWNhdFNlcnZlci5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCQkJCS8vIElmIG5vbi1jdXN0b20gaW5zdGFuY2UgZGlyIGlzIG5vdCB0aGUgaW5zdGFsbCBhbmQgbWV0YWRhdGEgaXNuJ3QgdGhlIHNlbGVjdGlvbiwgcmV0dXJuIGVycm9yCi0JCQkJaWYgKHBhdGggIT0gbnVsbCAmJiAhcGF0aC5lcXVhbHMoaW5zdGFsbERpclBhdGgpICYmICFzZXJ2ZXJEaXJNZXRhZGF0YS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTZXJ2ZXJEaXJDdXN0b21Ob3RNZXRhZGF0YSwgCi0JCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuc2VydmVyRWRpdG9yU2VydmVyRGlyTWV0YWRhdGEsICIiKS50cmltKCkpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIHRoZSBkZXBsb3ltZW50IGRpcmVjdG9yeQotCQkJZGlyID0gdG9tY2F0U2VydmVyLmdldERlcGxveURpcmVjdG9yeSgpOwotCQkJLy8gRGVwbG95IGRpcmVjdG9yeSBtdXN0IGJlIHNldAotCQkJaWYgKGRpciA9PSBudWxsIHx8IGRpci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmVycm9yRGVwbG95RGlyTm90U3BlY2lmaWVkKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLy8gQWxsIGlzIG9rYXksIGNsZWFyIGFueSBwcmV2aW91cyBlcnJvcgotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL1dlYk1vZHVsZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvV2ViTW9kdWxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTBhYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvV2ViTW9kdWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7Ci0vKioKLSAqIERpYWxvZyB0byBhZGQgb3IgbW9kaWZ5IHdlYiBtb2R1bGVzLgotICovCi1wdWJsaWMgY2xhc3MgV2ViTW9kdWxlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU0OwotCXByb3RlY3RlZCBXZWJNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Byb2plY3Q7Ci0JcHJvdGVjdGVkIFRleHQgZG9jQmFzZTsKLQlwcm90ZWN0ZWQgSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyMjsKLQlwcm90ZWN0ZWQgSVRvbWNhdFNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElUb21jYXRDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByb3RlY3RlZCBUYWJsZSBwcm9qVGFibGU7Ci0KLQkvKioKLQkgKiBXZWJNb2R1bGVEaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXIyIGEgc2VydmVyCi0JICogQHBhcmFtIHNlcnZlciBhIFRvbWNhdCBzZXJ2ZXIKLQkgKiBAcGFyYW0gY29uZmlnIGEgVG9tY2F0IHNlcnZlciBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqLwotCXB1YmxpYyBXZWJNb2R1bGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcjIsIElUb21jYXRTZXJ2ZXIgc2VydmVyLCBJVG9tY2F0Q29uZmlndXJhdGlvbiBjb25maWcsIFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5zZXJ2ZXIyID0gc2VydmVyMjsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQlpc0VkaXQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFdlYk1vZHVsZURpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlcjIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gc2VydmVyIGEgVG9tY2F0IHNlcnZlcgotCSAqIEBwYXJhbSBjb25maWcgYSBUb21jYXQgc2VydmVyIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gaXNQcm9qZWN0IHRydWUgaWYgaXQgaXMgYSBwcm9qZWN0Ci0JICovCi0JcHVibGljIFdlYk1vZHVsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyMiwgSVRvbWNhdFNlcnZlciBzZXJ2ZXIsIElUb21jYXRDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBpc1Byb2plY3QpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgc2VydmVyMiwgc2VydmVyLCBjb25maWcsIG5ldyBXZWJNb2R1bGUoIi8iLCAiIiwgbnVsbCwgdHJ1ZSkpOwotCQlpc0VkaXQgPSBmYWxzZTsKLQkJdGhpcy5pc1Byb2plY3QgPSBpc1Byb2plY3Q7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCWlmIChpc0VkaXQpCi0JCQluZXdTaGVsbC5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dUaXRsZUVkaXQpOwotCQllbHNlCi0JCQluZXdTaGVsbC5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dUaXRsZUFkZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIHVwcGVyIHBhcnQgCi0JICogb2YgdGhpcyBkaWFsb2cgKGFib3ZlIHRoZSBidXR0b24gYmFyKS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QKLQkgKiBjcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gd2l0aAotCSAqIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgZGlhbG9nIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgYXJlYSBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPRyk7Ci0JCS8vIGFkZCBwcm9qZWN0IGZpZWxkIGlmIHdlIGFyZSBhZGRpbmcgYSBwcm9qZWN0Ci0JCWlmICghaXNFZGl0ICYmIGlzUHJvamVjdCkgewotCQkJTGFiZWwgbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWwuc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nUHJvamVjdHMpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQkJbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQlwcm9qVGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULlNJTkdMRSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJCWRhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJcHJvalRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQl3aHMuc2V0SGVscChwcm9qVGFibGUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19QUk9KRUNUKTsKLQkKLQkJCS8vIGZpbGwgdGFibGUgd2l0aCB3ZWIgbW9kdWxlIHByb2plY3RzCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHNlcnZlcjIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSk7Ci0JCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlJTW9kdWxlIG1vZHVsZTMgPSBtb2R1bGVzW2ldOwotCQkJCQlpZiAoImpzdC53ZWIiLmVxdWFscyhtb2R1bGUzLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKSkgewotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXIyLmNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZTMgfSwgbnVsbCwgbnVsbCk7Ci0JCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShwcm9qVGFibGUsIFNXVC5OT05FKTsKLQkJCQkJCQlpdGVtLnNldFRleHQoMCwgbGFiZWxQcm92aWRlci5nZXRUZXh0KG1vZHVsZTMpKTsKLQkJCQkJCQlpdGVtLnNldEltYWdlKDAsIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UobW9kdWxlMykpOwotCQkJCQkJCWl0ZW0uc2V0RGF0YShtb2R1bGUzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIiAiKTsKLQkJfQotCQkKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ0RvY3VtZW50QmFzZSk7Ci0JCWRvY0Jhc2UgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRvY0Jhc2Uuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZG9jQmFzZS5zZXRUZXh0KG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSk7Ci0JCXdocy5zZXRIZWxwKGRvY0Jhc2UsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19ET0NCQVNFKTsKLQkKLQkJLy8gZGlzYWJsZSBkb2N1bWVudCBiYXNlIGZvciBwcm9qZWN0IG1vZHVsZXMKLQkJaWYgKGlzUHJvamVjdCB8fCAobW9kdWxlLmdldE1lbWVudG8oKSAhPSBudWxsICYmIG1vZHVsZS5nZXRNZW1lbnRvKCkubGVuZ3RoKCkgPiAwKSkKLQkJCWRvY0Jhc2Uuc2V0RWRpdGFibGUoZmFsc2UpOwotCQllbHNlIHsKLQkJCWRvY0Jhc2UuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQltb2R1bGUgPSBuZXcgV2ViTW9kdWxlKG1vZHVsZS5nZXRQYXRoKCksIGRvY0Jhc2UuZ2V0VGV4dCgpLCBtb2R1bGUuZ2V0TWVtZW50bygpLCBtb2R1bGUuaXNSZWxvYWRhYmxlKCkpOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCi0JCWlmIChpc0VkaXQgfHwgaXNQcm9qZWN0KQotCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIiAiKTsKLQkJZWxzZSB7Ci0JCQlCdXR0b24gYnJvd3NlID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWJyb3dzZS5zZXRUZXh0KE1lc3NhZ2VzLmJyb3dzZSk7Ci0JCQlicm93c2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGdldFNoZWxsKCkpOwotCQkJCQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1NlbGVjdERpcmVjdG9yeSk7Ci0JCQkJCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQkJCQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpCi0JCQkJCQkJZG9jQmFzZS5zZXRUZXh0KHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGJyb3dzaW5nIiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJLy8gcGF0aCAoY29udGV4dC1yb290KQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nUGF0aCk7Ci0JCWZpbmFsIFRleHQgcGF0aCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCXBhdGguc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcGF0aC5zZXRUZXh0KG1vZHVsZS5nZXRQYXRoKCkpOwotCQkvKmlmIChtb2R1bGUuZ2V0TWVtZW50bygpICE9IG51bGwgJiYgbW9kdWxlLmdldE1lbWVudG8oKS5sZW5ndGgoKSA+IDApCi0JCQlwYXRoLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJZWxzZSovCi0JCQlwYXRoLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJbW9kdWxlID0gbmV3IFdlYk1vZHVsZShwYXRoLmdldFRleHQoKSwgbW9kdWxlLmdldERvY3VtZW50QmFzZSgpLCBtb2R1bGUuZ2V0TWVtZW50bygpLCBtb2R1bGUuaXNSZWxvYWRhYmxlKCkpOwotCQkJCX0KLQkJCX0pOwotCQl3aHMuc2V0SGVscChwYXRoLCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRV9ESUFMT0dfUEFUSCk7Ci0JCQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiIik7Ci0JCQotCQlpZiAoIWlzUHJvamVjdCkgewotCQkJLy8gYXV0byByZWxvYWQKLQkJCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCIiKTsKLQkJCWZpbmFsIEJ1dHRvbiByZWxvYWRhYmxlID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQlyZWxvYWRhYmxlLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1JlbG9hZEVuYWJsZWQpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQkJcmVsb2FkYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJcmVsb2FkYWJsZS5zZXRTZWxlY3Rpb24obW9kdWxlLmlzUmVsb2FkYWJsZSgpKTsKLQkJCXJlbG9hZGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQltb2R1bGUgPSBuZXcgV2ViTW9kdWxlKG1vZHVsZS5nZXRQYXRoKCksIG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSwgbW9kdWxlLmdldE1lbWVudG8oKSwgcmVsb2FkYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChyZWxvYWRhYmxlLCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRV9ESUFMT0dfUkVMT0FEKTsKLQkJfQotCQkKLQkJaWYgKCFpc0VkaXQgJiYgaXNQcm9qZWN0KSB7Ci0JCQlwcm9qVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlNb2R1bGUgbW9kdWxlMyA9IChJTW9kdWxlKSBwcm9qVGFibGUuZ2V0U2VsZWN0aW9uKClbMF0uZ2V0RGF0YSgpOwotCQkJCQkJSVdlYk1vZHVsZSBtb2R1bGUyID0gKElXZWJNb2R1bGUpIG1vZHVsZTMubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQkJCQlTdHJpbmcgY29udGV4dFJvb3QgPSBtb2R1bGUyLmdldENvbnRleHRSb290KCk7Ci0JCQkJCQlpZiAoY29udGV4dFJvb3QgIT0gbnVsbCAmJiAhY29udGV4dFJvb3Quc3RhcnRzV2l0aCgiLyIpICYmIGNvbnRleHRSb290Lmxlbmd0aCgpID4gMCkKLQkJCQkJCQljb250ZXh0Um9vdCA9ICIvIiArIGNvbnRleHRSb290OwotCQkJCQkJbW9kdWxlID0gbmV3IFdlYk1vZHVsZShjb250ZXh0Um9vdCwgbW9kdWxlMy5nZXROYW1lKCksIG1vZHVsZTMuZ2V0SWQoKSwgbW9kdWxlLmlzUmVsb2FkYWJsZSgpKTsKLQkJCQkJCWRvY0Jhc2Uuc2V0VGV4dChtb2R1bGUzLmdldE5hbWUoKSk7Ci0JCQkJCQlwYXRoLnNldFRleHQoY29udGV4dFJvb3QpOwotCQkJCQkJbW9kdWxlNCA9IG1vZHVsZTM7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIiIpOwotCQl9Ci0JCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7Ci0JCXZhbGlkYXRlKCk7Ci0KLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCWJvb2xlYW4gb2sgPSB0cnVlOwotCQlpZiAobW9kdWxlLmdldERvY3VtZW50QmFzZSgpID09IG51bGwgfHwgbW9kdWxlLmdldERvY3VtZW50QmFzZSgpLmxlbmd0aCgpIDwgMSkKLQkJCW9rID0gZmFsc2U7Ci0JCQotCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChvayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtaW1lIG1hcHBpbmcuCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LldlYk1vZHVsZQotCSAqLwotCXB1YmxpYyBXZWJNb2R1bGUgZ2V0V2ViTW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzMWIyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWlfMy4wLjAuamFyCi1zamF2YXVpLmphcgotdGVtcC5mb2xkZXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc0N2Q2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ4MzVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmU0MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjA4NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NWE0MjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgRmViIDIzIDIxOjE1OjQ5IEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhNjBlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNTYXQgQXByIDIyIDE4OjM2OjE0IEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjY2FkMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDMucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLkphdmFTZXJ2ZXJVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY2FjdHVzO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAzLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4xMDAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxMWIzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9hcHBjbGllbnRfbW9kdWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9hcHBjbGllbnRfbW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyMzU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvYXBwY2xpZW50X21vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9lYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTYzMGIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9lYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL29iajE2L2VqYl9tb2R1bGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL29iajE2L2VqYl9tb2R1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI1YzBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9lamJfbW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9qYXZhX2phci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvamF2YV9qYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDU5Zjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9qYXZhX2phci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbmV3X3Rlc3RjYXNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9uZXdfdGVzdGNhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmY5M2NiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9uZXdfdGVzdGNhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL29iajE2L3dlYl9tb2R1bGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL29iajE2L3dlYl9tb2R1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIwZjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy93aXpiYW4vbmV3X3J1bnRpbWVfd2l6LnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy93aXpiYW4vbmV3X3J1bnRpbWVfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NTY3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL25ld19ydW50aW1lX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL25ld190ZXN0X3dpei5wbmcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL25ld190ZXN0X3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Yzg3NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9uZXdfdGVzdF93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTQwZjI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SmF2YSBTZXJ2ZXIgVUkgU3VwcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLWNsYXNzcGF0aENvbnRhaW5lcj1TZXJ2ZXIgUnVudGltZQotCi1jYWN0dXNKVW5pdENsaWVudD1KVW5pdCBDbGllbnQKLWNhY3R1c1NlcnZsZXRUZXN0Q2FzZT1TZXJ2bGV0IFRlc3QgQ2FzZQotY2FjdHVzUXVpY2tGaXhQcm9jZXNzb3I9Q2FjdHVzIFF1aWNrIEZpeCBQcm9jZXNzb3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjIxNDc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotICAgICA8aW1hZ2UKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIiCi0gICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamF2YV9qYXIuZ2lmIi8+Ci0gICAgIDxpbWFnZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWIiCi0gICAgICAgIHR5cGVJZHM9ImpzdC53ZWIiCi0gICAgICAgIGljb249Imljb25zL29iajE2L3dlYl9tb2R1bGUuZ2lmIi8+Ci0gICAgIDxpbWFnZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5lamIiCi0gICAgICAgIHR5cGVJZHM9ImpzdC5lamIiCi0gICAgICAgIGljb249Imljb25zL29iajE2L2VqYl9tb2R1bGUuZ2lmIi8+Ci0gICAgIDxpbWFnZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5lYXIiCi0gICAgICAgIHR5cGVJZHM9ImpzdC5lYXIiCi0gICAgICAgIGljb249Imljb25zL29iajE2L2Vhci5naWYiLz4KLSAgICAgPGltYWdlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmFwcGNsaWVudCIKLSAgICAgICAgdHlwZUlkcz0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvYXBwY2xpZW50X21vZHVsZS5naWYiLz4KLSAgICAgPGltYWdlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvbm5lY3RvciIKLSAgICAgICAgdHlwZUlkcz0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamF2YV9qYXIuZ2lmIi8+Ci0gICAgIDxpbWFnZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51dGlsaXR5IgotICAgICAgICB0eXBlSWRzPSJqc3QudXRpbGl0eSIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamF2YV9qYXIuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkRnJhZ21lbnRzIj4KLSAgICAgPGZyYWdtZW50Ci0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiCi0gICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuR2VuZXJpY1J1bnRpbWVXaXphcmRGcmFnbWVudCIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuY2xpZW50cyI+Ci0gICAgIDxjbGllbnQKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY2FjdHVzLmNsaWVudCIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY2FjdHVzLkpVbml0Q2xpZW50RGVsZWdhdGUiCi0gICAgICAgIGxhdW5jaGFibGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY2FjdHVzLmxhdW5jaGFibGUiCi0gICAgICAgIG5hbWU9IiVjYWN0dXNKVW5pdENsaWVudCIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgPHdpemFyZAotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5jYWN0dXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkIgotICAgICAgICBjYW5GaW5pc2hFYXJseT0iZmFsc2UiCi0gICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qZHQudWkuamF2YS9vcmcuZWNsaXBzZS5qZHQuanVuaXQiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLmNhY3R1cy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmQiCi0gICAgICAgIGhhc1BhZ2VzPSJ0cnVlIgotICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9uZXdfdGVzdGNhc2UuZ2lmIgotICAgICAgICBuYW1lPSIlY2FjdHVzU2VydmxldFRlc3RDYXNlIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgIDxpbWFnZSBydW50aW1lLWNvbXBvbmVudC10eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiCi0gICAgICAgcGF0aD0iaWNvbnMvb2JqMTYvamF2YV9qYXIuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5jbGFzc3BhdGhDb250YWluZXJQYWdlIj4KLSAgICA8Y2xhc3NwYXRoQ29udGFpbmVyUGFnZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuY29udGFpbmVyIgotICAgICAgIG5hbWU9IiVjbGFzc3BhdGhDb250YWluZXIiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSI+Ci0gICAgPC9jbGFzc3BhdGhDb250YWluZXJQYWdlPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIvPgotICAgICAgPGZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuRmFjZXRSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgICAgPHR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIiLz4KLSAgICA8L2FkYXB0ZXI+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5xdWlja0ZpeFByb2Nlc3NvcnMiPgotICAgIDxxdWlja0ZpeFByb2Nlc3NvcgotICAgICAgIG5hbWU9IiVjYWN0dXNRdWlja0ZpeFByb2Nlc3NvciIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5jYWN0dXMuQ2FjdHVzUXVpY2tGaXhQcm9jZXNzb3IiCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY2FjdHVzLkNhY3R1c1F1aWNrRml4UHJvY2Vzc29yIj4KLSAgICA8L3F1aWNrRml4UHJvY2Vzc29yPgotICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJjMGVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDsKLS8qKgotICogQ29udGV4dCBoZWxwIGlkIGNvbnN0YW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZXh0SWRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX0NPTVBPU0lURSA9IEphdmFTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmp2cnQwMDAwIjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9HZW5lcmljUnVudGltZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0dlbmVyaWNSdW50aW1lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MWIyYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0dlbmVyaWNSdW50aW1lQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5HZW5lcmljUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLS8qKgotICogV2l6YXJkIHBhZ2UgdG8gc2V0IHRoZSBzZXJ2ZXIgaW5zdGFsbCBkaXJlY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUnVudGltZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTEVEX0pSRV9QUkVGRVJFTkNFX1BBR0VfSUQgPSAib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLnByZWZlcmVuY2VzLlZNUHJlZmVyZW5jZVBhZ2UiOwotCXByb3RlY3RlZCBJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXQzsKLQlwcm90ZWN0ZWQgSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZTsKLQkKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0JCi0JcHJvdGVjdGVkIFRleHQgbmFtZTsKLQlwcm90ZWN0ZWQgVGV4dCBpbnN0YWxsRGlyOwotCXByb3RlY3RlZCBDb21ibyBjb21ibzsKLQlwcm90ZWN0ZWQgTGlzdDxJVk1JbnN0YWxsPiBpbnN0YWxsZWRKUkVzOwotCXByb3RlY3RlZCBTdHJpbmdbXSBqcmVOYW1lczsKLQotCS8qKgotCSAqIEdlbmVyaWNSdW50aW1lQ29tcG9zaXRlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEdlbmVyaWNSdW50aW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkJCi0JCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy5ydW50aW1lVHlwZVRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnJ1bnRpbWVUeXBlRGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWl9SVU5USU1FX1RZUEUpKTsKLQkJCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSdW50aW1lKElSdW50aW1lV29ya2luZ0NvcHkgbmV3UnVudGltZSkgewotCQlpZiAobmV3UnVudGltZSA9PSBudWxsKSB7Ci0JCQlydW50aW1lV0MgPSBudWxsOwotCQkJcnVudGltZSA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlydW50aW1lV0MgPSBuZXdSdW50aW1lOwotCQkJcnVudGltZSA9IChJR2VuZXJpY1J1bnRpbWVXb3JraW5nQ29weSkgbmV3UnVudGltZS5sb2FkQWRhcHRlcihJR2VuZXJpY1J1bnRpbWVXb3JraW5nQ29weS5jbGFzcywgbnVsbCk7Ci0JCX0KLQkJCi0JCWluaXQoKTsKLQkJdmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlIGEgd2l6YXJkIHBhZ2UgdG8gY2hhbmdlIHRoZSByb290IGRpcmVjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuUlVOVElNRV9DT01QT1NJVEUpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnJ1bnRpbWVUeXBlTmFtZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQluYW1lID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbmFtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQluYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXJ1bnRpbWVXQy5zZXROYW1lKG5hbWUuZ2V0VGV4dCgpKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnJ1bnRpbWVUeXBlTG9jYXRpb24pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCQlpbnN0YWxsRGlyID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJaW5zdGFsbERpci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlpbnN0YWxsRGlyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXJ1bnRpbWVXQy5zZXRMb2NhdGlvbihuZXcgUGF0aChpbnN0YWxsRGlyLmdldFRleHQoKSkpOwotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQotCQlCdXR0b24gYnJvd3NlID0gU1dUVXRpbC5jcmVhdGVCdXR0b24odGhpcywgTWVzc2FnZXMuYnJvd3NlKTsKLQkJYnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhHZW5lcmljUnVudGltZUNvbXBvc2l0ZS50aGlzLmdldFNoZWxsKCkpOwotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLnJ1bnRpbWVUeXBlU2VsZWN0TG9jYXRpb24pOwotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGluc3RhbGxEaXIuZ2V0VGV4dCgpKTsKLQkJCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKQotCQkJCQlpbnN0YWxsRGlyLnNldFRleHQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCQkJfQotCQl9KTsKLQkJCi0JCXVwZGF0ZUpSRXMoKTsKLQkJCi0JCS8vIEpESyBsb2NhdGlvbgotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucnVudGltZVR5cGVKUkUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJY29tYm8gPSBuZXcgQ29tYm8odGhpcywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQljb21iby5zZXRJdGVtcyhqcmVOYW1lcyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgc2VsID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IG51bGw7Ci0JCQkJaWYgKHNlbCA+IDApCi0JCQkJCXZtSW5zdGFsbCA9IGluc3RhbGxlZEpSRXMuZ2V0KHNlbCAtIDEpOwotCQkJCQotCQkJCXJ1bnRpbWUuc2V0Vk1JbnN0YWxsKHZtSW5zdGFsbCk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gYnV0dG9uID0gU1dUVXRpbC5jcmVhdGVCdXR0b24odGhpcywgTWVzc2FnZXMucnVudGltZVR5cGVJbnN0YWxsZWRKUkVzKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyBjdXJyZW50Vk0gPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKHNob3dQcmVmZXJlbmNlUGFnZSgpKSB7Ci0JCQkJCXVwZGF0ZUpSRXMoKTsKLQkJCQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQkJCQljb21iby5zZXRUZXh0KGN1cnJlbnRWTSk7Ci0JCQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IC0xKQotCQkJCQkJY29tYm8uc2VsZWN0KDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlpbml0KCk7Ci0JCXZhbGlkYXRlKCk7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKLQotCQluYW1lLmZvcmNlRm9jdXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSlJFcygpIHsKLQkJLy8gZ2V0IGFsbCBpbnN0YWxsZWQgSlZNcwotCQlpbnN0YWxsZWRKUkVzID0gbmV3IEFycmF5TGlzdDxJVk1JbnN0YWxsPigpOwotCQlJVk1JbnN0YWxsVHlwZVtdIHZtSW5zdGFsbFR5cGVzID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZXMoKTsKLQkJZm9yIChJVk1JbnN0YWxsVHlwZSB2aXQgOiB2bUluc3RhbGxUeXBlcykgewotCQkJSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSB2aXQuZ2V0Vk1JbnN0YWxscygpOwotCQkJZm9yIChJVk1JbnN0YWxsIHZtSW5zdGFsbCA6IHZtSW5zdGFsbHMpCi0JCQkJaW5zdGFsbGVkSlJFcy5hZGQodm1JbnN0YWxsKTsKLQkJfQotCQkKLQkJLy8gZ2V0IG5hbWVzCi0JCWludCBzaXplID0gaW5zdGFsbGVkSlJFcy5zaXplKCk7Ci0JCWpyZU5hbWVzID0gbmV3IFN0cmluZ1tzaXplKzFdOwotCQlqcmVOYW1lc1swXSA9IE1lc3NhZ2VzLnJ1bnRpbWVUeXBlRGVmYXVsdEpSRTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gaW5zdGFsbGVkSlJFcy5nZXQoaSk7Ci0JCQlqcmVOYW1lc1tpKzFdID0gdm1JbnN0YWxsLmdldE5hbWUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQcmVmZXJlbmNlUGFnZSgpIHsKLQkJU3RyaW5nIGlkID0gIm9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5wcmVmZXJlbmNlcy5WTVByZWZlcmVuY2VQYWdlIjsKLQkJCi0JCS8vIHNob3VsZCBiZSB1c2luZyB0aGUgZm9sbG93aW5nIEFQSSwgYnV0IGl0IG9ubHkgYWxsb3dzIGEgc2luZ2xlIHByZWZlcmVuY2UgcGFnZSBpbnN0YW5jZS4KLQkJLy8gc2VlIGJ1ZyAxNjgyMTEgZm9yIGRldGFpbHMKLQkJLy9QcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgaWQsIG5ldyBTdHJpbmdbXSB7IGlkIH0sIG51bGwpOwotCQkvL3JldHVybiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spOwkJCi0JCQotCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IG1hbmFnZXIuZmluZCgib3JnLmVjbGlwc2UuamR0LnVpLnByZWZlcmVuY2VzLkphdmFCYXNlUHJlZmVyZW5jZVBhZ2UiKS5maW5kU3ViTm9kZShpZCk7Ci0JCVByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIyID0gbmV3IFByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCW1hbmFnZXIyLmFkZFRvUm9vdChub2RlKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhnZXRTaGVsbCgpLCBtYW5hZ2VyMik7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJcmV0dXJuIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJaWYgKGluc3RhbGxEaXIgPT0gbnVsbCB8fCBydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQluYW1lLnNldFRleHQocnVudGltZVdDLmdldE5hbWUoKSk7Ci0JCQotCQlpZiAocnVudGltZVdDLmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLQkJCWluc3RhbGxEaXIuc2V0VGV4dChydW50aW1lV0MuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQllbHNlCi0JCQlpbnN0YWxsRGlyLnNldFRleHQoIiIpOwotCQkKLQkJLy8gc2V0IHNlbGVjdGlvbgotCQlpZiAoKChHZW5lcmljUnVudGltZSlydW50aW1lKS5pc1VzaW5nRGVmYXVsdEpSRSgpKQotCQkJY29tYm8uc2VsZWN0KDApOwotCQllbHNlIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWludCBzaXplID0gaW5zdGFsbGVkSlJFcy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gaW5zdGFsbGVkSlJFcy5nZXQoaSk7Ci0JCQkJaWYgKHZtSW5zdGFsbC5lcXVhbHMocnVudGltZS5nZXRWTUluc3RhbGwoKSkpIHsKLQkJCQkJY29tYm8uc2VsZWN0KGkgKyAxKTsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpCi0JCQkJY29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpIHsKLQkJCXdpemFyZC5zZXRNZXNzYWdlKCIiLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdGF0dXMgc3RhdHVzID0gcnVudGltZVdDLnZhbGlkYXRlKG51bGwpOwotCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmlzT0soKSkKLQkJCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCWVsc2UKLQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9HZW5lcmljUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGE3NDcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9HZW5lcmljUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1J1bnRpbWVXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQlwcm90ZWN0ZWQgR2VuZXJpY1J1bnRpbWVDb21wb3NpdGUgY29tcDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZnJhZ21lbnQuCi0JICovCi0JcHVibGljIEdlbmVyaWNSdW50aW1lV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFdpemFyZEZyYWdtZW50I2hhc0NvbXBvc2l0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFdpemFyZEZyYWdtZW50I2NyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUsIElXaXphcmRIYW5kbGUpCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJY29tcCA9IG5ldyBHZW5lcmljUnVudGltZUNvbXBvc2l0ZShwYXJlbnQsIHdpemFyZCk7Ci0JCXJldHVybiBjb21wOwotCX0KLQotCS8qKgotCSAqIEBzZWUgV2l6YXJkRnJhZ21lbnQjaXNDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJCi0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlTdGF0dXMgc3RhdHVzID0gcnVudGltZS52YWxpZGF0ZShudWxsKTsKLQkJcmV0dXJuIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuaXNPSygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFdpemFyZEZyYWdtZW50I2VudGVyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnRlcigpIHsKLQkJaWYgKGNvbXAgIT0gbnVsbCkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJCWNvbXAuc2V0UnVudGltZShydW50aW1lKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9JbWFnZVJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvSW1hZ2VSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWVlZGRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9JbWFnZVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gaGFuZGxlIGltYWdlIHJlc291cmNlcy4KLSAqLwotcHVibGljIGNsYXNzIEltYWdlUmVzb3VyY2UgewotCS8vIHRoZSBpbWFnZSByZWdpc3RyeQotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeTsKLQotCS8vIG1hcCBvZiBpbWFnZSBkZXNjcmlwdG9ycyBzaW5jZSB0aGVzZQotCS8vIHdpbGwgYmUgbG9zdCBieSB0aGUgaW1hZ2UgcmVnaXN0cnkKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJbWFnZURlc2NyaXB0b3I+IGltYWdlRGVzY3JpcHRvcnM7Ci0KLQkvLyBiYXNlIHVybHMgZm9yIGltYWdlcwotCXByaXZhdGUgc3RhdGljIFVSTCBJQ09OX0JBU0VfVVJMOwotCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwYXRoU3VmZml4ID0gImljb25zLyI7Ci0JCQlJQ09OX0JBU0VfVVJMID0gSmF2YVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aFN1ZmZpeCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2V0IGljb24gYmFzZSBVUkwiLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfV0laQkFOID0gIndpemJhbi8iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWl9SVU5USU1FX1RZUEUgPSAid2l6X3J1bnRpbWVUeXBlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laX0NBQ1RVU19URVNUID0gIndpel9jYWN0dXNfdGVzdCI7Ci0KLQkvKioKLQkgKiBDYW5ub3QgY29uc3RydWN0IGFuIEltYWdlUmVzb3VyY2UuIFVzZSBzdGF0aWMgbWV0aG9kcyBvbmx5LgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZXNvdXJjZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpCi0JCQlpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpOwotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9ycy5nZXQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBpbWFnZSByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCkgewotCQlpbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsKLQkJaW1hZ2VEZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPigpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShJTUdfV0laX1JVTlRJTUVfVFlQRSwgVVJMX1dJWkJBTiArICJuZXdfcnVudGltZV93aXoucG5nIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1dJWl9DQUNUVVNfVEVTVCwgVVJMX1dJWkJBTiArICJuZXdfdGVzdF93aXoucG5nIik7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYW4gaW1hZ2Ugd2l0aCB0aGUgcmVnaXN0cnkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGFydGlhbFVSTCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWdpc3RlckltYWdlKFN0cmluZyBrZXksIFN0cmluZyBwYXJ0aWFsVVJMKSB7Ci0JCXRyeSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXcgVVJMKElDT05fQkFTRV9VUkwsIHBhcnRpYWxVUkwpKTsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgaWQpOwotCQkJaW1hZ2VEZXNjcmlwdG9ycy5wdXQoa2V5LCBpZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgcmVnaXN0ZXJpbmcgaW1hZ2UgIiArIGtleSArICIgZnJvbSAiICsgcGFydGlhbFVSTCwgZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0phdmFTZXJ2ZXJVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0phdmFTZXJ2ZXJVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWFmNzY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9KYXZhU2VydmVyVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0vKioKLSAqIFRoZSBtYWluIHNlcnZlciB0b29saW5nIHBsdWdpbiBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIEphdmFTZXJ2ZXJVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8qKgotCSAqIEphdmEgc2VydmVyIFVJIHBsdWdpbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpIjsKLQotCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVNlcnZlclVJUGx1Z2luIHNpbmdsZXRvbjsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgSmF2YVNlcnZlclVJUGx1Z2luLgotCSAqLwotCXB1YmxpYyBKYXZhU2VydmVyVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNpbmdsZXRvbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLkphdmFTZXJ2ZXJVSVBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVNlcnZlclVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGxvZ2dpbmcuCi0JICoKLQkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHQpIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsICJJbnRlcm5hbCBlcnJvciIsIHQpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGl2ZSB3b3JrYmVuY2ggc2hlbGwKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3RpdmUgd29ya2JlbmNoIHNoZWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrQmVuY2hXaW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdvcmtCZW5jaFdpbmRvdyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB3b3JrQmVuY2hXaW5kb3cuZ2V0U2hlbGwoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3cKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCUlXb3JrYmVuY2ggd29ya0JlbmNoPSBnZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod29ya0JlbmNoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHdvcmtCZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NiYzVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFRyYW5zbGF0ZWQgbWVzc2FnZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVR5cGVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lVHlwZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUeXBlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lVHlwZUxvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUeXBlU2VsZWN0TG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVR5cGVKUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUeXBlSW5zdGFsbGVkSlJFczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lVHlwZURlZmF1bHRKUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnRlcm5hbENhY3R1czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhDb250YWluZXJEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhDb250YWluZXJSdW50aW1lTGlzdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3RDb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3REZWJ1Z0NvbmZpZ3VyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoVGVzdEFjdGlvbl9tZXNzYWdlX3NlbGVjdFJ1bkNvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2luZG93VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yTWVzc2FnZVRpdGxlTWlzc2luZ0xpYnJhcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yTWVzc2FnZU1pc3NpbmdMaWJyYXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvclRpdGxlTmV3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvclRpdGxlQ3JlYXRlT2ZFbGVtZW50RmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvck1lc3NhZ2VTZWVFcnJvckxvZzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2FybmluZ01lc3NhZ2VTZWxlY3RBV2ViUHJvamVjdDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2FybmluZ1RpdGxlV2ViUHJvamVjdFJlcXVpcmVkOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XYXJuaW5nTWVzc2FnZVN1cGVyY2xhc3NJc0VtcHR5OwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XYXJuaW5nTWVzc2FnZVN1cGVyY2xhc3NEb2VzTm90RXhpc3Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dhcm5pbmdNZXNzYWdlU3VwZXJjbGFzc0lzSW50ZXJmYWNlOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XYXJuaW5nTWVzc2FnZVN1cGVyY2xhc3NOb3RTZXJ2bGV0VGVzdENhc2U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlQ291bGRudEluc3RhbGxMaWJyYXJpZXM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlQ2FjdHVzQnVuZGxlTm90Rm91bmQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlRGVzdERpck5vdEZvdW5kOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY3R1c0FkZExpYnJhcmllc1Byb3Bvc2FsX0Vycm9yTWVzc2FnZUluc3RhbGxhdGlvbk9mTGlic0ZhaWxlZDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VJbnN0YWxsRGlyTm90Rm91bmQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfQWRkaXRpb25hbEluZm9BZGRDYWN0dXNMaWJyYXJpZXM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRGlzcGxheVN0cmluZ0FkZENhY3R1c0xpYnM7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGUxOTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1ydW50aW1lVHlwZVRpdGxlPUdlbmVyaWMgSjJFRSBSdW50aW1lCi1ydW50aW1lVHlwZURlc2NyaXB0aW9uPURlZmluZSBhIGdlbmVyaWMgSjJFRSBydW50aW1lLiBTcGVjaWZ5IGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgamFyIGZpbGVzIHRvIGNvbXBpbGUgYWdhaW5zdC4KLXJ1bnRpbWVUeXBlTmFtZT1OYSZtZToKLXJ1bnRpbWVUeXBlTG9jYXRpb249JkxvY2F0aW9uOgotYnJvd3NlPUImcm93c2UuLi4KLXJ1bnRpbWVUeXBlU2VsZWN0TG9jYXRpb249U2VsZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcnVudGltZS4KLXJ1bnRpbWVUeXBlSlJFPSZKUkU6Ci1ydW50aW1lVHlwZURlZmF1bHRKUkU9V29ya2JlbmNoIGRlZmF1bHQgSlJFCi1ydW50aW1lVHlwZUluc3RhbGxlZEpSRXM9SW4mc3RhbGxlZCBKUkVzLi4uCi0KLWNsYXNzcGF0aENvbnRhaW5lcj1TZXJ2ZXIgTGlicmFyeQotY2xhc3NwYXRoQ29udGFpbmVyRGVzY3JpcHRpb249U2VsZWN0IGEgc2VydmVyIHJ1bnRpbWUgdG8gYWRkIHRvIHRoZSBjbGFzc3BhdGgKLWNsYXNzcGF0aENvbnRhaW5lclJ1bnRpbWVMaXN0PVNlbGVjdCBhICZydW50aW1lIHRvIGFkZCB0byB0aGUgY2xhc3NwYXRoOgotCi1lcnJvckludGVybmFsQ2FjdHVzPUludGVybmFsIGVycm9yIHdoaWxlIGF0dGVtcHRpbmcgdG8gbGF1bmNoIENhY3R1cwotCi1MYXVuY2hUZXN0QWN0aW9uX21lc3NhZ2Vfc2VsZWN0Q29uZmlndXJhdGlvbj1TZWxlY3QgYSBUZXN0IENvbmZpZ3VyYXRpb24KLUxhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3REZWJ1Z0NvbmZpZ3VyYXRpb249U2VsZWN0IEpVbml0IGNvbmZpZ3VyYXRpb24gdG8gZGVidWcKLUxhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3RSdW5Db25maWd1cmF0aW9uPVNlbGVjdCBKVW5pdCBjb25maWd1cmF0aW9uIHRvIHJ1bgotCi1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2luZG93VGl0bGU9TmV3IENhY3R1cyBUZXN0IENhc2UKLU5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvck1lc3NhZ2VUaXRsZU1pc3NpbmdMaWJyYXJ5PU1pc3NpbmcgbGlicmFyeQotTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yTWVzc2FnZU1pc3NpbmdMaWJyYXJ5PVlvdSBhcmUgbWlzc2luZyBjYWN0dXMgZGVwZW5kZW5jaWVzIGluIHlvdXIgd2ViIHByb2plY3QuIFdvdWxkIHlvdSBsaWtlIHRvIGluc3RhbGwgdGhlbT8KLU5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvclRpdGxlTmV3PU5ldwotTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yVGl0bGVDcmVhdGVPZkVsZW1lbnRGYWlsZWQ9Q3JlYXRpb24gb2YgZWxlbWVudCBmYWlsZWQuCi1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JNZXNzYWdlU2VlRXJyb3JMb2c9U2VlIGVycm9yIGxvZyBmb3IgbW9yZSBkZXRhaWxzLgotTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dhcm5pbmdNZXNzYWdlU2VsZWN0QVdlYlByb2plY3Q9V2FybmluZzogQ2FjdHVzIGxpYnJhcmllcyBjYW4gb25seSBiZSBpbnN0YWxsZWQgaW4gYSB3ZWIgcHJvamVjdC4gUGxlYXNlIHNlbGVjdCBhIHdlYiBwcm9qZWN0LgotTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dhcm5pbmdUaXRsZVdlYlByb2plY3RSZXF1aXJlZD1XZWIgcHJvamVjdCByZXF1aXJlZC4KLU5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XYXJuaW5nTWVzc2FnZVN1cGVyY2xhc3NJc0VtcHR5PVN1cGVyY2xhc3MgaXMgZW1wdHkuCi1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2FybmluZ01lc3NhZ2VTdXBlcmNsYXNzRG9lc05vdEV4aXN0PVN1cGVyY2xhc3MgZG9lcyBub3QgZXhpc3QuCi1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2FybmluZ01lc3NhZ2VTdXBlcmNsYXNzSXNJbnRlcmZhY2U9U3VwZXJjbGFzcyBpcyBpbnRlcmZhY2UuCi1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2FybmluZ01lc3NhZ2VTdXBlcmNsYXNzTm90U2VydmxldFRlc3RDYXNlPVN1cGVyY2xhc3MgZG9lcyBub3QgZXh0ZW5kcyBvcmcuYXBhY2hlLmNhY3R1cy5TZXJ2bGV0VGVzdENhc2UuCi1DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VDb3VsZG50SW5zdGFsbExpYnJhcmllcz1Db3VsZG4ndCBpbnN0YWxsIGxpYnJhcmllcwotQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlQ2FjdHVzQnVuZGxlTm90Rm91bmQ9Q2FjdHVzIGJ1bmRsZSBjb3VsZCBub3QgYmUgZm91bmQuCi1DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VEZXN0RGlyTm90Rm91bmQ9RGVzdGluYXRpb24gZm9sZGVyIGRpZCBub3QgZXhpc3QuCi1DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VJbnN0YWxsYXRpb25PZkxpYnNGYWlsZWQ9SW5zdGFsbGF0aW9uIG9mIGxpYnJhcmllcyBmYWlsZWQuCi1DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VJbnN0YWxsRGlyTm90Rm91bmQ9Q2FjdHVzIGluc3RhbGwgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBmb3VuZAotQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfQWRkaXRpb25hbEluZm9BZGRDYWN0dXNMaWJyYXJpZXM9QWRkIHRoZSBDYWN0dXMgbGlicmFyaWVzIHRvIGRvIHRoZSBXRUItSU5GL2xpYiBkaXJlY3RvcnkKLUNhY3R1c0FkZExpYnJhcmllc1Byb3Bvc2FsX0Rpc3BsYXlTdHJpbmdBZGRDYWN0dXNMaWJzPUFkZCBDYWN0dXMgTGlicmFyaWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUnVudGltZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWJlMWMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBTdXBwb3J0IGZvciBhbGwgc2VydmVyIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5JUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXI7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUnVudGltZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIgewotCXByaXZhdGUgZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmM7Ci0KLQlwdWJsaWMgUnVudGltZUxhYmVsUHJvdmlkZXIoZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmMpIHsKLQkJdGhpcy5yYyA9IHJjOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiByYy5nZXRQcm9wZXJ0eSgidHlwZSIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQURBUFRFUl9UWVBFUyA9IHsgSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyLmNsYXNzIH07Ci0KLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCQlmaW5hbCBJUnVudGltZUNvbXBvbmVudCByYyA9IChJUnVudGltZUNvbXBvbmVudCkgYWRhcHRhYmxlOwotCQkJcmV0dXJuIG5ldyBSdW50aW1lTGFiZWxQcm92aWRlcihyYyk7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJCXJldHVybiBBREFQVEVSX1RZUEVTOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTI5NjAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0vKioKLSAqIFNXVCBVdGlsaXR5IGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKENvbnRyb2wgdGVzdENvbnRyb2wpIHsKLQkJLy8gQ29tcHV0ZSBhbmQgc3RvcmUgYSBmb250IG1ldHJpYwotCQlHQyBnYyA9IG5ldyBHQyh0ZXN0Q29udHJvbCk7Ci0JCWdjLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJZm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHdpZHRoIGhpbnQgZm9yIGEgYnV0dG9uIGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0QnV0dG9uV2lkdGhIaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJaW50IHdpZHRoSGludCA9IERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYnV0dG9uIHdpdGggdGhlIHN0YW5kYXJkIHNpemUuCi0JICogCi0JICogQHBhcmFtIGNvbXAgdGhlIGNvbXBvbmVudCB0byBhZGQgdGhlIGJ1dHRvbiB0bwotCSAqIEBwYXJhbSBsYWJlbCB0aGUgYnV0dG9uIGxhYmVsCi0JICogQHJldHVybiBhIGJ1dHRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29tcCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dChsYWJlbCk7Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXApOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGIpOwotCQliLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBiOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWUwYjkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5JQ2xhc3NwYXRoQ29udGFpbmVyUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLkphdmFTZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5SdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBJQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSB7Ci0JcHJvdGVjdGVkIElDbGFzc3BhdGhFbnRyeSBzZWxlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgTWFwPElSdW50aW1lLCBJQ2xhc3NwYXRoRW50cnk+IHJ1bnRpbWVNYXAgPSBuZXcgSGFzaE1hcDxJUnVudGltZSwgSUNsYXNzcGF0aEVudHJ5PigpOwotCi0JcHVibGljIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclBhZ2UoKSB7Ci0JCXN1cGVyKCJzZXJ2ZXIuY29udGFpbmVyIik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpfUlVOVElNRV9UWVBFKSk7Ci0JCXNldFRpdGxlKE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lcik7Ci0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lckRlc2NyaXB0aW9uKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCi0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWZvciAoSVJ1bnRpbWUgcnVudGltZSA6IHJ1bnRpbWVzKSB7Ci0JCQlpZiAocnVudGltZS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwpIHsKLQkJCQlSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIHJjcHcgPSBKYXZhU2VydmVyUGx1Z2luLmZpbmRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIocnVudGltZS5nZXRSdW50aW1lVHlwZSgpKTsKLQkJCQlpZiAocmNwdyAhPSBudWxsKSB7Ci0JCQkJCUlQYXRoIHNlcnZlckNvbnRhaW5lclBhdGggPSBuZXcgUGF0aChSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyLlNFUlZFUl9DT05UQUlORVIpCi0JCQkJCQkJLmFwcGVuZChyY3B3LmdldElkKCkpLmFwcGVuZChydW50aW1lLmdldElkKCkpOwotCQkJCQlydW50aW1lTWFwLnB1dChydW50aW1lLCBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShzZXJ2ZXJDb250YWluZXJQYXRoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSUNsYXNzcGF0aEVudHJ5IGNvbnRhaW5lckVudHJ5KSB7Ci0JCXNlbGVjdGlvbiA9IGNvbnRhaW5lckVudHJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lclJ1bnRpbWVMaXN0KTsKLQkJCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQkJCi0JCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJT2JqZWN0W10gb2JqID0gcnVudGltZU1hcC5rZXlTZXQoKS50b0FycmF5KCk7IAotCQkJCXJldHVybiBvYmo7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9KTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUnVudGltZVRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoInJvb3QiKTsKLQkJCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJc2VsZWN0aW9uID0gcnVudGltZU1hcC5nZXQoc2VsLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCWlmICh0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpICE9IDApCi0JCQl0YWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldEZvY3VzKCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVHJhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjU0ZjgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05GSUcgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VWRVJFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVNUID0gMzsKLQotCS8qKgotCSAqIFRyYWNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBUcmFjZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCBhIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzKSB7Ci0JCVRyYWNlLnRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCBhIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmIChsZXZlbCA9PSBTRVZFUkUpCi0JCQlKYXZhU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBzLCB0KSk7Ci0JCQotCQlpZiAoIUphdmFTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oSmF2YVNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIgIiArIHMpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL2NhY3R1cy9DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL2NhY3R1cy9DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODVhN2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLmNhY3R1czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5KYXZhU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIENhY3R1c0FkZExpYnJhcmllc1Byb3Bvc2FsIGltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgewotCXByaXZhdGUgZmluYWwgSUludm9jYXRpb25Db250ZXh0IGZDb250ZXh0OwotCi0JcHVibGljIENhY3R1c0FkZExpYnJhcmllc1Byb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCWZDb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFJlbGV2YW5jZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlDb21waWxhdGlvblVuaXQgamF2YUZpbGUgPSBmQ29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaW5zdGFsbExpYnJhcmllcyhqYXZhRmlsZS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGxMaWJyYXJpZXMoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmFwYWNoZS5jYWN0dXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQkJc2hvd0luc3RhbGxGYWlsZWREaWFsb2coTWVzc2FnZXMuQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlQ2FjdHVzQnVuZGxlTm90Rm91bmQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCVVSTCBjYWN0dXNMaWJEaXIgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgbmV3IFBhdGgoImxpYiIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGNhY3R1c0xpYkRpciA9PSBudWxsKSB7Ci0JCQkJc2hvd0luc3RhbGxGYWlsZWREaWFsb2coTWVzc2FnZXMuQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlSW5zdGFsbERpck5vdEZvdW5kKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlVUkwgbG9jYWxVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoY2FjdHVzTGliRGlyKTsKLQkJCWZpbmFsIEZpbGUgc291cmNlRGlyZWN0b3J5ID0gbmV3IEZpbGUobG9jYWxVUkwuZ2V0UGF0aCgpKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJSVZpcnR1YWxGb2xkZXIgdmYgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcigiV0VCLUlORi9saWIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmluYWwgSUNvbnRhaW5lciBkZXN0aW5hdGlvbkRpcmVjdG9yeSA9IHZmLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQotCQkJSUZvbGRlciBkZXN0aW5hdGlvbkZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKGRlc3RpbmF0aW9uRGlyZWN0b3J5Ci0JCQkJCS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCi0JCQlpZiAoZGVzdGluYXRpb25Gb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQlGaWxlW10gZmlsZXNUb0NvcHkgPSBzb3VyY2VEaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCQkJU3RyaW5nW10gZmlsZXNUb0NvcHlOYW1lcyA9IG5ldyBTdHJpbmdbZmlsZXNUb0NvcHkubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzVG9Db3B5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZpbGVzVG9Db3B5TmFtZXNbaV0gPSBmaWxlc1RvQ29weVtpXS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9Ci0JCQkJQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgQ29weUZpbGVzQW5kRm9sZGVyc09wZXJhdGlvbigKLQkJCQkJCUphdmFTZXJ2ZXJVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpKTsKLQkJCQlvcGVyYXRpb24uY29weUZpbGVzKGZpbGVzVG9Db3B5TmFtZXMsIGRlc3RpbmF0aW9uRm9sZGVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2hvd0luc3RhbGxGYWlsZWREaWFsb2coTWVzc2FnZXMuQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRXJyb3JNZXNzYWdlRGVzdERpck5vdEZvdW5kKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUphdmFTZXJ2ZXJVSVBsdWdpbi5sb2coZSk7Ci0JCQlzaG93SW5zdGFsbEZhaWxlZERpYWxvZyhNZXNzYWdlcy5DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VJbnN0YWxsYXRpb25PZkxpYnNGYWlsZWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzaG93SW5zdGFsbEZhaWxlZERpYWxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihKYXZhU2VydmVyVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQlNZXNzYWdlcy5DYWN0dXNBZGRMaWJyYXJpZXNQcm9wb3NhbF9FcnJvck1lc3NhZ2VDb3VsZG50SW5zdGFsbExpYnJhcmllcywKLQkJCQltZXNzYWdlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIFBvaW50IGdldFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBQb2ludChmQ29udGV4dC5nZXRTZWxlY3Rpb25PZmZzZXQoKSwgZkNvbnRleHQuZ2V0U2VsZWN0aW9uTGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLkNhY3R1c0FkZExpYnJhcmllc1Byb3Bvc2FsX0FkZGl0aW9uYWxJbmZvQWRkQ2FjdHVzTGlicmFyaWVzOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWxfRGlzcGxheVN0cmluZ0FkZENhY3R1c0xpYnM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uIGdldENvbnRleHRJbmZvcm1hdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzUXVpY2tGaXhQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzUXVpY2tGaXhQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1NjA0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY2FjdHVzL0NhY3R1c1F1aWNrRml4UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLmNhY3R1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklQcm9ibGVtTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JUXVpY2tGaXhQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5KYXZhU2VydmVyVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBDYWN0dXNRdWlja0ZpeFByb2Nlc3NvciBpbXBsZW1lbnRzIElRdWlja0ZpeFByb2Nlc3NvciB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb3JyZWN0aW9ucyhJQ29tcGlsYXRpb25Vbml0IHVuaXQsIGludCBwcm9ibGVtSWQpIHsKLQkJcmV0dXJuIElQcm9ibGVtLkltcG9ydE5vdEZvdW5kID09IHByb2JsZW1JZDsKLQl9Ci0KLQlwdWJsaWMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRDb3JyZWN0aW9ucyhJSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCUlQcm9ibGVtTG9jYXRpb25bXSBsb2NhdGlvbnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlzQ2FjdHVzUHJvYmxlbShjb250ZXh0LCBsb2NhdGlvbnMpKQotCQkJcmV0dXJuIG5ldyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIHsgbmV3IENhY3R1c0FkZExpYnJhcmllc1Byb3Bvc2FsKGNvbnRleHQpIH07Ci0JCQotCQlyZXR1cm4gbmV3IElKYXZhQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NhY3R1c1Byb2JsZW0oSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb25bXSBsb2NhdGlvbnMpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gY29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9ibGVtTG9jYXRpb24gbG9jYXRpb24gPSBsb2NhdGlvbnNbaV07Ci0JCQl0cnkgewotCQkJCVN0cmluZyBzID0gZ2V0U3RyaW5nVW50aWxXaGl0ZVNwYWNlT3JFbmQobG9jYXRpb24uZ2V0T2Zmc2V0KCksIHVuaXQpOwotCQkJCWlmICgiU2VydmxldFRlc3RDYXNlIi5lcXVhbHMocykgfHwgcy5pbmRleE9mKCJvcmcuYXBhY2hlLmNhY3R1cyIpID49IDApCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKYXZhU2VydmVyVUlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTdHJpbmdVbnRpbFdoaXRlU3BhY2VPckVuZChpbnQgb2Zmc2V0LCBJQ29tcGlsYXRpb25Vbml0IHVuaXQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSUJ1ZmZlciBidWZmZXIgPSB1bml0LmdldEJ1ZmZlcigpOwotCQlpbnQgbGVuZ3RoID0gYnVmZmVyLmdldExlbmd0aCgpOwotCi0JCWZvciAoaW50IGluZGV4ID0gb2Zmc2V0OyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewotCQkJY2hhciBjID0gYnVmZmVyLmdldENoYXIoaW5kZXgpOwotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpCi0JCQkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLQkJCQotCQkJYnVpbGRlci5hcHBlbmQoYyk7Ci0JCX0KLQkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL2NhY3R1cy9KVW5pdENsaWVudERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY2FjdHVzL0pVbml0Q2xpZW50RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjOTQxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY2FjdHVzL0pVbml0Q2xpZW50RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLmNhY3R1czsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1VJVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnTW9kZWxQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LmxhdW5jaGVyLkpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXMuQ2FjdHVzTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLkphdmFTZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkNsaWVudERlbGVnYXRlOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSlVuaXRDbGllbnREZWxlZ2F0ZSBleHRlbmRzIENsaWVudERlbGVnYXRlIHsKLQlwdWJsaWMgSVN0YXR1cyBsYXVuY2goSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBvYmplY3QsIFN0cmluZyBsYXVuY2hNb2RlLCBJTGF1bmNoIGxhdW5jaCkgewotCQlDYWN0dXNMYXVuY2hhYmxlIGxhdW5jaGFibGUgPSAoQ2FjdHVzTGF1bmNoYWJsZSkgb2JqZWN0OwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBmaW5kTGF1bmNoQ29uZmlndXJhdGlvbihsYXVuY2hhYmxlLCBsYXVuY2hNb2RlKTsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgdGVzdE5hbWUgPSBsYXVuY2hhYmxlLmdldFRlc3ROYW1lKCk7Ci0JCQl0ZXN0TmFtZSA9ICIiLmVxdWFscyh0ZXN0TmFtZSkgPyBsYXVuY2hhYmxlLmdldFRlc3RDbGFzc05hbWUoKQotCQkJCQk6IGxhdW5jaGFibGUuZ2V0VGVzdENsYXNzTmFtZSgpICsgIi4iICsgdGVzdE5hbWUgKyAiKCkiOwotCQkJY29uZmlnID0gY3JlYXRlQ29uZmlndXJhdGlvbihsYXVuY2hhYmxlLmdldFByb2plY3ROYW1lKCksIHRlc3ROYW1lLAotCQkJCQlsYXVuY2hhYmxlLmdldFRlc3RDbGFzc05hbWUoKSwgIiIsIGxhdW5jaGFibGUuZ2V0VGVzdE5hbWUoKSk7Ci0JCX0KLQkJCi0JCVVSTCB1cmwgPSBsYXVuY2hhYmxlLmdldENhY3R1c1VSTCgpOwotCQlTdHJpbmcgdXJsU3RyaW5nID0gdXJsLnRvU3RyaW5nKCk7Ci0JCWlmICh1cmxTdHJpbmcuZW5kc1dpdGgoIi8iKSkgewotCQkJdHJ5IHsKLQkJCQl1cmwgPSBuZXcgVVJMKHVybFN0cmluZy5zdWJzdHJpbmcoMCwgdXJsU3RyaW5nLmxlbmd0aCgpIC0gMSkpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBNZXNzYWdlcy5lcnJvckludGVybmFsQ2FjdHVzLCBlKTsKLQkJCX0KLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWZpbmFsIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29weSA9IGNvbmZpZy5nZXRXb3JraW5nQ29weSgpOwotCQkJU3RyaW5nIHZtQXJnczsKLQkJCXZtQXJncyA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fQVJHVU1FTlRTLCAiIik7Ci0JCQljb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9BUkdVTUVOVFMsCi0JCQkJCXZtQXJncyArICIgLURjYWN0dXMuY29udGV4dFVSTD0iICsgdXJsLnRvU3RyaW5nKCkpOwotCQkJY29uZmlnID0gY29weS5kb1NhdmUoKTsKLQkJCURlYnVnVUlUb29scy5sYXVuY2goY29uZmlnLCBsYXVuY2hNb2RlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBNZXNzYWdlcy5lcnJvckludGVybmFsQ2FjdHVzLCBlKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUxhdW5jaENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbihTdHJpbmcgcHJvamVjdE5hbWUsCi0JCQlTdHJpbmcgbmFtZSwgU3RyaW5nIG1haW5UeXBlLCBTdHJpbmcgY29udGFpbmVyLCBTdHJpbmcgdGVzdE5hbWUpIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBjb25maWdUeXBlID0gZ2V0SlVuaXRMYXVuY2hDb25maWdUeXBlKCk7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gY29uZmlnVHlwZS5uZXdJbnN0YW5jZShudWxsLAotCQkJCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpLmdlbmVyYXRlVW5pcXVlTGF1bmNoQ29uZmlndXJhdGlvbk5hbWVGcm9tKG5hbWUpKTsKLQkJCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9NQUlOX1RZUEVfTkFNRSwgbWFpblR5cGUpOwotCQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotCQkJd2Muc2V0QXR0cmlidXRlKEpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0tFRVBSVU5OSU5HLCBmYWxzZSk7Ci0JCQl3Yy5zZXRBdHRyaWJ1dGUoSlVuaXRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVEVTVF9DT05UQUlORVIsIGNvbnRhaW5lcik7Ci0JCQlpZiAodGVzdE5hbWUubGVuZ3RoKCkgPiAwKQotCQkJCXdjLnNldEF0dHJpYnV0ZShKVW5pdExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9URVNUX01FVEhPRF9OQU1FLCB0ZXN0TmFtZSk7Ci0JCQljb25maWcgPSB3Yy5kb1NhdmUoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKYXZhU2VydmVyVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbiBmaW5kTGF1bmNoQ29uZmlndXJhdGlvbihDYWN0dXNMYXVuY2hhYmxlIGxhdW5jaGFibGUsIFN0cmluZyBtb2RlKSB7Ci0JCVN0cmluZyB0ZXN0TmFtZSA9IGxhdW5jaGFibGUuZ2V0VGVzdE5hbWUoKTsKLQkJU3RyaW5nIHRlc3RDbGFzcyA9IGxhdW5jaGFibGUuZ2V0VGVzdENsYXNzTmFtZSgpOwotCQlTdHJpbmcgamF2YVByb2plY3ROYW1lID0gbGF1bmNoYWJsZS5nZXRQcm9qZWN0TmFtZSgpOwotCQlTdHJpbmcgY29udGFpbmVyID0gIiI7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBjb25maWdUeXBlID0gZ2V0SlVuaXRMYXVuY2hDb25maWdUeXBlKCk7Ci0JCUxpc3Q8SUxhdW5jaENvbmZpZ3VyYXRpb24+IGNhbmRpZGF0ZUNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PElMYXVuY2hDb25maWd1cmF0aW9uPigpOwotCQl0cnkgewotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRMYXVuY2hNYW5hZ2VyKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMoY29uZmlnVHlwZSk7Ci0JCQljYW5kaWRhdGVDb25maWdzID0gbmV3IEFycmF5TGlzdDxJTGF1bmNoQ29uZmlndXJhdGlvbj4oY29uZmlncy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlnc1tpXTsKLQkJCQkvLyB3ZSBzaG91bGQgcHJvYmFibHkgZXh0cmFjdCB0aGUgSlVuaXQgaW50ZXJuYWwgc3R1ZmYgYW5kCi0JCQkJLy8gY3JlYXRlIGEgbmV3IENhY3R1c0xhdW5jaENvbmZpZ3VyYXRpb24gaW5zdGVhZAotCQkJCWlmICgoY29uZmlnLmdldEF0dHJpYnV0ZSgKLQkJCQkJCUpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RFU1RfQ09OVEFJTkVSLCAiIikuZXF1YWxzKGNvbnRhaW5lcikpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShjb25maWcuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX01BSU5fVFlQRV9OQU1FLAotCQkJCQkJCQkiIikuZXF1YWxzKHRlc3RDbGFzcykpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShjb25maWcuZ2V0QXR0cmlidXRlKEpVbml0TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RFU1RfTUVUSE9EX05BTUUsICIiKS5lcXVhbHModGVzdE5hbWUpKSAmJiAvLyROT04tTkxTLTEkCi0JCQkJCQkoY29uZmlnLmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsCi0JCQkJCQkJCSIiKS5lcXVhbHMoamF2YVByb2plY3ROYW1lKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQljYW5kaWRhdGVDb25maWdzLmFkZChjb25maWcpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKYXZhU2VydmVyVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCQotCQkvLyBJZiB0aGVyZSBhcmUgbm8gZXhpc3RpbmcgY29uZmlncyBhc3NvY2lhdGVkIHdpdGggdGhlIElUeXBlLCBjcmVhdGUgb25lLgotCQkvLyBJZiB0aGVyZSBpcyBleGFjdGx5IG9uZSBjb25maWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBJVHlwZSwgcmV0dXJuIGl0LgotCQkvLyBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY29uZmlnIGFzc29jaWF0ZWQgd2l0aCB0aGUgSVR5cGUsCi0JCS8vIHByb21wdCB0aGUgdXNlciB0byBjaG9vc2Ugb25lLgotCQlpbnQgY2FuZGlkYXRlQ291bnQgPSBjYW5kaWRhdGVDb25maWdzLnNpemUoKTsKLQkJaWYgKGNhbmRpZGF0ZUNvdW50IDwgMSkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChjYW5kaWRhdGVDb3VudCA9PSAxKQotCQkJcmV0dXJuIGNhbmRpZGF0ZUNvbmZpZ3MuZ2V0KDApOwotCQllbHNlIHsKLQkJCS8vIFByb21wdCB0aGUgdXNlciB0byBjaG9vc2UgYSBjb25maWcuIEEgbnVsbCByZXN1bHQgbWVhbnMgdGhlIHVzZXIKLQkJCS8vIGNhbmNlbGxlZCB0aGUgZGlhbG9nLCBpbiB3aGljaCBjYXNlIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCwKLQkJCS8vIHNpbmNlIGNhbmNlbGxpbmcgdGhlIGRpYWxvZyBzaG91bGQgYWxzbyBjYW5jZWwgbGF1bmNoaW5nIGFueXRoaW5nLgotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gY2hvb3NlQ29uZmlndXJhdGlvbihjYW5kaWRhdGVDb25maWdzLCBtb2RlKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gY29uZmlnOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvbiBjaG9vc2VDb25maWd1cmF0aW9uKExpc3QgY29uZmlnTGlzdCwgU3RyaW5nIG1vZGUpIHsKLQkJSURlYnVnTW9kZWxQcmVzZW50YXRpb24gbGFiZWxQcm92aWRlciA9IERlYnVnVUlUb29scwotCQkJCS5uZXdEZWJ1Z01vZGVsUHJlc2VudGF0aW9uKCk7Ci0JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQlKYXZhU2VydmVyVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgbGFiZWxQcm92aWRlcik7Ci0JCWRpYWxvZy5zZXRFbGVtZW50cyhjb25maWdMaXN0LnRvQXJyYXkoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShNZXNzYWdlcy5MYXVuY2hUZXN0QWN0aW9uX21lc3NhZ2Vfc2VsZWN0Q29uZmlndXJhdGlvbik7Ci0JCWlmIChtb2RlLmVxdWFscyhJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKSkKLQkJCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLkxhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3REZWJ1Z0NvbmZpZ3VyYXRpb24pOwotCQllbHNlCi0JCQlkaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlcy5MYXVuY2hUZXN0QWN0aW9uX21lc3NhZ2Vfc2VsZWN0UnVuQ29uZmlndXJhdGlvbik7Ci0JCQotCQlkaWFsb2cuc2V0TXVsdGlwbGVTZWxlY3Rpb24oZmFsc2UpOwotCQlpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotCQkJcmV0dXJuIChJTGF1bmNoQ29uZmlndXJhdGlvbikgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIGdldEpVbml0TGF1bmNoQ29uZmlnVHlwZSgpIHsKLQkJLy8gbWlnaHQgd2FudCB0byByZXBsYWNlIHRoaXMgd2l0aCBhIGN1c3RvbSBsYXVuY2ggY29uZmlndXJhdGlvbiBpbnN0ZWFkCi0JCUlMYXVuY2hNYW5hZ2VyIGxtID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJcmV0dXJuIGxtLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKCJvcmcuZWNsaXBzZS5qZHQuanVuaXQubGF1bmNoY29uZmlnIik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBsYXVuY2hhYmxlLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlyZXR1cm4gbGF1bmNoYWJsZSBpbnN0YW5jZW9mIENhY3R1c0xhdW5jaGFibGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY2FjdHVzL05ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjZlMDk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhbmllbCBSLiBTb21lcmZpZWxkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5jYWN0dXM7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5qdW5pdC53aXphcmRzLk5ld1Rlc3RDYXNlV2l6YXJkUGFnZU9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuanVuaXQud2l6YXJkcy5OZXdUZXN0Q2FzZVdpemFyZFBhZ2VUd287Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLkphdmFTZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdSZXNvdXJjZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2bGV0VGVzdENhc2VXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJDTEFTU19OQU1FID0gIm9yZy5hcGFjaGUuY2FjdHVzLlNlcnZsZXRUZXN0Q2FzZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ0xBU1NFU19UT19DSEVDSyA9IHsKLQkJCSJvcmcuYXBhY2hlLmNhY3R1cy5TZXJ2bGV0VGVzdENhc2UiLCAianVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIiwgIm9yZy5hc3BlY3RqLmxhbmcuSm9pblBvaW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkib3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cENsaWVudCIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBSRVFVSVJFRF9MSUJSQVJJRVMgPSB7Ci0JCQkiY2FjdHVzLTEuNy4yLmphciIsICJqdW5pdC0zLjguMS5qYXIiLCAiYXNwZWN0anJ0LTEuMi4xLmphciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkiY29tbW9ucy1sb2dnaW5nLTEuMC40LmphciIsICJjb21tb25zLWh0dHBjbGllbnQtMi4wLjIuamFyIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgSVdvcmtiZW5jaCBmV29ya2JlbmNoOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi0JcHJpdmF0ZSBOZXdUZXN0Q2FzZVdpemFyZFBhZ2VUd28gZlBhZ2UyOwotCi0JcHJpdmF0ZSBOZXdUZXN0Q2FzZVdpemFyZFBhZ2VPbmUgZlBhZ2UxOwotCi0JcHVibGljIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dpbmRvd1RpdGxlKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZQotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfV0laX0NBQ1RVU19URVNUKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZXb3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JCWZTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCWZQYWdlMiA9IG5ldyBOZXdUZXN0Q2FzZVdpemFyZFBhZ2VUd28oKTsKLQkJZlBhZ2UxID0gbmV3IENhY3R1c1BhZ2UxKGZQYWdlMik7Ci0JCWFkZFBhZ2UoZlBhZ2UxKTsKLQkJZlBhZ2UxLmluaXQoZ2V0U2VsZWN0aW9uKCkpOwotCQlhZGRQYWdlKGZQYWdlMik7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDYWN0dXNQYWdlMSBleHRlbmRzIE5ld1Rlc3RDYXNlV2l6YXJkUGFnZU9uZSB7Ci0JCXByaXZhdGUgQnV0dG9uIGZCZWdpbkJ1dHRvbjsKLQotCQlwcml2YXRlIEJ1dHRvbiBmRW5kQnV0dG9uOwotCi0JCXByaXZhdGUgQnV0dG9uIGZCZWdpblhYWEJ1dHRvbjsKLQotCQlwcml2YXRlIEJ1dHRvbiBmRW5kWFhYQnV0dG9uOwotCi0JCXByaXZhdGUgQ29tcG9zaXRlIGZDYWN0dXNCdXR0b25Db21wb3NpdGU7Ci0KLQkJcHVibGljIENhY3R1c1BhZ2UxKE5ld1Rlc3RDYXNlV2l6YXJkUGFnZVR3byBwYWdlMikgewotCQkJc3VwZXIocGFnZTIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5pdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCXN1cGVyLmluaXQoc2VsZWN0aW9uKTsKLQkJCXZhbGlkYXRlSWZKVW5pdFByb2plY3QoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQkJc2V0U3VwZXJDbGFzcyhTVVBFUkNMQVNTX05BTUUsIHRydWUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlSlVuaXQ0Q29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IG5Db2x1bW5zKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHN1cGVyQ2xhc3NDaGFuZ2VkKCkgewotCQkJU3RyaW5nIHN1cGVyQ2xhc3NOYW1lID0gZ2V0U3VwZXJDbGFzcygpOwotCQkJaWYgKHN1cGVyQ2xhc3NOYW1lID09IG51bGwgfHwgc3VwZXJDbGFzc05hbWUudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dhcm5pbmdNZXNzYWdlU3VwZXJjbGFzc0lzRW1wdHksIG51bGwpOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0KLQkJCWlmIChzdXBlckNsYXNzTmFtZS5lcXVhbHMoIm9yZy5hcGFjaGUuY2FjdHVzLlNlcnZsZXRUZXN0Q2FzZSIpKSB7Ci0JCQkJLy9TaG9ydC1jaXJjdWl0IGlmIHRoaXMgSVMgU2VydmxldFRlc3RDYXNlCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0KLQkJCWlmIChnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkgIT0gbnVsbCkgewotCQkJCUlUeXBlIHR5cGU7Ci0JCQkJdHJ5IHsKLQkJCQkJdHlwZSA9IHJlc29sdmVDbGFzc05hbWVUb1R5cGUoZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpLmdldEphdmFQcm9qZWN0KCksCi0JCQkJCQkJZ2V0UGFja2FnZUZyYWdtZW50KCksIHN1cGVyQ2xhc3NOYW1lKTsKLQkJCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoCi0JCQkJCQkJCUlTdGF0dXMuV0FSTklORywKLQkJCQkJCQkJSmF2YVNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJSVN0YXR1cy5XQVJOSU5HLAotCQkJCQkJCQlNZXNzYWdlcy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2FybmluZ01lc3NhZ2VTdXBlcmNsYXNzRG9lc05vdEV4aXN0LAotCQkJCQkJCQludWxsKTsKLQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJCX0KLQotCQkJCQlpZiAodHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0JCQkJCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCQkJSVN0YXR1cy5XQVJOSU5HLAotCQkJCQkJCQlKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQkJCU1lc3NhZ2VzLk5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XYXJuaW5nTWVzc2FnZVN1cGVyY2xhc3NJc0ludGVyZmFjZSwKLQkJCQkJCQkJbnVsbCk7Ci0JCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCQl9Ci0KLQkJCQkJSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOwotCQkJCQlJVHlwZVtdIHN1cGVyVHlwZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJjbGFzc2VzKHR5cGUpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChzdXBlclR5cGVzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscygKLQkJCQkJCQkJIm9yZy5hcGFjaGUuY2FjdHVzLlNlcnZsZXRUZXN0Q2FzZSIpKSB7Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQkJSmF2YVNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQkJTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dhcm5pbmdNZXNzYWdlU3VwZXJjbGFzc05vdFNlcnZsZXRUZXN0Q2FzZSwKLQkJCQkJCQludWxsKTsKLQkJCQkJcmV0dXJuIHN0YXR1czsKLQotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUphdmFTZXJ2ZXJVSVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCXByaXZhdGUgSVR5cGUgcmVzb2x2ZUNsYXNzTmFtZVRvVHlwZShJSmF2YVByb2plY3QganByb2plY3QsIElQYWNrYWdlRnJhZ21lbnQgcGFjaywKLQkJCQlTdHJpbmcgY2xhc3NUb1Rlc3ROYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCQkJSVR5cGUgdHlwZSA9IGpwcm9qZWN0LmZpbmRUeXBlKGNsYXNzVG9UZXN0TmFtZSk7Ci0KLQkJCS8vIHNlYXJjaCBpbiBjdXJyZW50IHBhY2thZ2UKLQkJCWlmICh0eXBlID09IG51bGwgJiYgcGFjayAhPSBudWxsICYmICFwYWNrLmlzRGVmYXVsdFBhY2thZ2UoKSkgewotCQkJCXR5cGUgPSBqcHJvamVjdC5maW5kVHlwZShwYWNrLmdldEVsZW1lbnROYW1lKCksIGNsYXNzVG9UZXN0TmFtZSk7Ci0JCQl9Ci0KLQkJCS8vIHNlYXJjaCBpbiBqYXZhLmxhbmcKLQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQl0eXBlID0ganByb2plY3QuZmluZFR5cGUoImphdmEubGFuZyIsIGNsYXNzVG9UZXN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiB0eXBlOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVJZkpVbml0UHJvamVjdCgpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNoZWNrRm9yV2ViUHJvamVjdCgpKSB7Ci0JCQkJCWNoZWNrRm9yQ2FjdHVzTGlicmFyaWVzKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VzLk5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XYXJuaW5nTWVzc2FnZVNlbGVjdEFXZWJQcm9qZWN0OwotCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKGdldFNoZWxsKCksCi0JCQkJCQkJTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dhcm5pbmdUaXRsZVdlYlByb2plY3RSZXF1aXJlZCwKLQkJCQkJCQltc2cpOwotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEphdmFTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwgbXNnLCBudWxsKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLAotCQkJCQkJIkZhaWxlZCB0byBjaGVjayBmb3IgY2FjdHVzIGxpYnJhcmllcy4iLCBlKTsKLQkJCX0KLQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUeXBlTWVtYmVycyhJVHlwZSB0eXBlLCBJbXBvcnRzTWFuYWdlciBpbXBvcnRzLAotCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJc3VwZXIuY3JlYXRlVHlwZU1lbWJlcnModHlwZSwgaW1wb3J0cywgbW9uaXRvcik7Ci0JCQlpZiAoZkJlZ2luQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZ2VuZXJhdGVCZWdpbk1ldGhvZCh0eXBlLCBpbXBvcnRzKTsKLQkJCX0KLQotCQkJaWYgKGZFbmRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlnZW5lcmF0ZUVuZE1ldGhvZCh0eXBlLCBpbXBvcnRzKTsKLQkJCX0KLQotCQkJaWYgKGZCZWdpblhYWEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWdlbmVyYXRlQmVnaW5YWFhNZXRob2RzKHR5cGUsIGltcG9ydHMpOwotCQkJfQotCi0JCQlpZiAoZkVuZFhYWEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWdlbmVyYXRlRW5kWFhYTWV0aG9kcyh0eXBlLCBpbXBvcnRzKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUJlZ2luTWV0aG9kKElUeXBlIHR5cGUsIEltcG9ydHNNYW5hZ2VyIGltcG9ydHMpCi0JCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQlTdHJpbmdCdWZmZXIgbWV0aG9kQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJbWV0aG9kQnVmZmVyLmFwcGVuZCgicHVibGljIHZvaWQgYmVnaW4oIik7IC8vJE5PTi1OTFMtMSQKLQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoaW1wb3J0cy5hZGRJbXBvcnQoIm9yZy5hcGFjaGUuY2FjdHVzLldlYlJlcXVlc3QiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoIiByZXF1ZXN0KSB0aHJvd3MgIik7IC8vJE5PTi1OTFMtMSQKLQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoaW1wb3J0cy5hZGRJbXBvcnQoImphdmEubGFuZy5FeGNlcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoIiB7XG5cblx0fSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHlwZS5jcmVhdGVNZXRob2QobWV0aG9kQnVmZmVyLnRvU3RyaW5nKCksIG51bGwsIGZhbHNlLCBudWxsKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUVuZE1ldGhvZChJVHlwZSB0eXBlLCBJbXBvcnRzTWFuYWdlciBpbXBvcnRzKQotCQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkJU3RyaW5nQnVmZmVyIG1ldGhvZEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoInB1YmxpYyB2b2lkIGVuZCgiKTsgLy8kTk9OLU5MUy0xJAotCQkJbWV0aG9kQnVmZmVyLmFwcGVuZChpbXBvcnRzLmFkZEltcG9ydCgib3JnLmFwYWNoZS5jYWN0dXMuV2ViUmVxdWVzdCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWV0aG9kQnVmZmVyLmFwcGVuZCgiIHJlcXVlc3QpIHRocm93cyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJbWV0aG9kQnVmZmVyLmFwcGVuZChpbXBvcnRzLmFkZEltcG9ydCgiamF2YS5sYW5nLkV4Y2VwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWV0aG9kQnVmZmVyLmFwcGVuZCgiIHtcblxuXHR9ICIpOyAvLyROT04tTkxTLTEkCi0JCQl0eXBlLmNyZWF0ZU1ldGhvZChtZXRob2RCdWZmZXIudG9TdHJpbmcoKSwgbnVsbCwgZmFsc2UsIG51bGwpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQmVnaW5YWFhNZXRob2RzKElUeXBlIHR5cGUsIEltcG9ydHNNYW5hZ2VyIGltcG9ydHMpCi0JCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQlnZW5lcmF0ZVhYWE1ldGhvZHModHlwZSwgaW1wb3J0cywgImJlZ2luIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVhYWE1ldGhvZHMoSVR5cGUgdHlwZSwgSW1wb3J0c01hbmFnZXIgaW1wb3J0cywgU3RyaW5nIHByZWZpeCkKLQkJCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCUlNZXRob2RbXSB0ZXN0TWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0TWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCUlNZXRob2QgdGVzdE1ldGhvZCA9IHRlc3RNZXRob2RzW2ldOwotCQkJCVN0cmluZyB0ZXN0TWV0aG9kTmFtZSA9IHRlc3RNZXRob2QuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQlpZiAodGVzdE1ldGhvZE5hbWUuc3RhcnRzV2l0aCgidGVzdCIpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlTdHJpbmcgbmV3TWV0aG9kTmFtZSA9IHByZWZpeCArIHRlc3RNZXRob2ROYW1lLnN1YnN0cmluZyg0KTsKLQkJCQkJU3RyaW5nQnVmZmVyIG1ldGhvZEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJbWV0aG9kQnVmZmVyLmFwcGVuZCgicHVibGljIHZvaWQgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbWV0aG9kQnVmZmVyLmFwcGVuZChuZXdNZXRob2ROYW1lKTsKLQkJCQkJbWV0aG9kQnVmZmVyLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoaW1wb3J0cy5hZGRJbXBvcnQoIm9yZy5hcGFjaGUuY2FjdHVzLldlYlJlcXVlc3QiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbWV0aG9kQnVmZmVyLmFwcGVuZCgiIHJlcXVlc3QpIHRocm93cyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQltZXRob2RCdWZmZXIuYXBwZW5kKGltcG9ydHMuYWRkSW1wb3J0KCJqYXZhLmxhbmcuRXhjZXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCW1ldGhvZEJ1ZmZlci5hcHBlbmQoIiB7XG5cblx0fSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl0eXBlLmNyZWF0ZU1ldGhvZChtZXRob2RCdWZmZXIudG9TdHJpbmcoKSwgdGVzdE1ldGhvZCwgZmFsc2UsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUVuZFhYWE1ldGhvZHMoSVR5cGUgdHlwZSwgSW1wb3J0c01hbmFnZXIgaW1wb3J0cykKLQkJCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCWdlbmVyYXRlWFhYTWV0aG9kcyh0eXBlLCBpbXBvcnRzLCAiZW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1ldGhvZFN0dWJTZWxlY3Rpb25Db250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgbkNvbHVtbnMpIHsKLQkJCXN1cGVyLmNyZWF0ZU1ldGhvZFN0dWJTZWxlY3Rpb25Db250cm9scyhjb21wb3NpdGUsIG5Db2x1bW5zKTsKLQkJCWNyZWF0ZUVtcHR5U3BhY2UoY29tcG9zaXRlKTsKLQkJCWZDYWN0dXNCdXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWZDYWN0dXNCdXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQkJZkNhY3R1c0J1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJZkJlZ2luQnV0dG9uID0gY3JlYXRlU2VsZWN0aW9uQnV0dG9uKCJiZWdpbigpIiwgZkNhY3R1c0J1dHRvbkNvbXBvc2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZFbmRCdXR0b24gPSBjcmVhdGVTZWxlY3Rpb25CdXR0b24oImVuZCgpIiwgZkNhY3R1c0J1dHRvbkNvbXBvc2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZCZWdpblhYWEJ1dHRvbiA9IGNyZWF0ZVNlbGVjdGlvbkJ1dHRvbigKLQkJCQkJImJlZ2luWFhYKCkgbWV0aG9kcyIsIGZDYWN0dXNCdXR0b25Db21wb3NpdGUpOyAvLyROT04tTkxTLTEkCi0JCQlmRW5kWFhYQnV0dG9uID0gY3JlYXRlU2VsZWN0aW9uQnV0dG9uKCJlbmRYWFgoKSBtZXRob2RzIiwgZkNhY3R1c0J1dHRvbkNvbXBvc2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByaXZhdGUgQnV0dG9uIGNyZWF0ZVNlbGVjdGlvbkJ1dHRvbihTdHJpbmcgdGV4dCwgQ29tcG9zaXRlIGdyb3VwKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCQkJYnV0dG9uLnNldEZvbnQoZ3JvdXAuZ2V0Rm9udCgpKTsKLQkJCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXJldHVybiBidXR0b247Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIENvbnRyb2wgY3JlYXRlRW1wdHlTcGFjZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVFbXB0eVNwYWNlKHBhcmVudCwgMSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29udHJvbCBjcmVhdGVFbXB0eVNwYWNlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWdkLndpZHRoSGludCA9IDA7Ci0JCWdkLmhlaWdodEhpbnQgPSAwOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZlNlbGVjdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0ZvcldlYlByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBmUGFnZTEuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gcm9vdC5nZXRKYXZhUHJvamVjdCgpOwotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZmFjZXRzID0gZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0cygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZmFjZXRzLmhhc05leHQoKSkgewotCQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0ID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBmYWNldHMubmV4dCgpOwotCQkJCWlmIChmYWNldC5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpLmVxdWFscygianN0LndlYiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrRm9yQ2FjdHVzTGlicmFyaWVzKCkgewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZlBhZ2UxLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHJvb3QuZ2V0SmF2YVByb2plY3QoKTsKLQotCQlMaXN0PFN0cmluZz4gbWlzc2luZ0xpYnJhcmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBDTEFTU0VTX1RPX0NIRUNLLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVR5cGUgdHlwZSA9IHByb2plY3QuZmluZFR5cGUoQ0xBU1NFU19UT19DSEVDS1tpXSk7Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQltaXNzaW5nTGlicmFyaWVzLmFkZChSRVFVSVJFRF9MSUJSQVJJRVNbaV0pOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG1pc3NpbmdMaWJyYXJpZXMuc2l6ZSgpID4gMCkgewotCQkJCWlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRTaGVsbCgpLAotCQkJCQkJTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yTWVzc2FnZVRpdGxlTWlzc2luZ0xpYnJhcnksCi0JCQkJCQlOTFMuYmluZChNZXNzYWdlcy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JNZXNzYWdlTWlzc2luZ0xpYnJhcnksCi0JCQkJCQkJCW1pc3NpbmdMaWJyYXJpZXMudG9BcnJheSgpKSkpIHsKLQkJCQkJQ2FjdHVzQWRkTGlicmFyaWVzUHJvcG9zYWwuaW5zdGFsbExpYnJhcmllcyhwcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSmF2YVNlcnZlclVJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWlmIChmaW5pc2hQYWdlKGZQYWdlMS5nZXRSdW5uYWJsZSgpKSkgewotCQkJSVR5cGUgbmV3Q2xhc3MgPSBmUGFnZTEuZ2V0Q3JlYXRlZFR5cGUoKTsKLQotCQkJSVJlc291cmNlIHJlc291cmNlID0gbmV3Q2xhc3MuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJQmFzaWNOZXdSZXNvdXJjZVdpemFyZC5zZWxlY3RBbmRSZXZlYWwocmVzb3VyY2UsIGZXb3JrYmVuY2gKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSk7Ci0JCQkJb3BlblJlc291cmNlKHJlc291cmNlKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaW5pc2hQYWdlKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgewotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbihydW5uYWJsZSk7Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoZ2V0Q29udGFpbmVyKCksIG9wLAotCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JUaXRsZU5ldzsgLy8gTmV3SlVuaXRXaXphcmRfb3BfZXJyb3JfdGl0bGUKLQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yVGl0bGVDcmVhdGVPZkVsZW1lbnRGYWlsZWQ7IC8vIE5ld0pVbml0V2l6YXJkX29wX2Vycm9yX21lc3NhZ2UKLQkJCWRpc3BsYXlNZXNzYWdlRGlhbG9nKGUsIGUuZ2V0TWVzc2FnZSgpLCBnZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcGxheU1lc3NhZ2VEaWFsb2coVGhyb3dhYmxlIHQsIFN0cmluZyBleGNlcHRpb25NZXNzYWdlLAotCQkJU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nV3JpdGVyIG1zZyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJbXNnLndyaXRlKG1lc3NhZ2UpOwotCQkJbXNnLndyaXRlKCJcblxuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZXhjZXB0aW9uTWVzc2FnZSA9PSBudWxsIHx8IGV4Y2VwdGlvbk1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLQkJCW1zZy53cml0ZShNZXNzYWdlcy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JNZXNzYWdlU2VlRXJyb3JMb2cpOwotCQllbHNlCi0JCQltc2cud3JpdGUoZXhjZXB0aW9uTWVzc2FnZSk7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbXNnLnRvU3RyaW5nKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9wZW5SZXNvdXJjZShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJZmluYWwgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCQlpZiAoZGlzcGxheSAhPSBudWxsKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlJREUub3BlbkVkaXRvcihhY3RpdmVQYWdlLCAoSUZpbGUpIHJlc291cmNlLCB0cnVlKTsKLQkJCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUphdmFTZXJ2ZXJVSVBsdWdpbi5sb2coZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyA9IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAoYWN0aXZlV29ya2JlbmNoV2luZG93ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gSmF2YVNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCk7Ci0JCWlmICh3b3JrYmVuY2ggIT0gbnVsbCkKLQkJCXJldHVybiB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzZmZiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi0qLnhtbAotdGVtcC5mb2xkZXIKLXdlYnNwaGVyZWNvcmUuamFyCi13ZWJzcGhlcmVjb3Jlc3JjLnppcAotamF2YUNvbXBpbGVyLndlYnNwaGVyZWNvcmUuamFyLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjZjIxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2M4MWMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gQXByIDE2IDIzOjIyOjE0IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzlkNzBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gSmFuIDIxIDE0OjUxOjE3IEVFVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTZjYThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI1N1biBBcHIgMTYgMjM6MjI6MDAgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTEKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTEKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOWU3NzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDIucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiB3ZWJzcGhlcmVjb3JlLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS5Db3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA0LDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMzAzLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMjA1LDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzdjMDE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzZXJ2ZXJkZWYvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHdlYnNwaGVyZWNvcmUuamFyLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gd2Vic3BoZXJlY29yZS5qYXIKLXNvdXJjZS53ZWJzcGhlcmVjb3JlLmphciA9IHNyYy8KLW91dHB1dC53ZWJzcGhlcmVjb3JlLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9pY29ucy9vYmoxNi93ZWJzcGhlcmUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL2ljb25zL29iajE2L3dlYnNwaGVyZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL2ljb25zL29iajE2L3dlYnNwaGVyZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTY4MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotcGx1Z2luTmFtZT0gV2ViU3BoZXJlIEdlbmVyaWMgU2VydmVyIERlZmluaXRpb24gQ29yZSBQbHVnLWluCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbkRlc2NyaXB0aW9uPVByb3ZpZGVzIHNlcnZlciBkZWZpbml0aW9uIElCTSBXZWJTcGhlcmUgYXBwbGljYXRpb24gc2VydmVyCi1nZW5lcmljQ2F0ZWdvcnk9SUJNCi0KLSMgPT09PT09PT09PT09IHdlYnNwaGVyZSA9PT09PT09PT09PT09PT09PT09PQotd2Vic3BoZXJlLjYucnVudGltZS5uYW1lPUlCTSBXZWJTcGhlcmUgdjYuMAotd2Vic3BoZXJlLjYucnVudGltZS5kZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSAxLjQgbW9kdWxlcyBvbiBhIGxvY2FsIHNlcnZlci4gXAotUHJvdmlkZXMgYmFzaWMgc2VydmVyIGZ1bmN0aW9uYWxpdHkKLXdlYnNwaGVyZS42LnNlcnZlci5uYW1lPUlCTSBXZWJTcGhlcmUgdjYuMAotd2Vic3BoZXJlLjYuc2VydmVyLmRlc2NyaXB0aW9uPVB1Ymxpc2hlcyBhbmQgcnVucyBKMkVFIDEuNCBtb2R1bGVzIG9uIGEgbG9jYWwgc2VydmVyLiBcCi1Qcm92aWRlcyBiYXNpYyBzZXJ2ZXIgZnVuY3Rpb25hbGl0eQotCi13YXNIb21lPUlCTSBXZWJTcGhlcmUgSW5zdGFsbGF0aW9uIERpcmVjdG9yeToKLXBvcnQ9UG9ydDoKLXdhc1Byb2ZpbGU9U2VydmVyIFByb2ZpbGUgRGlyZWN0b3J5Ogotd2FzQ2VsbD1DZWxsOgotd2FzTm9kZT1Ob2RlOgotd2FzU2VydmVyPVNlcnZlcjoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYWNkZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlcyI+Ci0gICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZS42IgotICAgICAgIG5hbWU9IiV3ZWJzcGhlcmUuNi5ydW50aW1lLm5hbWUiCi0gICAgICAgZGVzY3JpcHRpb249IiV3ZWJzcGhlcmUuNi5ydW50aW1lLmRlc2NyaXB0aW9uIgotICAgICAgIHZlbmRvcj0iJWdlbmVyaWNDYXRlZ29yeSIKLSAgICAgICB2ZXJzaW9uPSI2LjAiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lIj4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb25zPSIyLjIsIDIuMywgMi40Ii8+Ci0gICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC5lamIiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4xLCAyLjAsIDIuMSIvPgotICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbnM9IjEuMiwgMS4zLCAxLjQiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgIHZlcnNpb25zPSIxLjAsIDEuNSIvPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgPC9ydW50aW1lVHlwZT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJUeXBlcyI+Ci0gICAgIDxzZXJ2ZXJUeXBlCi0gICAgICAgICAgIHJ1bnRpbWU9InRydWUiCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcnMud2Vic3BoZXJlLjYiCi0gICAgICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLQkJICAgc3RhcnRUaW1lb3V0PSIzMDAwMDAiCi0gICAgICAgICAgIHN0b3BUaW1lb3V0PSIxNTAwMCIKLSAgICAgICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiCi0gICAgICAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZS42IgotICAgICAgICAgICBkZXNjcmlwdGlvbj0iJXdlYnNwaGVyZS42LnNlcnZlci5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckJlaGF2aW91ciIKLSAgICAgICAgICAgbmFtZT0iJXdlYnNwaGVyZS42LnNlcnZlci5uYW1lIgotICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLSAgICAgICAgICAgbGF1bmNoTW9kZXM9InJ1bixkZWJ1ZyIKLSAgICAgICAgICAgc3RhcnRCZWZvcmVQdWJsaXNoPSJ0cnVlIj4KLSAgICAgPC9zZXJ2ZXJUeXBlPgotCTwvZXh0ZW5zaW9uPgotCi08IS0tIFVJIENvbXBvbmVudHMtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkRnJhZ21lbnRzIj4KLSAgICAgPGZyYWdtZW50Ci0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZSIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlLjYiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPiAgICAgICAgICAgCi0gICAgIDxmcmFnbWVudAotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlciIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcnMud2Vic3BoZXJlLjYiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcldpemFyZEZyYWdtZW50Ii8+ICAgCi0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi93ZWJzcGhlcmUuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcnMud2Vic3BoZXJlLjYiIC8+Ci0gICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbWFnZSIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3dlYnNwaGVyZS5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS53ZWJzcGhlcmUuNiIvPgotCTwvZXh0ZW5zaW9uPgotICAKLTwhLS0gU2VydmVyIHR5cGUgZGVmaW5pdGlvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5zZXJ2ZXJkZWZpbml0aW9uIj4KLQkJPHNlcnZlcmRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZS42IiBkZWZpbml0aW9uZmlsZT0iL3NlcnZlcmRlZi93ZWJzcGhlcmUuNi5zZXJ2ZXJkZWYiPgotCQk8L3NlcnZlcmRlZmluaXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuZ2VuZXJpY3B1Ymxpc2hlciI+Ci0gICAgICA8Z2VuZXJpY3B1Ymxpc2hlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUuQW50UHVibGlzaGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy53ZWJzcGhlcmUuYW50cHVibGlzaGVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlIj4KLSAgICA8L3J1bnRpbWUtY29tcG9uZW50LXR5cGU+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZSIKLSAgICAgICB2ZXJzaW9uPSI2LjAiLz4KLQotICAgIDxhZGFwdGVyPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlIi8+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIkRmFjdG9yeSIvPgotICAgICAgPHR5cGUKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgICA8L2FkYXB0ZXI+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlIgotICAgICAgICAgdmVyc2lvbj0iNi4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5lamIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEsMi4wLDIuMSIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmVhciIKLSAgICAgICAgIHZlcnNpb249IjEuMiwxLjMsMS40Ii8+Ci0gICAgICAgICAKLSAgICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuYXBwY2xpZW50IgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQiLz4KLSAgICAgICAKLSAgICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPiAgCi0gICAgICAgICAKLSAgICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgdmVyc2lvbj0iMS4wLDEuNSIvPgotICAgIDwvc3VwcG9ydGVkPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5kZWZhdWx0RmFjZXRzIj4KLSAgICA8ZGVmYXVsdC1mYWNldHM+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZSIvPgotICAgICAgPGZhY2V0IGlkPSJ3c3QuanNkdC53ZWIiIHZlcnNpb249IjEuMCIvPgotICAgIDwvZGVmYXVsdC1mYWNldHM+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgIDxpbWFnZSBydW50aW1lLWNvbXBvbmVudC10eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS53ZWJzcGhlcmUiCi0gICAgICBwYXRoPSJpY29ucy9vYmoxNi93ZWJzcGhlcmUuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlIi8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5SdW50aW1lTGFiZWxQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLSAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvc2VydmVyZGVmL3NjcmlwdHMvd2Vic3BoZXJlLjYueC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvc2VydmVyZGVmL3NjcmlwdHMvd2Vic3BoZXJlLjYueC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NzFjZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NlcnZlcmRlZi9zY3JpcHRzL3dlYnNwaGVyZS42LngueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImRlcGxveWV4dGVuc2lvbiIgIGRlZmF1bHQ9ImRlcGxveS5qMmVlLndlYiIgIGJhc2VkaXI9Ii4iPgotCi0JPHByb3BlcnR5IG5hbWU9Indhcy5ob21lIiB2YWx1ZT0iJHt3YXNIb21lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJtb2R1bGUud29ya2luZy5kaXIiIHZhbHVlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7cHJvamVjdC5uYW1lfSI+PC9wcm9wZXJ0eT4KLQk8cGF0aCBpZD0idG9vbHBhdGgiPgotCQk8ZmlsZXNldCBkaXI9IiR7d2FzLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCQk8cGF0aGVsZW1lbnQgcGF0aD0iJHt3YXMuaG9tZX0vbGliL3Byb3BlcnRpZXMiIC8+Ci0JCTxwYXRoZWxlbWVudCBwYXRoPSIke3dhcy5ob21lfS9vcHRpb25hbExpYnJhcmllcy9qeXRob24uamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIGNsYXNzcGF0aHJlZj0idG9vbHBhdGgiIG5hbWU9IndzYWRtaW4iIGNsYXNzbmFtZT0iY29tLmlibS53ZWJzcGhlcmUuYW50LnRhc2tzLldzQWRtaW4iIC8+Ci0JPHRhc2tkZWYgY2xhc3NwYXRocmVmPSJ0b29scGF0aCIgbmFtZT0id3NlamJkZXBsb3kiIGNsYXNzbmFtZT0iY29tLmlibS53ZWJzcGhlcmUuYW50LnRhc2tzLldzRWpiRGVwbG95IiAvPgkKLQk8dGFza2RlZiBjbGFzc3BhdGhyZWY9InRvb2xwYXRoIiBuYW1lPSJ3c2luc3RhbGxhcHAiIGNsYXNzbmFtZT0iY29tLmlibS53ZWJzcGhlcmUuYW50LnRhc2tzLkluc3RhbGxBcHBsaWNhdGlvbiIgLz4JCi0KLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLndlYiI+Ci0JCTxlY2hvIG1lc3NhZ2U9Ik1vZHVsZSBXb3JraW5nIERheSAgJHttb2R1bGUud29ya2luZy5kaXJ9IFByb2plY3QgV29ya2luZyBEaXI9JHtwcm9qZWN0LndvcmtpbmcuZGlyfSBNZXNzYWdlIERpcj0ke21vZHVsZS5kaXJ9IE1vZHVsZSBOYW1lICR7bW9kdWxlLm5hbWV9Ij48L2VjaG8+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIj4gCi0JCQk8emlwZmlsZXNldCBkaXI9IiR7bW9kdWxlLndvcmtpbmcuZGlyfSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi53YXIiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0JCTx3c2FkbWluICAKLQkJCXdhc2hvbWU9IiR7d2FzLmhvbWV9IiAJCi0JCQlwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJCWNvbW1hbmQ9IiRBZG1pbkFwcCB1bmluc3RhbGwgJHttb2R1bGUubmFtZX0iIAotCQkJZmFpbG9uZXJyb3I9ImZhbHNlIj4KLQkJPC93c2FkbWluPgotCSAgICA8d3NhZG1pbiAgCi0JCQl3YXNob21lPSIke3dhcy5ob21lfSIgCQkJCQotCQkJcHJvcGVydGllcz0iJHt3YXNQcm9maWxlfS9wcm9wZXJ0aWVzL3dzYWRtaW4ucHJvcGVydGllcyIgCi0JCQljb21tYW5kPSIkQWRtaW5BcHAgaW5zdGFsbCAke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LndhciB7LWFwcG5hbWUgJHttb2R1bGUubmFtZX0gLWNvbnRleHRyb290ICAke2NvbnRleHRSb290fSAtdXNlZGVmYXVsdGJpbmRpbmdzfSIgCi0JCQlmYWlsb25lcnJvcj0idHJ1ZSI+Ci0JCTwvd3NhZG1pbj4KLQkgICAgPHdzYWRtaW4gIAotCQkgIHdhc2hvbWU9IiR7d2FzLmhvbWV9IiAKLQkJICBwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJICBjb21tYW5kPSIkQWRtaW5Db250cm9sIGludm9rZSBbJEFkbWluQ29udHJvbCBxdWVyeU5hbWVzIHR5cGU9QXBwbGljYXRpb25NYW5hZ2VyLCpdIHN0YXJ0QXBwbGljYXRpb24gJHttb2R1bGUubmFtZX0iIAotCQkgIGZhaWxvbmVycm9yPSJ0cnVlIj4KLQkgICAgPC93c2FkbWluPgkJCQotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZGVwbG95LmoyZWUuZWpiIj4KLQkJPGphciBkZXN0ZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiPiAKLQkJCTx6aXBmaWxlc2V0IGRpcj0iJHttb2R1bGUuZGlyfSI+Ci0JICAgICAgICAJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JICAgICAgIAkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0JCQk8L3ppcGZpbGVzZXQ+Ci0JCTwvamFyPgotCQk8d3NlamJkZXBsb3kgCi0JCQkJaW5wdXRKYXI9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIiAKLQkJCQl3YXNIb21lPSIke3dhcy5ob21lfSIgCi0JCQkJd2FzaG9tZT0iJHt3YXMuaG9tZX0iIAotCQkJCWNsYXNzcGF0aHJlZj0idG9vbHBhdGgiCi0JCQkJb3V0cHV0SmFyPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LXdhcy5qYXIiIAotCQkJCWNvZGVnZW49InRydWUgIiAKLQkJCQlrZWVwR2VuZXJhdGVkPSJ0cnVlIiAKLQkJCQlxdWlldD0iZmFsc2UiIAotCQkJCW5vVmFsaWRhdGU9InRydWUiIAotCQkJCW5vV2FybmluZ3M9ImZhbHNlIiAKLQkJCQlub0luZm9ybT0iZmFsc2UiIAotCQkJCWNvbXBhdGlibGUzNT0iZmFsc2UiIAotCQkJCWZhaWxvbmVycm9yPSJ0cnVlIiAKLQkJCQl0cmFjZT0idHJ1ZSIgCi0JCQkJanZtTWF4TWVtb3J5PSIyNTZNIiAvPgotCQotCQkJPHdzYWRtaW4gIAotCQkJCXdhc2hvbWU9IiR7d2FzLmhvbWV9IiAKLQkJCQlwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJCQljb21tYW5kPSIkQWRtaW5BcHAgdW5pbnN0YWxsICR7bW9kdWxlLm5hbWV9IiAKLQkJCQlmYWlsb25lcnJvcj0iZmFsc2UiPgotCQkJPC93c2FkbWluPgotCi0JCSAgICA8d3NhZG1pbiAgCi0JCQkJd2FzaG9tZT0iJHt3YXMuaG9tZX0iIAkJCQkKLQkJCQlwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJCQljb21tYW5kPSIkQWRtaW5BcHAgaW5zdGFsbCAke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciB7LWFwcG5hbWUgJHttb2R1bGUubmFtZX0gLXVzZWRlZmF1bHRiaW5kaW5nc30iIAotCQkJCWZhaWxvbmVycm9yPSJ0cnVlIj4KLQkJCTwvd3NhZG1pbj4KLQotCQkJPHdzYWRtaW4gIAotCQkJICB3YXNob21lPSIke3dhcy5ob21lfSIgCi0JCQkgIHByb3BlcnRpZXM9IiR7d2FzUHJvZmlsZX0vcHJvcGVydGllcy93c2FkbWluLnByb3BlcnRpZXMiIAotCQkJICBjb21tYW5kPSIkQWRtaW5Db250cm9sIGludm9rZSBbJEFkbWluQ29udHJvbCBxdWVyeU5hbWVzIHR5cGU9QXBwbGljYXRpb25NYW5hZ2VyLCpdIHN0YXJ0QXBwbGljYXRpb24gJHttb2R1bGUubmFtZX0iIAotCQkJICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0JCSAgICA8L3dzYWRtaW4+CQotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZGVwbG95LmoyZWUuZWFyIj4KLQkJPGphciBkZXN0ZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5lYXIiPiAKLQkJCTx6aXBmaWxlc2V0IGRpcj0iJHttb2R1bGUuZGlyfSI+Ci0JICAgICAgICAJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JICAgICAgIAkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0JCQk8L3ppcGZpbGVzZXQ+Ci0JCTwvamFyPgotCi0JCTx3c2FkbWluICAKLQkJCQkJd2FzaG9tZT0iJHt3YXMuaG9tZX0iIAotCQkJCQlwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJCQkJY29tbWFuZD0iJEFkbWluQXBwIHVuaW5zdGFsbCAke21vZHVsZS5uYW1lfSIgCi0JCQkJCWZhaWxvbmVycm9yPSJmYWxzZSI+Ci0JCTwvd3NhZG1pbj4KLQotCQk8d3NhZG1pbiAgCi0JCQkJCXdhc2hvbWU9IiR7d2FzLmhvbWV9IiAJCQkJCi0JCQkJCXByb3BlcnRpZXM9IiR7d2FzUHJvZmlsZX0vcHJvcGVydGllcy93c2FkbWluLnByb3BlcnRpZXMiIAotCQkJCQljb21tYW5kPSIkQWRtaW5BcHAgaW5zdGFsbCAke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciB7LWFwcG5hbWUgJHttb2R1bGUubmFtZX0gLWRlcGxveWVqYiAtdXNlZGVmYXVsdGJpbmRpbmdzfSIgCi0JCQkJCWZhaWxvbmVycm9yPSJ0cnVlIj4KLQkJPC93c2FkbWluPgotCQk8d3NhZG1pbiAgCi0JCQkJICB3YXNob21lPSIke3dhcy5ob21lfSIgCi0JCQkJICBwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJCQkgIGNvbW1hbmQ9IiRBZG1pbkNvbnRyb2wgaW52b2tlIFskQWRtaW5Db250cm9sIHF1ZXJ5TmFtZXMgdHlwZT1BcHBsaWNhdGlvbk1hbmFnZXIsKl0gc3RhcnRBcHBsaWNhdGlvbiAke21vZHVsZS5uYW1lfSIgCi0JCQkJICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0JCSA8L3dzYWRtaW4+CQotCQkKLQk8L3RhcmdldD4JCi0JCi0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLndlYiI+Ci0JCQotCQk8d3NhZG1pbiAgCi0JCQl3YXNob21lPSIke3dhcy5ob21lfSIgCi0JCQkKLQkJCXByb3BlcnRpZXM9IiR7d2FzUHJvZmlsZX0vcHJvcGVydGllcy93c2FkbWluLnByb3BlcnRpZXMiIAotCQkJY29tbWFuZD0iJEFkbWluQXBwIHVuaW5zdGFsbCAke21vZHVsZS5uYW1lfSIgCi0JCQlmYWlsb25lcnJvcj0iZmFsc2UiPgotCQk8L3dzYWRtaW4+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLmVqYiI+Ci0JCTx3c2FkbWluICAKLQkJCXdhc2hvbWU9IiR7d2FzLmhvbWV9IiAKLQkJCQotCQkJcHJvcGVydGllcz0iJHt3YXNQcm9maWxlfS9wcm9wZXJ0aWVzL3dzYWRtaW4ucHJvcGVydGllcyIgCi0JCQljb21tYW5kPSIkQWRtaW5BcHAgdW5pbnN0YWxsICR7bW9kdWxlLm5hbWV9IiAKLQkJCWZhaWxvbmVycm9yPSJmYWxzZSI+Ci0JCTwvd3NhZG1pbj4KLQk8L3RhcmdldD4JCi0JCi0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLmVhciI+Ci0JCTx3c2FkbWluICAKLQkJCXdhc2hvbWU9IiR7d2FzLmhvbWV9IiAKLQkJCQotCQkJcHJvcGVydGllcz0iJHt3YXNQcm9maWxlfS9wcm9wZXJ0aWVzL3dzYWRtaW4ucHJvcGVydGllcyIgCi0JCQljb21tYW5kPSIkQWRtaW5BcHAgdW5pbnN0YWxsICR7bW9kdWxlLm5hbWV9IiAKLQkJCWZhaWxvbmVycm9yPSJmYWxzZSI+Ci0JCTwvd3NhZG1pbj4KLQk8L3RhcmdldD4JCi0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9zZXJ2ZXJkZWYvd2Vic3BoZXJlLjYuc2VydmVyZGVmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NlcnZlcmRlZi93ZWJzcGhlcmUuNi5zZXJ2ZXJkZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTQ4NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NlcnZlcmRlZi93ZWJzcGhlcmUuNi5zZXJ2ZXJkZWYKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0bnM6U2VydmVyUnVudGltZQotCXhtbG5zOnRucz0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgIgotCW5hbWU9IklCTSBXZWJTcGhlcmUgNiIgdmVyc2lvbj0idjYuMCI+Ci0JPHByb3BlcnR5IGlkPSJ3YXNIb21lIgotCQlsYWJlbD0iJXdhc0hvbWUiCi0JCXR5cGU9ImRpcmVjdG9yeSIKLQkJY29udGV4dD0icnVudGltZSIKLQkJZGVmYXVsdD0iL3lvdXJfc2VydmVyX3Jvb3Qvd2FzLTYuMCIgLz4KLQotCTxwcm9wZXJ0eSBpZD0icG9ydCIKLQkJbGFiZWw9IiVwb3J0IgotCQl0eXBlPSJzdHJpbmciCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0iOTA4MCIgLz4KLQotCTxwcm9wZXJ0eSBpZD0id2FzUHJvZmlsZSIKLQkJbGFiZWw9IiV3YXNQcm9maWxlIgotCQl0eXBlPSJkaXJlY3RvcnkiCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0iL3lvdXJfc2VydmVyX3Jvb3Qvd2FzLTYuMC9wcm9maWxlcy9kZWZhdWx0IiAvPgotCi0JPHByb3BlcnR5IGlkPSJ3YXNDZWxsIgotCQlsYWJlbD0iJXdhc0NlbGwiCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSJbY2VsbF0iIC8+Ci0KLQk8cHJvcGVydHkgaWQ9Indhc05vZGUiCi0JCWxhYmVsPSIld2FzTm9kZSIKLQkJdHlwZT0ic3RyaW5nIgotCQljb250ZXh0PSJzZXJ2ZXIiCi0JCWRlZmF1bHQ9IltOb2RlXSIgLz4KLQk8cHJvcGVydHkgaWQ9Indhc1NlcnZlciIKLQkJbGFiZWw9IiV3YXNTZXJ2ZXIiCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSJzZXJ2ZXIxIiAvPgotCi0JPHBvcnQ+Ci0JCTxubz4ke3BvcnR9PC9ubz4KLQkJPG5hbWU+SHR0cDwvbmFtZT4KLQkJPHByb3RvY29sPmh0dHA8L3Byb3RvY29sPgotCTwvcG9ydD4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC53ZWI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7d2FzSG9tZX08L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLndlYnNwaGVyZS5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQk8bW9kdWxlPgotCQk8dHlwZT5qc3QuZWpiPC90eXBlPgotCQk8cHVibGlzaERpcj4ke3dhc0hvbWV9PC9wdWJsaXNoRGlyPgotCQk8cHVibGlzaGVyUmVmZXJlbmNlPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy53ZWJzcGhlcmUuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LmVhcjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHt3YXNIb21lfTwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMud2Vic3BoZXJlLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5jb25uZWN0b3I8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7d2FzSG9tZX08L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLndlYnNwaGVyZS5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQk8cHJvamVjdD4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT53YXMucHJvamVjdDwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvcHJvamVjdD4KLQkKLQk8c3RhcnQ+Ci0JCTxtYWluQ2xhc3M+Y29tLmlibS53cy5ib290c3RyYXAuV1NMYXVuY2hlcjwvbWFpbkNsYXNzPgotCQk8d29ya2luZ0RpcmVjdG9yeT4ke3dhc1Byb2ZpbGV9PC93b3JraW5nRGlyZWN0b3J5PgotCQk8cHJvZ3JhbUFyZ3VtZW50cz5jb20uaWJtLndzLnJ1bnRpbWUuV3NTZXJ2ZXIgIiR7d2FzUHJvZmlsZX0vY29uZmlnIiAiJHt3YXNDZWxsfSIgIiR7d2FzTm9kZX0iICIke3dhc1NlcnZlcn0iPC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPiItRHVzZXIuaW5zdGFsbC5yb290PSR7d2FzUHJvZmlsZX0iICAiLURzZXJ2ZXIucm9vdD0ke3dhc1Byb2ZpbGV9IiAgIi1Ed2FzLmluc3RhbGwucm9vdD0ke3dhc0hvbWV9IiAiLURjb20uaWJtLml0cC5sb2NhdGlvbj0ke3dhc0hvbWV9L2JpbiIgIi1Ed3MuZXh0LmRpcnM9JHt3YXNIb21lfS9qYXZhL2xpYiR7cGF0aENoYXJ9JHt3YXNQcm9maWxlfS9jbGFzc2VzJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2NsYXNzZXMke3BhdGhDaGFyfSR7d2FzSG9tZX0vbGliJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2luc3RhbGxlZENoYW5uZWxzJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2xpYi9leHQke3BhdGhDaGFyfSR7d2FzSG9tZX0vd2ViL2hlbHAke3BhdGhDaGFyfSR7d2FzSG9tZX0vZGVwbG95dG9vbC9pdHAvcGx1Z2lucy9jb20uaWJtLmV0b29scy5lamJkZXBsb3kvcnVudGltZSIgIC1YYm9vdGNsYXNzcGF0aC9wOiR7d2FzSG9tZX0vamF2YS9qcmUvbGliL2V4dC9pYm1vcmIuamFyJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2phdmEvanJlL2xpYi9leHQvaWJtZXh0LmphciAtWG1zNTBtIC1YbXgyNTZtICItRGNvbS5pYm0uQ09SQkEuQ29uZmlnVVJMPWZpbGU6JHt3YXNQcm9maWxlfS9wcm9wZXJ0aWVzL3Nhcy5jbGllbnQucHJvcHMiICItRGNvbS5pYm0uU09BUC5Db25maWdVUkw9ZmlsZToke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvc29hcC5jbGllbnQucHJvcHMiICAgIi1EamF2YS51dGlsLmxvZ2dpbmcubWFuYWdlcj1jb20uaWJtLndzLmJvb3RzdHJhcC5Xc0xvZ01hbmFnZXIiICItRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZ3VyZUJ5U2VydmVyPXRydWUiICItRGlibS53ZWJzcGhlcmUucHJlbG9hZC5jbGFzc2VzPXRydWUiICAiLURqYXZhLmxpYnJhcnkucGF0aD0ke3dhc0hvbWV9L2phdmEvYmluJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2JpbiR7cGF0aENoYXJ9JHt3YXNIb21lfS9qYXZhL2JpbiR7cGF0aENoYXJ9JHt3YXNIb21lfS9qYXZhL2pyZS9iaW4iPC92bVBhcmFtZXRlcnM+Ci0JCTxjbGFzc3BhdGhSZWZlcmVuY2U+d2FzPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdGFydD4KLQotCTxzdG9wPgotCQk8bWFpbkNsYXNzPmNvbS5pYm0ud3MuYm9vdHN0cmFwLldTTGF1bmNoZXI8L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JHt3YXNIb21lfTwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+Y29tLmlibS53cy5tYW5hZ2VtZW50LnRvb2xzLldzU2VydmVyU3RvcCAiJHt3YXNQcm9maWxlfS9jb25maWciICIke3dhc0NlbGx9IiAiJHt3YXNOb2RlfSIgIiR7d2FzU2VydmVyfSI8L3Byb2dyYW1Bcmd1bWVudHM+Ci0JCTx2bVBhcmFtZXRlcnM+Ii1EdXNlci5pbnN0YWxsLnJvb3Q9JHt3YXNQcm9maWxlfSIgICItRHNlcnZlci5yb290PSR7d2FzUHJvZmlsZX0iICAiLUR3YXMuaW5zdGFsbC5yb290PSR7d2FzSG9tZX0iICItRHdzLmV4dC5kaXJzPSR7d2FzSG9tZX0vamF2YS9saWIke3BhdGhDaGFyfSR7d2FzSG9tZX0vY2xhc3NlcyR7cGF0aENoYXJ9JHt3YXNIb21lfS9saWIke3BhdGhDaGFyfSR7d2FzSG9tZX0vaW5zdGFsbGVkQ2hhbm5lbHMke3BhdGhDaGFyfSR7d2FzSG9tZX0vbGliL2V4dCR7cGF0aENoYXJ9JHt3YXNIb21lfS93ZWIvaGVscCR7cGF0aENoYXJ9JHt3YXNIb21lfS9kZXBsb3l0b29sL2l0cC9wbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmVqYmRlcGxveS9ydW50aW1lIiAgICItWGJvb3RjbGFzc3BhdGgvcDoke3dhc0hvbWV9L2phdmEvanJlL2xpYi9leHQvaWJtb3JiLmphciR7cGF0aENoYXJ9JHt3YXNIb21lfS9qYXZhL2pyZS9saWIvZXh0L2libWV4dC5qYXIiIC1YbXM1MG0gLVhteDI1Nm0gIi1EY29tLmlibS5DT1JCQS5Db25maWdVUkw9ZmlsZToke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvc2FzLmNsaWVudC5wcm9wcyIgIi1EY29tLmlibS5TT0FQLkNvbmZpZ1VSTD1maWxlOiR7d2FzUHJvZmlsZX0vcHJvcGVydGllcy9zb2FwLmNsaWVudC5wcm9wcyIgICAiLURqYXZhLnV0aWwubG9nZ2luZy5tYW5hZ2VyPWNvbS5pYm0ud3MuYm9vdHN0cmFwLldzTG9nTWFuYWdlciIgIi1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlndXJlQnlTZXJ2ZXI9dHJ1ZSIgIi1EaWJtLndlYnNwaGVyZS5wcmVsb2FkLmNsYXNzZXM9dHJ1ZSIgICItRGphdmEubGlicmFyeS5wYXRoPSR7d2FzSG9tZX0vamF2YS9iaW4ke3BhdGhDaGFyfSR7d2FzSG9tZX0vYmluJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2phdmEvYmluJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2phdmEvanJlL2JpbiI8L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT53YXM8L2NsYXNzcGF0aFJlZmVyZW5jZT4KLQk8L3N0b3A+Ci0JCi0JPHB1Ymxpc2hlciBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlciI+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPmJ1aWxkLmZpbGU8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT4vc2VydmVyZGVmL3NjcmlwdHMvd2Vic3BoZXJlLjYueC54bWw8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3Qud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUud2ViPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVqYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LndlYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUud2ViPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qc3QuZWpiPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3QuZWFyPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qc3QuZWFyPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS5lYXI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgkJCi0JPC9wdWJsaXNoZXI+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJ3YXMiID4KLQkgICAgPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9wcm9wZXJ0aWVzIiAvPgotCSAgICA8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9ib290c3RyYXAuamFyIiAvPgotICAgICAgICA8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9qMmVlLmphciIgLz4KLSAgICAgICAgPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvbG1wcm94eS5qYXIiIC8+Ci0gICAgICAgIDxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3VybHByb3RvY29scy5qYXIiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJ3YXMucHJvamVjdCI+Ci0JICAgIDxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2FjdGl2aXR5U2Vzc2lvbi5qYXIiIC8+Ci0gICAgICAgIDxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2Fjd2EuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9hZG1pbi5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvYXBwcHJvZmlsZS5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvYXN5bmNoYmVhbnMuamFyIiAvPiAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9ib290c3RyYXAuamFyIiAvPgkJICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvYnNmLmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9jaGFubmVsZncuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2NsdXN0ZXIuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2NsdXN0ZXJhZGFwdGVyLmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9jb21tb25qLXR3bS5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvY29tbW9ucy1kaXNjb3ZlcnkuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2NvbW1vbnMtbG9nZ2luZy1hcGkuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2Rpc3RleGNlcC5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvZHdsbWNsaWVudC5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvZHluYWNhY2hlLmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9lY3V0aWxzLmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9lamJjb250YWluZXIuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2VqYmNvbnRhaW5lckltcGwuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2VqYnBvcnRhYmxlLmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9lbWYuamFyIiAvPiAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9mZmRjLmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9pMThuY3R4LmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2luc3RhbGxlZENoYW5uZWxzL2NoYW5uZWwuaHR0cC5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9pbnN0YWxsZWRDaGFubmVscy9jaGFubmVsLnNzbC5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9pbnN0YWxsZWRDaGFubmVscy9jaGFubmVsLnRjcC5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvaXZqZWpiMzUuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2oyY0ludGYuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2oyZWUuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2pkYmNtZWRpYXRvci5qYXIiIC8+ICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9qc2YtYXBpLmphciIgLz4gICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2pzdGwuamFyIiAvPiAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvbWFuYWdlbWVudC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvbWFyc2hhbGwuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL29iamVjdHBvb2wuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL29kYy5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvcG0uamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3BtaW1wbC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvcHJvY2Vzc2ludGYuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3FyeWNsaWVudC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvcXVlcnkuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3F1ZXJ5bWQuamFyIi8+IAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9xdWVyeXdzLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9yYXMuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3JzYWRhcHRlcmNjaS5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvcnNhZGFwdGVyc3BpLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9yc2FleHRlcm5hbC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvcnVudGltZS5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvcnVudGltZWZ3LmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9zYXMuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3NjaGVkdWxlci1jbGllbnQuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3NjaGVkdWxlci1zZXJ2aWNlLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9zZWN1cml0eS5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvc2VjdXJpdHlpbXBsLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9zZXJ2bGV0ZXZlbnQuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3NpYi5jb21tb24uamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3NpYi5zZXJ2ZXIuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3NvYXAuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3NvYXAtc2VjLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9zdGFuZGFyZC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvc3RhcnR1cGJlYW4uamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3R4LmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi91ZGRpNGp2Mi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvdXRpbHMuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3ZhcHJ0LmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi93Y2NtX2Jhc2UuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3dlYmNvbnRhaW5lci5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvd2Vic2VydmljZXMuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3dzYXRsaWIuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3dzLWNvbW1vbnMtbG9nZ2luZy5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvd3NkbDRqLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi93c2V4Y2VwdGlvbi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvd3NpZi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvd3NpZi1qMmMuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3dzLWpzZi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvd3NzZWMuamFyIi8+Ci0JPC9jbGFzc3BhdGg+Ci0JPGpuZGlDb25uZWN0aW9uPgotCQk8cHJvdmlkZXJVcmw+aWlvcDovLyR7c2VydmVyQWRkcmVzc306MjAwMTwvcHJvdmlkZXJVcmw+Ci0JCTxpbml0aWFsQ29udGV4dEZhY3Rvcnk+b3JnLm9iamVjdHdlYi5jYXJvbC5qbmRpLnNwaS5NdWx0aU9yYkluaXRpYWxDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci93ZWJzcGhlcmUvY29yZS9BbnRQdWJsaXNoZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci93ZWJzcGhlcmUvY29yZS9BbnRQdWJsaXNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5MzE3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvd2Vic3BoZXJlL2NvcmUvQW50UHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBBbnRQdWJsaXNoZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5wdWJsaXNoZXJzLkFudFB1Ymxpc2hlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSX0lEPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMud2Vic3BoZXJlLmFudHB1Ymxpc2hlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCB2b2lkIHNldHVwQW50TGF1bmNoQ29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjKSB7Ci0JCVN0cmluZyB3YXNQcm9maWxlID0gKFN0cmluZyl0aGlzLmdldFNlcnZlclJ1bnRpbWUoKS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKS5nZXQoIndhc1Byb2ZpbGUiKTsKLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywiLUR1c2VyLmluc3RhbGwucm9vdD0iK3dhc1Byb2ZpbGUpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3dlYnNwaGVyZS9jb3JlL0NvcmVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci93ZWJzcGhlcmUvY29yZS9Db3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjEzNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3dlYnNwaGVyZS9jb3JlL0NvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb3JlUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlLkNvcmVQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjNDZiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibW9uaXRvcmNvcmUvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWQxZTA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLW1vbml0b3Jjb3JlLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZV8zLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwNzBlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvZGVidWc9dHJ1ZQotCi1vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL3BhcnNpbmc9ZmFsc2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiMjM5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgTm92IDEwIDE3OjExOjM1IEhTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIwODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0jVGh1IFNlcCAxMyAxNToyNTowNiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoLCoudGVzdHN1aXRlLCouZGVwbG95LCoubG9jYXRpb24sKi5leGVjdXRpb24sKi5kYXRhcG9vbCwqLmFydGlmYWN0LCouaHRtbCwqLnN2Zwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmNlMjA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIEZlYiAyMyAyMToxNjoyMSBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTYwZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTVlM2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMzAzLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHA7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkiLAotIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlZDU2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KLXNvdXJjZS4uID0gbW9uaXRvcmNvcmUvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0FjY2VwdFRocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQWNjZXB0VGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTExYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQWNjZXB0VGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci0vKioKLSAqIFRoZSBhY3R1YWwgVENQL0lQIG1vbml0b3Jpbmcgc2VydmVyLiBUaGlzIGlzIGEgdGhyZWFkIHRoYXQKLSAqIGxpc3RlbnMgb24gYSBwb3J0IGFuZCByZWxheXMgYSBjYWxsIHRvIGFub3RoZXIgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgQWNjZXB0VGhyZWFkIHsKLQlwcm90ZWN0ZWQgSU1vbml0b3IgbW9uaXRvcjsKLQotCXByb3RlY3RlZCBib29sZWFuIGFsaXZlID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKLQotCXByb3RlY3RlZCBUaHJlYWQgdGhyZWFkOwotCi0JY2xhc3MgU2VydmVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJcHVibGljIFNlcnZlclRocmVhZCgpIHsKLQkJCXN1cGVyKCJUQ1AvSVAgTW9uaXRvciIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNlcnZlclRocmVhZCBhY2NlcHRzIGluY29taW5nIGNvbm5lY3Rpb25zIGFuZCBkZWxlZ2F0ZXMgdG8gdGhlIHByb3RvY29sCi0JCSAqIGFkYXB0ZXIgdG8gZGVhbCB3aXRoIHRoZSBjb25uZWN0aW9uLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLy8gY3JlYXRlIGEgbmV3IHNlcnZlciBzb2NrZXQKLQkJCXRyeSB7Ci0JCQkJc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChtb25pdG9yLmdldExvY2FsUG9ydCgpKTsKLQkJCQlzZXJ2ZXJTb2NrZXQuc2V0U29UaW1lb3V0KDIwMDApOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIk1vbml0b3JpbmcgbG9jYWxob3N0OiIgKyBtb25pdG9yLmdldExvY2FsUG9ydCgpICsgIiAtPiAiICsgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCkKLQkJCQkJCSsgIjoiICsgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc3RhcnQgbW9uaXRvcmluZyIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJd2hpbGUgKGFsaXZlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gYWNjZXB0IHRoZSBjb25uZWN0aW9uIGZyb20gdGhlIGNsaWVudAotCQkJCQlTb2NrZXQgbG9jYWxTb2NrZXQgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7Ci0JCQkJCQotCQkJCQlpbnQgdGltZW91dCA9IG1vbml0b3IuZ2V0VGltZW91dCgpOwotCQkJCQlpZiAodGltZW91dCAhPSAwKQotCQkJCQkJbG9jYWxTb2NrZXQuc2V0U29UaW1lb3V0KHRpbWVvdXQpOwotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIKLQkJCQkJCVNvY2tldCByZW1vdGVTb2NrZXQgPSBuZXcgU29ja2V0KCk7Ci0JCQkJCQlpZiAodGltZW91dCAhPSAwKQotCQkJCQkJCXJlbW90ZVNvY2tldC5zZXRTb1RpbWVvdXQodGltZW91dCk7Ci0JCQkJCQkKLQkJCQkJCXJlbW90ZVNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhtb25pdG9yLmdldFJlbW90ZUhvc3QoKSwgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCkpLCB0aW1lb3V0KTsKLQkJCQkJCQotCQkJCQkJLy8gcmVsYXkgdGhlIGNhbGwgdGhyb3VnaAotCQkJCQkJU3RyaW5nIHByb3RvY29sSWQgPSBtb25pdG9yLmdldFByb3RvY29sKCk7Ci0JCQkJCQlQcm90b2NvbEFkYXB0ZXIgYWRhcHRlciA9IE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm90b2NvbEFkYXB0ZXIocHJvdG9jb2xJZCk7Ci0JCQkJCQlhZGFwdGVyLmNvbm5lY3QobW9uaXRvciwgbG9jYWxTb2NrZXQsIHJlbW90ZVNvY2tldCk7Ci0JCQkJCX0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotCQkJCQkJRmFpbGVkQ29ubmVjdGlvblRocmVhZCB0aHJlYWQyID0gbmV3IEZhaWxlZENvbm5lY3Rpb25UaHJlYWQoKE1vbml0b3IpIG1vbml0b3IsIGxvY2FsU29ja2V0LCBNZXNzYWdlcy5lcnJvckNvbm5lY3RUaW1lb3V0KTsKLQkJCQkJCXRocmVhZDIuc3RhcnQoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUZhaWxlZENvbm5lY3Rpb25UaHJlYWQgdGhyZWFkMiA9IG5ldyBGYWlsZWRDb25uZWN0aW9uVGhyZWFkKChNb25pdG9yKSBtb25pdG9yLCBsb2NhbFNvY2tldCwgbnVsbCk7Ci0JCQkJCQl0aHJlYWQyLnN0YXJ0KCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChhbGl2ZSkKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdoaWxlIG1vbml0b3JpbmciLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBY2NlcHRUaHJlYWQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBtb25pdG9yCi0JICovCi0JcHVibGljIEFjY2VwdFRocmVhZChJTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0IHRoZSBzZXJ2ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXIoKSB7Ci0JCWlmICh0aHJlYWQgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhyZWFkID0gbmV3IFNlcnZlclRocmVhZCgpOwotCQl0aHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQl0aHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgKyAxKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCQotCQlUaHJlYWQueWllbGQoKTsKLQkJCi0JCS8vIHdhaXQgdXAgdG8gMiBzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvbgotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzZXJ2ZXJTb2NrZXQgPT0gbnVsbCAmJiBpIDwgMTApIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJaSsrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHJ1bm5pbmcuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHJ1bm5pbmcsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0JCXJldHVybiAodGhyZWFkICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvcnJlY3RseSBjbG9zZSB0aGUgc2VydmVyIHNvY2tldCBhbmQgc2h1dCBkb3duIHRoZSBzZXJ2ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFNlcnZlcigpIHsKLQkJdHJ5IHsKLQkJCWFsaXZlID0gZmFsc2U7Ci0JCQl0aHJlYWQgPSBudWxsOwotCQkJCi0JCQlTdHJpbmcgcHJvdG9jb2xJZCA9IG1vbml0b3IuZ2V0UHJvdG9jb2woKTsKLQkJICAgUHJvdG9jb2xBZGFwdGVyIGFkYXB0ZXIgPSBNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJvdG9jb2xBZGFwdGVyKHByb3RvY29sSWQpOwotCQkJYWRhcHRlci5kaXNjb25uZWN0KG1vbml0b3IpOwotCQkJaWYgKHNlcnZlclNvY2tldCAhPSBudWxsKQotCQkJCXNlcnZlclNvY2tldC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc3RvcHBpbmcgc2VydmVyIiwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcG9ydCBpcyBpbiB1c2UuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gcG9ydCBpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQb3J0SW5Vc2UoaW50IHBvcnQpIHsKLQkJU2VydmVyU29ja2V0IHMgPSBudWxsOwotCQl0cnkgewotCQkJcyA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCk7Ci0JCX0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQ29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODZmYjM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0Nvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb24gewotCXByb3RlY3RlZCBTb2NrZXQgaW47Ci0JcHJvdGVjdGVkIFNvY2tldCBvdXQ7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbiBpbmJvdW5kIHNvY2tldAotCSAqIEBwYXJhbSBvdXQgb3V0Ym91bmQgc29ja2V0Ci0JICovCi0JcHVibGljIENvbm5lY3Rpb24oU29ja2V0IGluLCBTb2NrZXQgb3V0KSB7Ci0JCXRoaXMuaW4gPSBpbjsKLQkJdGhpcy5vdXQgPSBvdXQ7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkNsb3NpbmcgY29ubmVjdGlvbiIpOwotCQl0cnkgewotCQkJaW4uZ2V0T3V0cHV0U3RyZWFtKCkuZmx1c2goKTsKLQkJCWluLnNodXRkb3duSW5wdXQoKTsKLQkJCWluLnNodXRkb3duT3V0cHV0KCk7Ci0JCQkKLQkJCW91dC5nZXRPdXRwdXRTdHJlYW0oKS5mbHVzaCgpOwotCQkJb3V0LnNodXRkb3duSW5wdXQoKTsKLQkJCW91dC5zaHV0ZG93bk91dHB1dCgpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQ29ubmVjdGlvbiBjbG9zZWQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgY2xvc2luZyBjb25uZWN0aW9uICIgKyB0aGlzLCBleCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Db250ZW50RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Db250ZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTY0Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvQ29udGVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50RmlsdGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRGaWx0ZXIgaW1wbGVtZW50cyBJQ29udGVudEZpbHRlciB7Ci0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByb3RlY3RlZCBDb250ZW50RmlsdGVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0JCi0JcHJvdGVjdGVkIENvbnRlbnRGaWx0ZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGlkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBvcmRlciBmb3IgdGhpcyBmaWx0ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgb3JkZXIKLQkgKi8gCi0JcHVibGljIGludCBnZXRPcmRlcigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJvcmRlciIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyB0aGUgZmlsdGVyaW5nLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0Ci0JICogQHBhcmFtIGlzUmVxdWVzdCB0cnVlIGlmIHJlcXVlc3QsIGZhbHNlIGlmIHJlc3BvbnNlCi0JICogQHBhcmFtIGNvbnRlbnQgdGhlIGNvbnRlbnQKLQkgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCBjb250ZW50Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gcHJvYmxlbQotCSAqLwotCXB1YmxpYyBieXRlW10gZmlsdGVyKFJlcXVlc3QgcmVxdWVzdCwgYm9vbGVhbiBpc1JlcXVlc3QsIGJ5dGVbXSBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChDb250ZW50RmlsdGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBjb250ZW50IGZpbHRlciBkZWxlZ2F0ZTogIiArIGdldElkKCksIGUpOwotCQkJCXJldHVybiBuZXcgYnl0ZVswXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGUuZmlsdGVyKHJlcXVlc3QsIGlzUmVxdWVzdCwgY29udGVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvRmFpbGVkQ29ubmVjdGlvblRocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvRmFpbGVkQ29ubmVjdGlvblRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ0NTQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0ZhaWxlZENvbm5lY3Rpb25UaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotCi0vKioKLSAqIFRocmVhZCB1c2VkIGlmIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgZmFpbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWlsZWRDb25uZWN0aW9uVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSID0gMjA0ODsKLQlwcm90ZWN0ZWQgTW9uaXRvciBtb25pdG9yOwotCXByb3RlY3RlZCBTb2NrZXQgc29ja2V0OwotCXByb3RlY3RlZCBTdHJpbmcgZXJyb3I7Ci0KLQlwdWJsaWMgRmFpbGVkQ29ubmVjdGlvblRocmVhZChNb25pdG9yIG1vbml0b3IsIFNvY2tldCBzb2NrZXQsIFN0cmluZyBlcnJvcikgewotCQlzdXBlcigpOwotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQl0aGlzLnNvY2tldCA9IHNvY2tldDsKLQkJdGhpcy5lcnJvciA9IGVycm9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QobW9uaXRvciwgSVByb3RvY29sQWRhcHRlci5UQ1BJUF9QUk9UT0NPTF9JRCwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpKTsKLQkJU3RyaW5nIGVyciA9IGVycm9yOwotCQlpZiAoZXJyID09IG51bGwpCi0JCQllcnIgPSBNZXNzYWdlcy5lcnJvckNvbm5lY3RUb1NlcnZlcjsKLQkJcmVxdWVzdC5hZGRUb1Jlc3BvbnNlKGVyci5nZXRCeXRlcygpKTsKLQkJCi0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotCQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtCVUZGRVJdOwotCQkJd2hpbGUgKGluLmF2YWlsYWJsZSgpID4gMCkgewotCQkJCWludCBuID0gaW4ucmVhZChiKTsKLQkJCQlieXRlW10gYyA9IG5ldyBieXRlW25dOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgYywgMCwgbik7Ci0JCQkJcmVxdWVzdC5hZGRUb1JlcXVlc3QoYyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJc29ja2V0LnNodXRkb3duSW5wdXQoKTsKLQkJCQlzb2NrZXQuc2h1dGRvd25PdXRwdXQoKTsKLQkJCQlzb2NrZXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lDb250ZW50RmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JQ29udGVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWM3YmI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lDb250ZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBBIGNvbnRlbnQgZmlsdGVyIHRoYXQgZmlsdGVycyBzcGVjaWZpYyBjb250ZW50cyBmcm9tIHRoZSBtb25pdG9yIHRyYWZmaWMKLSAqIG9mIGEgcmVxdWVzdC4gCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50RmlsdGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGZpbHRlci4KLQkgKiBFYWNoIGZpbHRlciBoYXMgYSBkaXN0aW5jdCwgZml4ZWQgaWQuIElkcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IGFzIGtleXM7Ci0JICogdGhleSBhcmUgbm90IGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgKHRyYW5zbGF0ZWQpIG5hbWUgZm9yIHRoaXMgZmlsdGVyLgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbGF0aXZlIG9yZGVyIG9mIHRoaXMgZmlsdGVyLgotCSAqIEVhY2ggZmlsdGVyIGhhcyBhIHJlbGF0aXZlIG9yZGVyIHRoYXQgYWxsb3dzIHRoZW0gdG8gYmUgYXBwbGllZCBpbiB0aGUgY29ycmVjdAotCSAqIG9yZGVyIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuIExvd2VyIG9yZGVycyBhcmUgcHJvY2Vzc2VkIGZpcnN0LgotCSAqCi0JICogQHJldHVybiB0aGUgcmVsYXRpdmUgb3JkZXIKLQkgKiAKLQkgKiBbaXNzdWU6IENTIC0gVGhlIHNjaGVtYSAoY29udGVudEZpbHRlcm5zLmV4c2QpIGRlZmluZXMgYW4gJ29yZGVyJyBhdHRyaWJ1dGUuICAKLQkgKiBUaGUgY29tbWVudHMgYWJvdmUgc3VnZ2VzdCB0aGF0IGZpbHRlcnMgc2hvdWxkIGJlIGRlc2lnbmVkIHRvIGJlIGNvbXBvc2FibGUuICBJcyB0aGlzIGNvcnJlY3Q/ICAKLQkgKiBJdCB3b3VsZCBiZSBnb29kIHRvIG1ha2UgdGhpcyBvcHRpb25hbCBpZiB0aGUgdXNlciBoYWQgbm8gaWRlYSBob3cgaGlzIGZpbHRlciBzaG91bGQgYmUgb3JkZXJlZC4KLQkgKiBJJ3ZlIGZvdW5kIHRoYXQgc29tZXRpbWVzICdsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnIGFyZSBhZGVxdWF0ZSB0byBoYW5kbGUgb3JkZXJpbmcgaXNzdWVzIGFuZCBhcmUgCi0JICogZWFzaWVyIGZvciB0aGUgZXh0ZW5zaW9uIHdyaXRlciBkZWFsIHdpdGggYW5kIGdldCBhIHNlbnNlIG9mIHRoZSBwcm9wZXIgdmFsdWUgdG8gYXNzaWduLiBdCi0JICovCi0JLy9wdWJsaWMgaW50IGdldE9yZGVyKCk7Ci0KLQkvKioKLQkgKiBGaWx0ZXIgdGhlIGdpdmVuIGNvbnRlbnQgZnJvbSB0aGUgZ2l2ZW4gcmVxdWVzdC4gVGhlIGNvbnRlbnQgdGhhdCBoYXMgYmVlbiBmaWx0ZXJlZCBvdXQgd2lsbCAKLQkgKiBub3QgYmUgc2hvd24gdG8gY2xpZW50cyBvZiB0aGUgVENQL0lQIG1vbml0b3IuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdGhhdCB0aGUgZmlsdGVyIHdpbGwgYmUgcGVyZm9ybWVkIG9uCi0JICogQHBhcmFtIGlzUmVxdWVzdCBzZXQgdG8gdHJ1ZSBpZiB0aGUgY29udGVudCBmaWx0ZXIgYXBwbGllcyB0byByZXF1ZXN0IG1vbml0b3IgdHJhZmZpYywKLQkgKiAgICBvciBzZXQgdG8gZmFsc2UgaWYgdGhlIGNvbnRlbnQgZmlsdGVyIGFwcGxpZXMgdG8gdGhlIHJlc3BvbnNlIG1vbml0b3IgdHJhZmZpYwotCSAqIEBwYXJhbSBjb250ZW50IHRoZSBtZXNzYWdlIGNvbnRlbnQgdG8gYmUgZmlsdGVyZWQgb3V0Ci0JICogQHJldHVybiB0aGUgZmlsdGVyZWQgY29udGVudAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgcGFyc2luZyBvciBmaWx0ZXJpbmcgdGhlIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGZpbHRlcihSZXF1ZXN0IHJlcXVlc3QsIGJvb2xlYW4gaXNSZXF1ZXN0LCBieXRlW10gY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZTVmMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIEludGVyZmFjZSB0byBhIG1lbWVudG8gdXNlZCBmb3Igc2F2aW5nIHRoZSBpbXBvcnRhbnQgc3RhdGUgb2YgYW4gb2JqZWN0Ci0gKiBpbiBhIGZvcm0gdGhhdCBjYW4gYmUgcGVyc2lzdGVkIGluIHRoZSBmaWxlIHN5c3RlbS4KLSAqIDxwPgotICogTWVtZW50b3Mgd2VyZSBkZXNpZ25lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGluIG1pbmQ6Ci0gKiA8b2w+Ci0gKiAgPGxpPkNlcnRhaW4gb2JqZWN0cyBuZWVkIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgcGxhdGZvcm0gc2Vzc2lvbnMuCi0gKiAgICA8L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgYW4gYXBwcm9wcmlhdGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtaWdodCBub3QKLSAqICAgIGJlIGF2YWlsYWJsZS4gSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBza2lwIGFuIG9iamVjdCBpbiB0aGlzIGNhc2UuPC9saT4KLSAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgdGhlIG9iamVjdCBtYXkgYmUKLSAqICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2hlbiB0aGUgb2JqZWN0IHdhcyBvcmlnaW5hbGx5IHNhdmVkLiBJZiBzbywgdGhlCi0gKiAgICBuZXcgY2xhc3Mgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIGZvcm0gb2YgdGhlIGRhdGEuPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1lbWVudG9zIG1lZXQgdGhlc2UgcmVxdWlyZW1lbnRzIGJ5IHByb3ZpZGluZyBzdXBwb3J0IGZvciBzdG9yaW5nIGEKLSAqIG1hcHBpbmcgb2YgYXJiaXRyYXJ5IHN0cmluZyBrZXlzIHRvIHByaW1pdGl2ZSB2YWx1ZXMsIGFuZCBieSBhbGxvd2luZwotICogbWVtZW50b3MgdG8gaGF2ZSBvdGhlciBtZW1lbnRvcyBhcyBjaGlsZHJlbiAoYXJyYW5nZWQgaW50byBhIHRyZWUpLgotICogQSByb2J1c3QgZXh0ZXJuYWwgc3RvcmFnZSBmb3JtYXQgYmFzZWQgb24gWE1MIGlzIHVzZWQuCi0gKiA8L3A+PHA+Ci0gKiBUaGUga2V5IGZvciBhbiBhdHRyaWJ1dGUgbWF5IGJlIGFueSBhbHBoYSBudW1lcmljIHZhbHVlLiAgSG93ZXZlciwgdGhlCi0gKiB2YWx1ZSBvZiA8Y29kZT5UQUdfSUQ8L2NvZGU+IGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVtZW50byB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBvZiB0aGlzIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcwotCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50bwotCSAqIEBzZWUgI2dldENoaWxkCi0JICogQHNlZSAjZ2V0Q2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW4gdHlwZQotCSAqLwotCXB1YmxpYyBJTWVtZW50b1tdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogICBidXQgd2FzIG5vdCBhbiBpbnRlZ2VyCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SW50ZWdlcihTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKLQkgKiAgYnV0IHdhcyBub3QgYW4gaW50ZWdlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKLQkgKiAgYnV0IHdhcyBub3QgYSBib29sZWFuCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIGludGVnZXIuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgdmFsdWUpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIGJvb2xlYW4gdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JUHJvdG9jb2xBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JUHJvdG9jb2xBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTgzOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSVByb3RvY29sQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIEEgcHJvdG9jb2wgYWRhcHRlciBlbmFibGVzIGEgbW9uaXRvciB0byBzdXBwb3J0IGEgcGFydGljdWxhciBuZXR3b3JrCi0gKiBwcm90b2NvbCB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gQWxsIHN1cHBvcnRlZAotICogcHJvdG9jb2xzIHdpbGwgYmUgYmFzZWQgb24gVENQL0lQLgotICogPHA+Ci0gKiBQcm90b2NvbCBhZGFwdGVycyBhcmUgcmVnaXN0ZXJlZCB2aWEgdGhlIDxjb2RlPnByb3RvY29sQWRhcGF0ZXJzPC9jb2RlPgotICogZXh0ZW5zaW9uIHBvaW50IGluIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlPC9jb2RlPgotICogcGx1Zy1pbi4gVGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIHByb3RvY29sIGFkYXB0ZXJzIGlzIGF2YWlsYWJsZSB2aWEKLSAqIHtAbGluayBNb25pdG9yUGx1Z2luI2dldFByb3RvY29sQWRhcHRlcnMoKX0uIFN0YW5kYXJkIHByb3RvY29sCi0gKiBhZGFwdGVycyBmb3Ige0BsaW5rcGxhaW4gI0hUVFBfUFJPVE9DT0xfSUQgSFRUUH0gYW5kCi0gKiB7QGxpbmtwbGFpbiAjVENQSVBfUFJPVE9DT0xfSUQgVENQL0lQfSBhcmUgYnVpbHQtaW4uCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm90b2NvbEFkYXB0ZXIgewotCS8qKgotCSAqIFByb3RvY29sIGFkYXB0ZXIgaWQgKHZhbHVlIHtAdmFsdWV9KSBmb3IgVENQL0lQLgotCSAqIFRoZSBUQ1AvSVAgcHJvdG9jb2wgYWRhcHRlciBpcyBzdGFuZGFyZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQ1BJUF9QUk9UT0NPTF9JRCA9ICJUQ1AvSVAiOwotCi0JLyoqCi0JICogUHJvdG9jb2wgYWRhcHRlciBpZCAodmFsdWUge0B2YWx1ZX0pIGZvciBIVFRQLgotCSAqIFRoZSBIVFRQIHByb3RvY29sIGFkYXB0ZXIgaXMgc3RhbmRhcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRUUF9QUk9UT0NPTF9JRCA9ICJIVFRQIjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgYWRhcHRlci4KLQkgKiBFYWNoIGFkYXB0ZXIgaGFzIGEgZGlzdGluY3QsIGZpeGVkIGlkLiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQKLQkgKiBpbnRlcm5hbGx5IGFzIGtleXM7IHRoZXkgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgZWxlbWVudCBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlICh0cmFuc2xhdGVkKSBuYW1lIGZvciB0aGlzIGFkYXB0ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSVN0YXJ0dXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lTdGFydHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MTQxNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSVN0YXJ0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgdGhlIHN0YXJ0dXAgZXh0ZW5zaW9uIHBvaW50LgotICogUGx1Zy1pbnMgdGhhdCByZWdpc3RlciBhIHN0YXJ0dXAgZXh0ZW5zaW9uIHdpbGwgYmUgYWN0aXZhdGVkIHdoZW4gdGhlIG1vbml0b3IKLSAqIGNvcmUgcGx1Zy1pbiBpbml0aWFsaXplcyBhbmQgaGF2ZSBhbiBvcHBvcnR1bml0eSB0byBydW4gY29kZSB0aGF0IGNhbid0IGJlCi0gKiBpbXBsZW1lbnRlZCB1c2luZyB0aGUgbm9ybWFsIGNvbnRyaWJ1dGlvbiBtZWNoYW5pc21zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGFydHVwIHsKLQkvKioKLQkgKiBXaWxsIGJlIGNhbGxlZCBvbiBtb25pdG9yIGNvcmUgc3RhcnR1cC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0YWQ0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFRyYW5zbGF0ZWQgbWVzc2FnZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnZhbGlkTG9jYWxQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW52YWxpZFJlbW90ZVBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnZhbGlkUmVtb3RlSG9zdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvbm5lY3RUb1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvbm5lY3RUaW1lb3V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vbml0b3JWYWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclBvcnRJblVzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvbnRlbnRTaXplOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOWMzZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEVycm9ycyAtLS0tLS0tLS0tLS0tLS0KLWVycm9yUG9ydEluVXNlPVRoZSBUQ1AvSVAgbW9uaXRvciBjb3VsZCBub3Qgc3RhcnQgYmVjYXVzZSBwb3J0IHswfSBpcyBpbiB1c2UuCi1lcnJvckludmFsaWRMb2NhbFBvcnQ9VGhlIGxvY2FsIHBvcnQgbnVtYmVyIGlzIGludmFsaWQuCi1lcnJvckludmFsaWRSZW1vdGVQb3J0PVRoZSByZW1vdGUgcG9ydCBudW1iZXIgaXMgaW52YWxpZC4KLWVycm9ySW52YWxpZFJlbW90ZUhvc3Q9VGhlIHJlbW90ZSBob3N0IG5hbWUgaXMgaW52YWxpZC4KLWVycm9yQ29ubmVjdFRvU2VydmVyPUVycm9yOiBDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIuCi1lcnJvckNvbm5lY3RUaW1lb3V0PUVycm9yOiBUaW1lb3V0IGNvbm5lY3RpbmcgdG8gc2VydmVyLgotZXJyb3JDb250ZW50U2l6ZT1UaGUgSFRUUCBjb250ZW50IGlzIHRvbyBsYXJnZSB0byBkaXNwbGF5LgotCi1tb25pdG9yVmFsaWQ9VGhlIG1vbml0b3IgaXMgdmFsaWQuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZGJjMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkgLSBTdGFydCBtb25pdG9ycyBieSBkZWZhdWx0IAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3IgaW1wbGVtZW50cyBJTW9uaXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fSUQgPSAiaWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1FTlRPX0xPQ0FMX1BPUlQgPSAibG9jYWwtcG9ydCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fUkVNT1RFX0hPU1QgPSAicmVtb3RlLWhvc3QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1FTlRPX1JFTU9URV9QT1JUID0gInJlbW90ZS1wb3J0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNRU5UT19UWVBFX0lEID0gInR5cGUtaWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1FTlRPX1RJTUVPVVQgPSAidGltZW91dCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fQVVUT19TVEFSVCA9ICJhdXRvLXN0YXJ0IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREQgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0UgPSAxOwotCi0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlbW90ZUhvc3Q7Ci0JcHJvdGVjdGVkIGludCByZW1vdGVQb3J0ID0gODA7Ci0JcHJvdGVjdGVkIGludCBsb2NhbFBvcnQgPSA4MDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3RvY29sSWQ7Ci0JcHJvdGVjdGVkIGludCB0aW1lb3V0OwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9TdGFydCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIExpc3Q8SVJlcXVlc3RMaXN0ZW5lcj4gcmVxdWVzdExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVJlcXVlc3RMaXN0ZW5lcj4oMik7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9uaXRvci4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvcigpIHsKLQkJcHJvdG9jb2xJZCA9IE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0VHlwZSgpOwotCX0KLQkKLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UmVtb3RlSG9zdCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgewotCQlyZXR1cm4gcmVtb3RlSG9zdDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UmVtb3RlUG9ydCgpCi0JICovCi0JcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgewotCQlyZXR1cm4gcmVtb3RlUG9ydDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0TG9jYWxQb3J0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKLQkJcmV0dXJuIGxvY2FsUG9ydDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UHJvdG9jb2woKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7Ci0JCXJldHVybiBwcm90b2NvbElkOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTW9uaXRvciNnZXRUaW1lb3V0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRpbWVvdXQoKSB7Ci0JCXJldHVybiB0aW1lb3V0OwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTW9uaXRvciNpc0F1dG9TdGFydCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvU3RhcnQoKSB7Ci0JCXJldHVybiBhdXRvU3RhcnQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElNb25pdG9yI2lzUnVubmluZygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgewotCQlpZiAoaXNXb3JraW5nQ29weSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc1J1bm5pbmcodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3IjZGVsZXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0JCWlmIChpc1dvcmtpbmdDb3B5KCkpCi0JCQlyZXR1cm47Ci0JCU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlTW9uaXRvcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb25pdG9yI2lzV29ya2luZ0NvcHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJTW9uaXRvciNjcmVhdGVXb3JraW5nQ29weSgpCi0JICovCi0JcHVibGljIElNb25pdG9yV29ya2luZ0NvcHkgY3JlYXRlV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiBuZXcgTW9uaXRvcldvcmtpbmdDb3B5KHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsKElNb25pdG9yIG1vbml0b3IpIHsKLQkJaWQgPSBtb25pdG9yLmdldElkKCk7Ci0JCXJlbW90ZUhvc3QgPSBtb25pdG9yLmdldFJlbW90ZUhvc3QoKTsKLQkJcmVtb3RlUG9ydCA9IG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpOwotCQlsb2NhbFBvcnQgPSBtb25pdG9yLmdldExvY2FsUG9ydCgpOwotCQlwcm90b2NvbElkID0gbW9uaXRvci5nZXRQcm90b2NvbCgpOwotCQl0aW1lb3V0ID0gbW9uaXRvci5nZXRUaW1lb3V0KCk7Ci0JCWF1dG9TdGFydCA9IG1vbml0b3IuaXNBdXRvU3RhcnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJbWVtZW50by5wdXRTdHJpbmcoTUVNRU5UT19JRCwgaWQpOwotCQltZW1lbnRvLnB1dFN0cmluZyhNRU1FTlRPX1RZUEVfSUQsIHByb3RvY29sSWQpOwotCQltZW1lbnRvLnB1dEludGVnZXIoTUVNRU5UT19MT0NBTF9QT1JULCBsb2NhbFBvcnQpOwotCQltZW1lbnRvLnB1dFN0cmluZyhNRU1FTlRPX1JFTU9URV9IT1NULCByZW1vdGVIb3N0KTsKLQkJbWVtZW50by5wdXRJbnRlZ2VyKE1FTUVOVE9fUkVNT1RFX1BPUlQsIHJlbW90ZVBvcnQpOwotCQltZW1lbnRvLnB1dEludGVnZXIoTUVNRU5UT19USU1FT1VULCB0aW1lb3V0KTsKLQkJbWVtZW50by5wdXRCb29sZWFuKE1FTUVOVE9fQVVUT19TVEFSVCwgYXV0b1N0YXJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJaWQgPSBtZW1lbnRvLmdldFN0cmluZyhNRU1FTlRPX0lEKTsKLQkJcHJvdG9jb2xJZCA9IG1lbWVudG8uZ2V0U3RyaW5nKE1FTUVOVE9fVFlQRV9JRCk7Ci0JCUludGVnZXIgdGVtcCA9IG1lbWVudG8uZ2V0SW50ZWdlcihNRU1FTlRPX0xPQ0FMX1BPUlQpOwotCQlpZiAodGVtcCAhPSBudWxsKQotCQkJbG9jYWxQb3J0ID0gdGVtcC5pbnRWYWx1ZSgpOwotCQlyZW1vdGVIb3N0ID0gbWVtZW50by5nZXRTdHJpbmcoTUVNRU5UT19SRU1PVEVfSE9TVCk7Ci0JCXRlbXAgPSBtZW1lbnRvLmdldEludGVnZXIoTUVNRU5UT19SRU1PVEVfUE9SVCk7Ci0JCWlmICh0ZW1wICE9IG51bGwpCi0JCQlyZW1vdGVQb3J0ID0gdGVtcC5pbnRWYWx1ZSgpOwotCQl0ZW1wID0gbWVtZW50by5nZXRJbnRlZ2VyKE1FTUVOVE9fVElNRU9VVCk7Ci0JCWlmICh0ZW1wICE9IG51bGwpCi0JCQl0aW1lb3V0ID0gdGVtcC5pbnRWYWx1ZSgpOwotCQlCb29sZWFuIHRlbXAyID0gbWVtZW50by5nZXRCb29sZWFuKE1FTUVOVE9fQVVUT19TVEFSVCk7Ci0JCWlmICh0ZW1wICE9IG51bGwpCi0JCQlhdXRvU3RhcnQgPSB0ZW1wMi5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJTW9uaXRvciNzdGFydCgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaXNSdW5uaW5nKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChpc1dvcmtpbmdDb3B5KCkgfHwgIU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZXhpc3RzKHRoaXMpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZSgpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkKLQkJTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zdGFydE1vbml0b3IodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3Ijc3RhcnQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlpZiAoaXNXb3JraW5nQ29weSgpIHx8ICFNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmV4aXN0cyh0aGlzKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJaWYgKCFpc1J1bm5pbmcoKSkKLQkJCXJldHVybjsKLQkJTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zdG9wTW9uaXRvcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJTW9uaXRvciNhZGRSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCWlmICghcmVxdWVzdExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQlyZXF1ZXN0TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3IjcmVtb3ZlUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVJlcXVlc3RMaXN0ZW5lcihJUmVxdWVzdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlyZXF1ZXN0TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEZpcmUgYSByZXF1ZXN0IGV2ZW50LgotCSAqIEBwYXJhbSBycgotCSAqIEBwYXJhbSB0eXBlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJlcXVlc3RFdmVudChSZXF1ZXN0IHJyLCBpbnQgdHlwZSkgewotCQlpbnQgc2l6ZSA9IHJlcXVlc3RMaXN0ZW5lcnMuc2l6ZSgpOwotCQlJUmVxdWVzdExpc3RlbmVyW10gcmwgPSBuZXcgSVJlcXVlc3RMaXN0ZW5lcltzaXplXTsKLQkJcmVxdWVzdExpc3RlbmVycy50b0FycmF5KHJsKTsKLQkJCi0JCWZvciAoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lciA6IHJsKSB7Ci0JCQlpZiAodHlwZSA9PSBBREQpCi0JCQkJbGlzdGVuZXIucmVxdWVzdEFkZGVkKHRoaXMsIHJyKTsKLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ0hBTkdFKQotCQkJCWxpc3RlbmVyLnJlcXVlc3RDaGFuZ2VkKHRoaXMsIHJyKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGQgYSBuZXcgcmVxdWVzdCByZXNwb25zZSBwYWlyLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IGEgcmVxdWVzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpcmVSZXF1ZXN0RXZlbnQocmVxdWVzdCwgQUREKTsKLQl9Ci0KLQkvKioKLQkgKiBBIHJlcXVlc3QgcmVzcG9uc2UgcGFpciBoYXMgYmVlbiBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IGEgcmVxdWVzdAotCSAqLwotCXB1YmxpYyB2b2lkIHJlcXVlc3RDaGFuZ2VkKFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaXJlUmVxdWVzdEV2ZW50KHJlcXVlc3QsIENIQU5HRSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3IjdmFsaWRhdGUoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlpZiAobG9jYWxQb3J0IDwgMCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vbml0b3JQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckludmFsaWRMb2NhbFBvcnQsIG51bGwpOwotCQkKLQkJaWYgKHJlbW90ZVBvcnQgPCAwKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9ySW52YWxpZFJlbW90ZVBvcnQsIG51bGwpOwotCQkKLQkJaWYgKHJlbW90ZUhvc3QgPT0gbnVsbCB8fCByZW1vdGVIb3N0Lmxlbmd0aCgpID09IDAgfHwgIWlzVmFsaWRIb3N0bmFtZShyZW1vdGVIb3N0KSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vbml0b3JQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckludmFsaWRSZW1vdGVIb3N0LCBudWxsKTsKLQkJCi0JCWlmIChpc0xvY2FsaG9zdChyZW1vdGVIb3N0KSAmJiBsb2NhbFBvcnQgPT0gcmVtb3RlUG9ydCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vbml0b3JQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckludmFsaWRMb2NhbFBvcnQsIG51bGwpOwotCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEhvc3RuYW1lKFN0cmluZyBob3N0KSB7Ci0JCWlmIChob3N0ID09IG51bGwgfHwgaG9zdC50cmltKCkubGVuZ3RoKCkgPCAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IGxlbmd0aCA9IGhvc3QubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgYyA9IGhvc3QuY2hhckF0KGkpOwotCQkJaWYgKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpICYmIGMgIT0gJzonICYmIGMgIT0gJy4nICYmIGMgIT0gJy0nKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaG9zdC5lbmRzV2l0aCgiOiIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNMb2NhbGhvc3QoU3RyaW5nIGhvc3QpIHsKLQkJaWYgKGhvc3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmICgibG9jYWxob3N0Ii5lcXVhbHMoaG9zdCkgfHwgIjEyNy4wLjAuMSIuZXF1YWxzKGhvc3QpKQotCQkJCXJldHVybiB0cnVlOwotCQkJSW5ldEFkZHJlc3MgbG9jYWxIb3N0YWRkciA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJaWYgKGxvY2FsSG9zdGFkZHIuZ2V0SG9zdE5hbWUoKS5lcXVhbHMoaG9zdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgY2hlY2tpbmcgZm9yIGxvY2FsaG9zdCIsIGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb25pdG9yIFsiICsgZ2V0SWQoKSArICIsICIgKyBnZXRQcm90b2NvbCgpICsgIiwgIiArIGdldExvY2FsUG9ydCgpICsgIiwgIgotCQkJKyBnZXRSZW1vdGVIb3N0KCkgKyAiLCAiICsgZ2V0UmVtb3RlUG9ydCgpICsgIl0iOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIE1vbml0b3IpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJSU1vbml0b3IgbSA9IChJTW9uaXRvcikgb2JqOwotCQlpZiAobS5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCW0gPSAoKElNb25pdG9yV29ya2luZ0NvcHkpIG0pLmdldE9yaWdpbmFsKCk7Ci0JCQlpZiAobSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaWQgPT0gbnVsbCAmJiBtLmdldElkKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlkICE9IG51bGwgJiYgIWlkLmVxdWFscyhtLmdldElkKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKGxvY2FsUG9ydCAhPSBtLmdldExvY2FsUG9ydCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocmVtb3RlUG9ydCAhPSBtLmdldFJlbW90ZVBvcnQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChyZW1vdGVIb3N0ID09IG51bGwgJiYgbS5nZXRSZW1vdGVIb3N0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHJlbW90ZUhvc3QgIT0gbnVsbCAmJiAhcmVtb3RlSG9zdC5lcXVhbHMobS5nZXRSZW1vdGVIb3N0KCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHByb3RvY29sSWQgPT0gbnVsbCAmJiBtLmdldFByb3RvY29sKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHByb3RvY29sSWQgIT0gbnVsbCAmJiAhcHJvdG9jb2xJZC5lcXVhbHMobS5nZXRQcm90b2NvbCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTW9uaXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1YzU1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvck1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREQgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0UgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAyOwotCi0JLy8gbW9uaXRvcnMKLQlwcm90ZWN0ZWQgTGlzdDxJTW9uaXRvcj4gbW9uaXRvcnM7Ci0JcHJvdGVjdGVkIE1hcDxJTW9uaXRvciwgQWNjZXB0VGhyZWFkPiB0aHJlYWRzID0gbmV3IEhhc2hNYXA8SU1vbml0b3IsIEFjY2VwdFRocmVhZD4oKTsKLQkKLQlwcm90ZWN0ZWQgTGlzdDxJTW9uaXRvckxpc3RlbmVyPiBtb25pdG9yTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJTW9uaXRvckxpc3RlbmVyPigpOwotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwY2w7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgTWFwPFJlcXVlc3QsIExpc3Q8UmVzZW5kSFRUUFJlcXVlc3Q+PiByZXNlbmRNYXAgPSBuZXcgSGFzaE1hcDxSZXF1ZXN0LCBMaXN0PFJlc2VuZEhUVFBSZXF1ZXN0Pj4oKTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIE1vbml0b3JNYW5hZ2VyIGluc3RhbmNlOwotCQotCXN0YXRpYyB7Ci0JCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5leGVjdXRlU3RhcnR1cHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgc3RhdGljIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBNb25pdG9yTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IE1vbml0b3JNYW5hZ2VyKCk7Ci0JCQlpbnN0YW5jZS5zdGFydE1vbml0b3JzKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb25pdG9yTWFuYWdlcigpIHsKLQkJbG9hZE1vbml0b3JzKCk7Ci0JCQotCQlwY2wgPSBuZXcgUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGlnbm9yZVByZWZlcmVuY2VDaGFuZ2VzKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCQlpZiAocHJvcGVydHkuZXF1YWxzKCJtb25pdG9ycyIpKSB7Ci0JCQkJCWxvYWRNb25pdG9ycygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwY2wpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9uaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBJTW9uaXRvcldvcmtpbmdDb3B5IGNyZWF0ZU1vbml0b3IoKSB7Ci0JCXJldHVybiBuZXcgTW9uaXRvcldvcmtpbmdDb3B5KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBvZiBtb25pdG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIG1vbml0b3JzCi0JICovCi0JcHVibGljIExpc3Q8SU1vbml0b3I+IGdldE1vbml0b3JzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxJTW9uaXRvcj4obW9uaXRvcnMpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNb25pdG9yKElNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKCFtb25pdG9ycy5jb250YWlucyhtb25pdG9yKSkKLQkJCW1vbml0b3JzLmFkZChtb25pdG9yKTsKLQkJZmlyZU1vbml0b3JFdmVudChtb25pdG9yLCBBREQpOwotCQlzYXZlTW9uaXRvcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSdW5uaW5nKElNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuICh0aHJlYWRzLmdldChtb25pdG9yKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBhIG1vbml0b3IuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydE1vbml0b3IoSU1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIW1vbml0b3JzLmNvbnRhaW5zKG1vbml0b3IpKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKEFjY2VwdFRocmVhZC5pc1BvcnRJblVzZShtb25pdG9yLmdldExvY2FsUG9ydCgpKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUG9ydEluVXNlLCBtb25pdG9yLmdldExvY2FsUG9ydCgpICsgIiIpLCBudWxsKSk7Ci0JCQotCQlBY2NlcHRUaHJlYWQgdGhyZWFkID0gbmV3IEFjY2VwdFRocmVhZChtb25pdG9yKTsKLQkJdGhyZWFkLnN0YXJ0U2VydmVyKCk7Ci0JCXRocmVhZHMucHV0KG1vbml0b3IsIHRocmVhZCk7Ci0JfQotCQotCS8qKgotCSAqIFN0b3AgYSBtb25pdG9yLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgc3RvcE1vbml0b3IoSU1vbml0b3IgbW9uaXRvcikgewotCQlpZiAoIW1vbml0b3JzLmNvbnRhaW5zKG1vbml0b3IpKQotCQkJcmV0dXJuOwotCQkKLQkJQWNjZXB0VGhyZWFkIHRocmVhZCA9IHRocmVhZHMuZ2V0KG1vbml0b3IpOwotCQlpZiAodGhyZWFkICE9IG51bGwpIHsKLQkJCXRocmVhZC5zdG9wU2VydmVyKCk7Ci0JCQl0aHJlYWRzLnJlbW92ZShtb25pdG9yKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTW9uaXRvcihJTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yLmlzUnVubmluZygpKQotCQkJc3RvcE1vbml0b3IobW9uaXRvcik7Ci0JCW1vbml0b3JzLnJlbW92ZShtb25pdG9yKTsKLQkJZmlyZU1vbml0b3JFdmVudChtb25pdG9yLCBSRU1PVkUpOwotCQlzYXZlTW9uaXRvcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIG1vbml0b3JDaGFuZ2VkKElNb25pdG9yIG1vbml0b3IpIHsKLQkJZmlyZU1vbml0b3JFdmVudChtb25pdG9yLCBDSEFOR0UpOwotCQlzYXZlTW9uaXRvcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhpc3RzKElNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIChtb25pdG9ycy5jb250YWlucyhtb25pdG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBtb25pdG9yIGxpc3RlbmVyLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIW1vbml0b3JMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQotCQkJbW9uaXRvckxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBtb25pdG9yIGxpc3RlbmVyLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobW9uaXRvckxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQltb25pdG9yTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEZpcmUgYSBtb25pdG9yIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9uaXRvckV2ZW50KElNb25pdG9yIG1vbml0b3IsIGludCB0eXBlKSB7Ci0JCUlNb25pdG9yTGlzdGVuZXJbXSBvYmogPSBtb25pdG9yTGlzdGVuZXJzLnRvQXJyYXkobmV3IElNb25pdG9yTGlzdGVuZXJbbW9uaXRvckxpc3RlbmVycy5zaXplKCldKTsKLQkJCi0JCWZvciAoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IG9iaikgewotCQkJaWYgKHR5cGUgPT0gQUREKQotCQkJCWxpc3RlbmVyLm1vbml0b3JBZGRlZChtb25pdG9yKTsKLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ0hBTkdFKQotCQkJCWxpc3RlbmVyLm1vbml0b3JDaGFuZ2VkKG1vbml0b3IpOwotCQkJZWxzZSBpZiAodHlwZSA9PSBSRU1PVkUpCi0JCQkJbGlzdGVuZXIubW9uaXRvclJlbW92ZWQobW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbG9hZE1vbml0b3JzKCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMb2FkaW5nIG1vbml0b3JzIik7Ci0JCQotCQltb25pdG9ycyA9IG5ldyBBcnJheUxpc3Q8SU1vbml0b3I+KCk7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyB4bWxTdHJpbmcgPSBwcmVmcy5nZXRTdHJpbmcoIm1vbml0b3JzIik7Ci0JCWlmICh4bWxTdHJpbmcgIT0gbnVsbCAmJiB4bWxTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0cnkgewotCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0cmluZy5nZXRCeXRlcygiVVRGLTgiKSk7Ci0JCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oaW4pOwotCQkKLQkJCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigibW9uaXRvciIpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJTW9uaXRvciBtb25pdG9yID0gbmV3IE1vbml0b3IoKTsKLQkJCQkJCW1vbml0b3IubG9hZChjaGlsZHJlbltpXSk7Ci0JCQkJCQltb25pdG9ycy5hZGQobW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBtb25pdG9ycyIsIGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlTW9uaXRvcnMoKSB7Ci0JCXRyeSB7Ci0JCQlpZ25vcmVQcmVmZXJlbmNlQ2hhbmdlcyA9IHRydWU7Ci0JCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgibW9uaXRvcnMiKTsKLQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb25pdG9ycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCU1vbml0b3IgbW9uaXRvciA9IChNb25pdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJtb25pdG9yIik7Ci0JCQkJbW9uaXRvci5zYXZlKGNoaWxkKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIHhtbFN0cmluZyA9IG1lbWVudG8uc2F2ZVRvU3RyaW5nKCk7Ci0JCQlQcmVmZXJlbmNlcyBwcmVmcyA9IE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJcHJlZnMuc2V0VmFsdWUoIm1vbml0b3JzIiwgeG1sU3RyaW5nKTsKLQkJCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIGJyb3dzZXJzIiwgZSk7Ci0JCX0KLQkJaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyByZXNlbmQgcmVxdWVzdCBmcm9tIHRoZSBnaXZlbiByZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IHRoYXQgaXMgdG8gYmUgcmVzZW50OyBtYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBhIG5ldyByZXNlbmQgcmVxdWVzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzZW5kSFRUUFJlcXVlc3QgY3JlYXRlUmVzZW5kUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIG5ldyBSZXNlbmRIVFRQUmVxdWVzdCgoTW9uaXRvcilyZXF1ZXN0LmdldE1vbml0b3IoKSwgcmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHJlc2VuZCByZXF1ZXN0IHRvIHRoaXMgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVzZW5kIHJlcXVlc3QgdG8gYWRkCi0JICogQHBhcmFtIHJlc2VuZFJlcSB0aGUgcmVzZW5kIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXNlbmRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCwgUmVzZW5kSFRUUFJlcXVlc3QgcmVzZW5kUmVxKSB7Ci0JCWlmIChyZXF1ZXN0ID09IG51bGwgfHwgcmVzZW5kUmVxID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlMaXN0PFJlc2VuZEhUVFBSZXF1ZXN0PiBsaXN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWxpc3QgPSByZXNlbmRNYXAuZ2V0KHJlcXVlc3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJCi0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc2VuZEhUVFBSZXF1ZXN0PigpOwotCQkJcmVzZW5kTWFwLnB1dChyZXF1ZXN0LCBsaXN0KTsKLQkJfQotCQlsaXN0LmFkZChyZXNlbmRSZXEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVzZW5kIHJlcXVlc3RzIGJhc2VkIG9uIHRoaXMgcmVxdWVzdC4gCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QgYSByZXF1ZXN0Ci0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgcmVzZW5kIHJlcXVlc3RzIGJhc2VkIG9uIHRoaXMgcmVxdWVzdAotCSAqLwotCXB1YmxpYyBSZXNlbmRIVFRQUmVxdWVzdFtdIGdldFJlc2VuZFJlcXVlc3RzKFJlcXVlc3QgcmVxdWVzdCkgewotCQlMaXN0PFJlc2VuZEhUVFBSZXF1ZXN0PiBsaXN0ID0gcmVzZW5kTWFwLmdldChyZXF1ZXN0KTsKLQkJaWYgKGxpc3QgIT0gbnVsbCkKLQkJCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IFJlc2VuZEhUVFBSZXF1ZXN0W2xpc3Quc2l6ZSgpXSk7Ci0JCQotCQlyZXR1cm4gbmV3IFJlc2VuZEhUVFBSZXF1ZXN0WzBdOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0IGFsbCBtb25pdG9ycyB0aGF0IGFyZSBzZXQgdG8gYXV0by1zdGFydC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnRNb25pdG9ycygpIHsKLQkJTW9uaXRvck1hbmFnZXIgbWFuYWdlciA9IE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCUxpc3QgbW9uaXRvckxpc3QgPSBtYW5hZ2VyLmdldE1vbml0b3JzKCk7Ci0JCUl0ZXJhdG9yIG1vbml0b3JJdGVyYXRvciA9IG1vbml0b3JMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChtb25pdG9ySXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBtb25pdG9ySXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG1vbml0b3IuaXNBdXRvU3RhcnQoKSkKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLnN0YXJ0KCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkZhaWxlZCB0byBzdGFydCBtb25pdG9yOiIgKyBtb25pdG9yLnRvU3RyaW5nKCksIGUpOwotCQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNzliMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTW9uaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBUaGUgbW9uaXRvciBjb3JlIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8qKgotCSAqIFRoZSBwbHVnaW4vYnVuZGxlIGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIjsKLQotCXByaXZhdGUgc3RhdGljIE1vbml0b3JQbHVnaW4gc2luZ2xldG9uOwotCQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBQcm90b2NvbEFkYXB0ZXI+IHByb3RvY29sQWRhcHRlcnM7Ci0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIElDb250ZW50RmlsdGVyPiBjb250ZW50RmlsdGVyczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydHVwc0xvYWRlZDsKLQotCS8qKgotCSAqIE1vbml0b3JQbHVnaW4gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvclBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJc2luZ2xldG9uID0gdGhpczsKLQkJbG9hZFByb3RvY29sQWRhcHRlcnMoKTsKLQkJbG9hZENvbnRlbnRGaWx0ZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLk1vbml0b3JQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vbml0b3JQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBwcm90b2NvbCB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3RvY29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuICJIVFRQIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm90b2NvbCBhZGFwdGVyIHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duCi0JICogcHJvdG9jb2wgYWRhcHRlcnMgKHtAbGluayAjZ2V0UHJvdG9jb2xBZGFwdGVycygpfSkgZm9yIHRoZSBvbmUgd2l0aCBhCi0JICogbWF0Y2hpbmcgaWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIHByb3RvY29sIGFkYXB0ZXIgaWQ7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgcHJvdG9jb2wgYWRhcHRlciBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUKLQkgKiAgIGlzIG5vIHByb3RvY29sIGFkYXB0ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgUHJvdG9jb2xBZGFwdGVyIGdldFByb3RvY29sQWRhcHRlcihTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIHByb3RvY29sQWRhcHRlcnMuZ2V0KGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwga25vd24gcHJvdG9jb2wgYWRhcHRlciBpbnN0YW5jZXMuCi0JICogPHA+Ci0JICogUHJvdG9jb2wgYWRhcHRlcnMgYXJlIHJlZ2lzdGVyZWQgdmlhIHRoZSA8Y29kZT5wcm90b2NvbEFkYXBhdGVyczwvY29kZT4KLQkgKiBleHRlbnNpb24gcG9pbnQgaW4gdGhlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmU8L2NvZGU+Ci0JICogcGx1Zy1pbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsOyBjbGllbnRzIG1heSBzYWZlbHkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBwcm90b2NvbCBhZGFwdGVyIGluc3RhbmNlcwotCSAqLwotCXB1YmxpYyBQcm90b2NvbEFkYXB0ZXJbXSBnZXRQcm90b2NvbEFkYXB0ZXJzKCkgewotCQlMaXN0PFByb3RvY29sQWRhcHRlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvdG9jb2xBZGFwdGVyPigpOwotCQlJdGVyYXRvcjxQcm90b2NvbEFkYXB0ZXI+IGl0ZXJhdG9yID0gcHJvdG9jb2xBZGFwdGVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlsaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCVByb3RvY29sQWRhcHRlcltdIHR5cGVzID0gbmV3IFByb3RvY29sQWRhcHRlcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheSh0eXBlcyk7Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRlbnQgZmlsdGVycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbnRlbnQgZmlsdGVycwotCSAqLwotCXB1YmxpYyBJQ29udGVudEZpbHRlcltdIGdldENvbnRlbnRGaWx0ZXJzKCkgewotCQlMaXN0PElDb250ZW50RmlsdGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJQ29udGVudEZpbHRlcj4oKTsKLQkJSXRlcmF0b3I8SUNvbnRlbnRGaWx0ZXI+IGl0ZXJhdG9yID0gY29udGVudEZpbHRlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGlzdC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlJQ29udGVudEZpbHRlcltdIGNmID0gbmV3IElDb250ZW50RmlsdGVyW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KGNmKTsKLQkJcmV0dXJuIGNmOwotCX0KLQotCS8qKgotCSAqIEZpbmQgYSBjb250ZW50IGZpbHRlciBieSB0aGUgaWQuCi0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHJldHVybiB0aGUgY29udGVudCBmaWx0ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGNvdWxkbid0IGJlIGZvdW5kCi0JICovCi0JcHVibGljIElDb250ZW50RmlsdGVyIGZpbmRDb250ZW50RmlsdGVyKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGNvbnRlbnRGaWx0ZXJzLmdldChpZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGxvYWRQcm90b2NvbEFkYXB0ZXJzKCkgewotCQlpZiAocHJvdG9jb2xBZGFwdGVycyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICJMb2FkaW5nIHByb3RvY29sIGFkYXB0ZXJzIik7IAotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgImludGVybmFsUHJvdG9jb2xBZGFwdGVycyIpOwotCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlNYXA8U3RyaW5nLCBQcm90b2NvbEFkYXB0ZXI+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvdG9jb2xBZGFwdGVyPihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVN0cmluZyBpZCA9IGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIkxvYWRpbmcgYWRhcHRlcjogIiArIGlkKTsKLQkJCW1hcC5wdXQoaWQsIG5ldyBQcm90b2NvbEFkYXB0ZXIoY2ZbaV0pKTsKLQkJfQotCQlwcm90b2NvbEFkYXB0ZXJzID0gbWFwOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkQ29udGVudEZpbHRlcnMoKSB7Ci0JCWlmIChjb250ZW50RmlsdGVycyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICJMb2FkaW5nIGNvbnRlbnQgZmlsdGVycyIpOyAKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsICJpbnRlcm5hbENvbnRlbnRGaWx0ZXJzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCU1hcDxTdHJpbmcsIElDb250ZW50RmlsdGVyPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElDb250ZW50RmlsdGVyPihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVN0cmluZyBpZCA9IGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIkxvYWRpbmcgZmlsdGVyOiAiICsgaWQpOwotCQkJbWFwLnB1dChpZCwgbmV3IENvbnRlbnRGaWx0ZXIoY2ZbaV0pKTsKLQkJfQotCQljb250ZW50RmlsdGVycyA9IG1hcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZXhlY3V0ZVN0YXJ0dXBzKCkgewotCQlpZiAoc3RhcnR1cHNMb2FkZWQpCi0JCQlyZXR1cm47Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICJMb2FkaW5nIHN0YXJ0dXBzIik7IAotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgImludGVybmFsU3RhcnR1cCIpOwotCQkKLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlTdHJpbmcgaWQgPSBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICJMb2FkaW5nIHN0YXJ0dXA6ICIgKyBpZCk7Ci0JCQl0cnkgewotCQkJCUlTdGFydHVwIHN0YXJ0dXAgPSAoSVN0YXJ0dXApIGNmW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RhcnR1cC5zdGFydHVwKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIlN0YXJ0dXAgZmFpbGVkIiArIHN0YXJ0dXAudG9TdHJpbmcoKSwgZXgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBzdGFydHVwOiAiICsgaWQsIGUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTW9uaXRvcldvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1MjdjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFRpYW5jaGFvIExpIChUaWFuY2hhby5MaUBnbWFpbC5jb20pIC0gU3RhcnQgbW9uaXRvcnMgYnkgZGVmYXVsdCAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yV29ya2luZ0NvcHk7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvcldvcmtpbmdDb3B5IGV4dGVuZHMgTW9uaXRvciBpbXBsZW1lbnRzIElNb25pdG9yV29ya2luZ0NvcHkgewotCXByb3RlY3RlZCBNb25pdG9yIG1vbml0b3I7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG1vbml0b3Igd29ya2luZyBjb3B5LiAodXNlZCBmb3IgaW5pdGlhbCBjcmVhdGlvbikKLQkgKi8KLQlwdWJsaWMgTW9uaXRvcldvcmtpbmdDb3B5KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG1vbml0b3Igd29ya2luZyBjb3B5LiAodXNlZCBmb3Igd29ya2luZyBjb3BpZXMpCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdGhpcyB3b3JraW5nIGNvcHkgaXMgZm9yCi0JICovCi0JcHVibGljIE1vbml0b3JXb3JraW5nQ29weShNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJc2V0SW50ZXJuYWwobW9uaXRvcik7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkjZ2V0T3JpZ2luYWwoKQotCSAqLwotCXB1YmxpYyBJTW9uaXRvciBnZXRPcmlnaW5hbCgpIHsKLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQgdGhlIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCWlkID0gbmV3SWQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkjc2V0UmVtb3RlSG9zdChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3RlSG9zdChTdHJpbmcgaG9zdCkgewotCQlyZW1vdGVIb3N0ID0gaG9zdDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3JXb3JraW5nQ29weSNzZXRSZW1vdGVQb3J0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdGVQb3J0KGludCBwb3J0KSB7Ci0JCXJlbW90ZVBvcnQgPSBwb3J0OwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTW9uaXRvcldvcmtpbmdDb3B5I3NldExvY2FsUG9ydChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWxQb3J0KGludCBwb3J0KSB7Ci0JCWxvY2FsUG9ydCA9IHBvcnQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkjc2V0UHJvdG9jb2woU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3RvY29sKFN0cmluZyBwcm90b2NvbElkMikgewotCQlwcm90b2NvbElkID0gcHJvdG9jb2xJZDI7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkjc2V0VGltZW91dChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dDIpIHsKLQkJdGltZW91dCA9IHRpbWVvdXQyOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTW9uaXRvcldvcmtpbmdDb3B5I3NldEF1dG9TdGFydChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9TdGFydChib29sZWFuIHN0YXJ0QnlEZWZhdWx0KSB7Ci0JCWF1dG9TdGFydCA9IHN0YXJ0QnlEZWZhdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3IjaXNXb3JraW5nQ29weSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3IjY3JlYXRlV29ya2luZ0NvcHkoKQotCSAqLwotCXB1YmxpYyBJTW9uaXRvcldvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkjc2F2ZSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJTW9uaXRvciBzYXZlKCkgewotCQlNb25pdG9yTWFuYWdlciBtbSA9IE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCS8vYm9vbGVhbiByZXN0YXJ0ID0gZmFsc2U7Ci0JCQlpZiAobW9uaXRvci5pc1J1bm5pbmcoKSkgewotCQkJCS8vcmVzdGFydCA9IHRydWU7Ci0JCQkJbW0uc3RvcE1vbml0b3IobW9uaXRvcik7Ci0JCQl9Ci0JCQltb25pdG9yLnNldEludGVybmFsKHRoaXMpOwotCQkJbW0ubW9uaXRvckNoYW5nZWQobW9uaXRvcik7Ci0JCQkvL2lmIChyZXN0YXJ0KQotCQkJLy8JbW0uc3RhcnRNb25pdG9yKG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJbW9uaXRvciA9IG5ldyBNb25pdG9yKCk7Ci0JCQltb25pdG9yLnNldEludGVybmFsKHRoaXMpOwotCQkJbW0uYWRkTW9uaXRvcihtb25pdG9yKTsKLQkJfQotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvUHJvdG9jb2xBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Qcm90b2NvbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmOGMwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Qcm90b2NvbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm90b2NvbEFkYXB0ZXIgaW1wbGVtZW50cyBJUHJvdG9jb2xBZGFwdGVyIHsKLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFByb3RvY29sQWRhcHRlckRlbGVnYXRlIGRlbGVnYXRlOwotCi0JcHJvdGVjdGVkIFByb3RvY29sQWRhcHRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVByb3RvY29sQWRhcHRlciNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVByb3RvY29sQWRhcHRlciNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCX0KLQotCXByb3RlY3RlZCBQcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCQotCQl0cnkgewotCQkJZGVsZWdhdGUgPSAoUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgcHJvdG9jb2wgYWRhcHRlciBkZWxlZ2F0ZTogIiArIGdldElkKCksIGUpOwotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25uZWN0IHdpdGggdGhlIHByb3RvY29sLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvcgotCSAqIEBwYXJhbSBpbiBhbiBpbmJvdW5kIHNvY2tldAotCSAqIEBwYXJhbSBvdXQgYW4gb3V0Ym91bmQgc29ja2V0Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSU1vbml0b3IgbW9uaXRvciwgU29ja2V0IGluLCBTb2NrZXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlnZXREZWxlZ2F0ZSgpLmNvbm5lY3QobW9uaXRvciwgaW4sIG91dCk7Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdCBmcm9tIHRoZSBzb2NrZXRzLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KElNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldERlbGVnYXRlKCkuZGlzY29ubmVjdChtb25pdG9yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1Byb3RvY29sQWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwN2NkM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcHJvdG9jb2wgYWRhcHRlciBkZWxlZ2F0ZXMsIHdoaWNoIHByb3ZpZGUgdGhlCi0gKiBpbXBsZW1lbnRhdGlvbiBiZWhpbmQgYSBwYXJ0aWN1bGFyIHByb3RvY29sIGFkYXB0ZXIuCi0gKiBBIHByb3RvY29sIGFkYXB0ZXIgd2F0Y2hlcyB0aGUgbWVzc2FnZSB0cmFmZmljIHBhc3NpbmcgYmV0d2VlbiBjbGllbnQgYW5kCi0gKiBzZXJ2ZXI7IGl0IHBhcnNlcyB0aGUgbWVzc2FnZXMgYW5kIHJlcG9ydHMgdGhlbSBpbiB0aGUgZm9ybSBvZiAKLSAqIFJlcXVlc3Qgb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5wcm90b2NvbEFkYXB0ZXJzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiBUaGUgc3ViY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IsIHdoaWNoIHdpbGwgYmUgdXNlZAotICogYXV0b21hdGljYWxseSB0byBpbnN0YW50aWF0ZSB0aGUgZGVsZWdhdGUgd2hlbiByZXF1aXJlZC4gCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZXJlIGlzIG9ubHkgb25lIGRlbGVnYXRlIGNyZWF0ZWQgcGVyIHByb3RvY29sLCBhbmQgdGhpcyBkZWxlZ2F0ZSBtdXN0Ci0gKiBiZSBhYmxlIHRvIGhhbmRsZSBtdWx0aXBsZSBtb25pdG9yIGluc3RhbmNlcy4gVGhpcyBtZWFucyB0aGF0IHRoZSBkZWxlZ2F0ZQotICogdHlwaWNhbGx5IHdpbGwgbm90IGhhdmUgaW5zdGFuY2Ugc3RhdGUsIG9yIG11c3Qgc3luY2hyb25pemUgYW5kIGtlZXAgdGhlCi0gKiBzdGF0ZSBzZXBhcmF0ZS4KLSAqIDwvcD4KLSAqIDxwPgotICogW2lzc3VlOiBUaGUgSFRUUCBhbmQgVENQL0lQIGRlbGVnYXRlIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgdGhyZWFkcyB3aGljaAotICogc2h1ZmZsZSBpbmZvIGJldHdlZW4gc29ja2V0cy4gSWYgdGhlIG1vbml0b3IgaXMgY2hhbmdlZCBvciBkZWxldGVkLCBob3cgZG8KLSAqIHRoZXNlIHRocmVhZHMgZ28gYXdheT8gTWV0aGlua3MgdGhhdCBkZWxlZ2F0ZXMgaW4gZ2VuZXJhbCBzaG91bGQgYmUgZm9yY2VkCi0gKiB0byBpbXBsZW1lbnQgZGlzY29ubmVjdChJTW9uaXRvcikgYXMgd2VsbC4gVGhpcyBtZXRob2Qgd291bGQgYmUgY2FsbGVkIGJ5IHRoZQotICogc3lzdGVtIHdoZW4gdGhlIG1vbml0b3IgaXMgY2hhbmdlZCBvciBkZWxldGVkLCBvciB3aGVuIHRoZSBwbHVnLWluIGlzCi0gKiBiZWluZyBzaHV0IGRvd24uXQotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUgewotCS8qKgotCSAqIEVzdGFibGlzaGVzIGFuIG9uZ29pbmcgY29ubmVjdGlvbiBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIGJlaW5nCi0JICogbW9uaXRvcmVkIGJ5IHRoZSBnaXZlbiBtb25pdG9yLiBUaGUgPGNvZGU+aW48L2NvZGU+IHNvY2tldCBpcyBhc3NvY2lhdGVkCi0JICogd2l0aCB0aGUgbW9uaXRvcidzIGNsaWVudC4gVGhlIDxjb2RlPm91dDwvY29kZT4gc29ja2V0IGlzIGFzc29jaWF0ZWQgd2l0aAotCSAqIHRoZSBtb25pdG9yJ3Mgc2VydmVyLiBEaWZmZXJlbnQgYWRhcGF0ZXJzIGhhbmRsZSBkaWZmZXJlbnQgbmV0d29yawotCSAqIHByb3RvY29scy4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKLQkgKiA8dWw+Ci0JICogPGxpPkNsaWVudCB0byBzZXJ2ZXIgY29tbXVuaWNhdGlvbiAtCi0JICogT3BlbmluZyBhbiBpbnB1dCBzdHJlYW0gb24gdGhlIDxjb2RlPmluPC9jb2RlPiBzb2NrZXQsIG9wZW5pbmcgYW4gb3V0cHV0Ci0JICogc3RyZWFtIG9uIHRoZSA8Y29kZT5vdXQ8L2NvZGU+IHNvY2tldCwgYW5kIGVzdGFibGlzaGluZyBhIG1lY2hhbmlzbSB0aGF0Ci0JICogd2lsbCBwYXNzIGFsb25nIGFsbCBieXRlcyByZWNlaXZlZCBvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBvdXRwdXQKLQkgKiBzdHJlYW0uPC9saT4KLQkgKiA8bGk+U2VydmVyIHRvIGNsaWVudCBjb21tdW5pY2F0aW9uIC0gT3BlbmluZyBhbiBpbnB1dCBzdHJlYW0gb24gdGhlCi0JICogPGNvZGU+b3V0PC9jb2RlPiBzb2NrZXQsIG9wZW5pbmcgYW4gb3V0cHV0IHN0cmVhbSBvbiB0aGUgPGNvZGU+aW48L2NvZGU+Ci0JICogc29ja2V0LCBhbmQgZXN0YWJsaXNoaW5nIGEgbWVjaGFuaXNtIHRoYXQgd2lsbCBwYXNzIGFsb25nIGFsbCBieXRlcwotCSAqIHJlY2VpdmVkIG9uIHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0uPC9saT4KLQkgKiA8bGk+UGFyc2luZyB0aGUgcHJvdG9jb2wtc3BlY2lmaWMgbWVzc2FnZSB0cmFmZmljIHRvIGNyZWF0ZSBhbmQgcmVwb3J0Ci0JICogcmVxdWVzdCBvYmplY3RzIGZvciBlYWNoIG1lc3NhZ2UgcGFzc2VkIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIuPC9saT4KLQkgKiA8bGk+Q2xvc2luZyB0aGUgaW5wdXQgYW5kIG91dHB1dCBzb2NrZXRzIGFuZCBvdGhlcndpc2UgY2xlYW5pbmcgdXAKLQkgKiBhZnRlcndhcmRzLjwvbGk+Ci0JICogPC91bD4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdGhhdCB1c2VzIHRoaXMgcHJvdG9jb2wgYWRhcHRlcgotCSAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgc29ja2V0IG9mIHRoZSBtb25pdG9yIGNsaWVudAotCSAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBzb2NrZXQgb2YgdGhlIG1vbml0b3Igc2VydmVyCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXIgd2hlbiBvcGVuaW5nIHRoZSBzdHJlYW1zIG9mIHRoZQotCSAqICAgIGlucHV0IG9yIG91dHB1dCBzb2NrZXRzCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY29ubmVjdChJTW9uaXRvciBtb25pdG9yLCBTb2NrZXQgaW4sIFNvY2tldCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBDYWxsZWQgaWYgdGhlIG1vbml0b3IgaXMgY2hhbmdlZCBvciBkZWxldGVkLCBvciB0aGUgcGx1Z2luIGlzIHNodXR0aW5nIGRvd24uCi0JICogVGhlIGRlbGVnYXRlIG11c3QgY2xlYW4gdXAgdGhlIGNvbm5lY3Rpb25zIGFuZCB0aHJlYWRzIGNyZWF0ZWQgdG8gcmVzcG9uZCB0bwotCSAqIHRoaXMgbW9uaXRvci4gCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZGlzY29ubmVjdChJTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Tb2NrZXRXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Tb2NrZXRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYjRkZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvU29ja2V0V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKLS8qKgotICogQSBzb2NrZXQgdGhhdCBpcyBvbmx5IHVzZWQgZm9yIHJlc2VuZGluZyByZXF1ZXN0cy4gQWxsIGlucHV0IG9wZXJhdGlvbnMgYXJlCi0gKiBpZ25vcmVkLgotICovCi1wdWJsaWMgY2xhc3MgU29ja2V0V3JhcHBlciBleHRlbmRzIFNvY2tldCB7Ci0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKLQlwcml2YXRlIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW07Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHNvY2tldCB3cmFwcGVyLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dFN0cmVhbQotCSAqLwotCXB1YmxpYyBTb2NrZXRXcmFwcGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JICB0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JICB0aGlzLm91dHB1dFN0cmVhbSA9IG5ldyBEdW1teU91dHB1dFN0cmVhbSgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjYmluZChqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIGJpbmQoU29ja2V0QWRkcmVzcyBhcmcwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNjbG9zZSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjY29ubmVjdChqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChTb2NrZXRBZGRyZXNzIGFyZzAsIGludCBhcmcxKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNjb25uZWN0KGphdmEubmV0LlNvY2tldEFkZHJlc3MpCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChTb2NrZXRBZGRyZXNzIGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldENoYW5uZWwoKQotCSAqLwotCXB1YmxpYyBTb2NrZXRDaGFubmVsIGdldENoYW5uZWwoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGFubmVsKCk7Ci0JfQotCQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0SW5ldEFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyBJbmV0QWRkcmVzcyBnZXRJbmV0QWRkcmVzcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEluZXRBZGRyZXNzKCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRJbnB1dFN0cmVhbSgpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGlucHV0U3RyZWFtOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0S2VlcEFsaXZlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRLZWVwQWxpdmUoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0TG9jYWxBZGRyZXNzKCkKLQkgKi8KLQlwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TG9jYWxBZGRyZXNzKCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRMb2NhbFBvcnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TG9jYWxQb3J0KCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRMb2NhbFNvY2tldEFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyBTb2NrZXRBZGRyZXNzIGdldExvY2FsU29ja2V0QWRkcmVzcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldExvY2FsU29ja2V0QWRkcmVzcygpOwotCX0KLQkKLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldE9PQklubGluZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0T09CSW5saW5lKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRPT0JJbmxpbmUoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldE91dHB1dFN0cmVhbSgpCi0JICovCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gb3V0cHV0U3RyZWFtOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0UG9ydCgpCi0JICovCi0JcHVibGljIGludCBnZXRQb3J0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UG9ydCgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFJlY2VpdmVCdWZmZXJTaXplKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRSZWNlaXZlQnVmZmVyU2l6ZSgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpCi0JICovCi0JcHVibGljIFNvY2tldEFkZHJlc3MgZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldFJldXNlQWRkcmVzcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UmV1c2VBZGRyZXNzKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXVzZUFkZHJlc3MoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldFNlbmRCdWZmZXJTaXplKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRTZW5kQnVmZmVyU2l6ZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0U2VuZEJ1ZmZlclNpemUoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldFNvTGluZ2VyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNvTGluZ2VyKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRTb0xpbmdlcigpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0U29UaW1lb3V0KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRTb1RpbWVvdXQoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLmdldFNvVGltZW91dCgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0VGNwTm9EZWxheSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0VGNwTm9EZWxheSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0VGNwTm9EZWxheSgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0VHJhZmZpY0NsYXNzKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRyYWZmaWNDbGFzcygpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0VHJhZmZpY0NsYXNzKCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNpc0JvdW5kKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JvdW5kKCkgewotCQlyZXR1cm4gc3VwZXIuaXNCb3VuZCgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjaXNDbG9zZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNpc0Nvbm5lY3RlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjaXNJbnB1dFNodXRkb3duKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lucHV0U2h1dGRvd24oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2lzT3V0cHV0U2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3V0cHV0U2h1dGRvd24oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NlbmRVcmdlbnREYXRhKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZW5kVXJnZW50RGF0YShpbnQgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2VuZFVyZ2VudERhdGEoYXJnMCk7Ci0JfQotCQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2V0S2VlcEFsaXZlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2VlcEFsaXZlKGJvb2xlYW4gYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldEtlZXBBbGl2ZShhcmcwKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NldE9PQklubGluZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9PQklubGluZShib29sZWFuIGFyZzApIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlzdXBlci5zZXRPT0JJbmxpbmUoYXJnMCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZXRSZWNlaXZlQnVmZmVyU2l6ZShpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlY2VpdmVCdWZmZXJTaXplKGludCBhcmcwKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0UmVjZWl2ZUJ1ZmZlclNpemUoYXJnMCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZXRSZXVzZUFkZHJlc3MoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXVzZUFkZHJlc3MoYm9vbGVhbiBhcmcwKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0UmV1c2VBZGRyZXNzKGFyZzApOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2V0U2VuZEJ1ZmZlclNpemUoaW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTZW5kQnVmZmVyU2l6ZShpbnQgYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFNlbmRCdWZmZXJTaXplKGFyZzApOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2V0U29MaW5nZXIoYm9vbGVhbiwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvTGluZ2VyKGJvb2xlYW4gYXJnMCwgaW50IGFyZzEpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlzdXBlci5zZXRTb0xpbmdlcihhcmcwLCBhcmcxKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NldFNvVGltZW91dChpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNvVGltZW91dChpbnQgYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFNvVGltZW91dChhcmcwKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NldFRjcE5vRGVsYXkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUY3BOb0RlbGF5KGJvb2xlYW4gYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFRjcE5vRGVsYXkoYXJnMCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZXRUcmFmZmljQ2xhc3MoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYWZmaWNDbGFzcyhpbnQgYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFRyYWZmaWNDbGFzcyhhcmcwKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NodXRkb3duSW5wdXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2h1dGRvd25PdXRwdXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEEgZHVtbXkgT3V0cHV0U3RyZWFtIHRoYXQgYWxsb3dzIHVzIHRvIGZha2Ugb3V0cHV0IGZvciBhIHNvY2tldC4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgRHVtbXlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewotCQkvKiogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEuaW8uT3V0cHV0U3RyZWFtI2Nsb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQkKLQkJLyoqIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSNmbHVzaCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkJLyoqIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShieXRlW10sIGludCwgaW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGFyZzAsIGludCBhcmcxLCBpbnQgYXJnMikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQotCQkvKiogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEuaW8uT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBhcmcwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UQ1BJUFByb3RvY29sQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVENQSVBQcm90b2NvbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhNGVjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UQ1BJUFByb3RvY29sQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ1BJUFByb3RvY29sQWRhcHRlciBleHRlbmRzIFByb3RvY29sQWRhcHRlckRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgTWFwPElNb25pdG9yLCBDb25uZWN0aW9uPiBtYXAgPSBuZXcgSGFzaE1hcDxJTW9uaXRvciwgQ29ubmVjdGlvbj4oKTsKLQkKLQkvKioKLQkgKiBAc2VlIFByb3RvY29sQWRhcHRlckRlbGVnYXRlI2Nvbm5lY3QoSU1vbml0b3IsIFNvY2tldCwgU29ja2V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSU1vbml0b3IgbW9uaXRvciwgU29ja2V0IGluLCBTb2NrZXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCgoTW9uaXRvcikgbW9uaXRvciwgSVByb3RvY29sQWRhcHRlci5UQ1BJUF9QUk9UT0NPTF9JRCwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpKTsKLQkJQ29ubmVjdGlvbiBjb25uID0gbmV3IENvbm5lY3Rpb24oaW4sIG91dCk7Ci0JCW1hcC5wdXQobW9uaXRvciwgY29ubik7Ci0JCVRDUElQVGhyZWFkIHJlcXVlc3RUaHJlYWQgPSBuZXcgVENQSVBUaHJlYWQoY29ubiwgcmVxdWVzdCwgaW4uZ2V0SW5wdXRTdHJlYW0oKSwgb3V0LmdldE91dHB1dFN0cmVhbSgpLCB0cnVlKTsKLQkJcmVxdWVzdFRocmVhZC5zdGFydCgpOwotCQluZXcgVENQSVBUaHJlYWQoY29ubiwgcmVxdWVzdCwgb3V0LmdldElucHV0U3RyZWFtKCksIGluLmdldE91dHB1dFN0cmVhbSgpLCBmYWxzZSkuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFByb3RvY29sQWRhcHRlckRlbGVnYXRlI2Rpc2Nvbm5lY3QoSU1vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJQ29ubmVjdGlvbiBjb25uID0gbWFwLmdldChtb25pdG9yKTsKLQkJCWNvbm4uY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVENQSVBUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1RDUElQVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNGRlODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVENQSVBUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci0vKioKLSAqIE1vbml0b3Igc2VydmVyIEkvTyB0aHJlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ1BJUFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUiA9IDIwNDg7Ci0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGluOwotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gb3V0OwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVxdWVzdDsKLQkKLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBjb25uOwotCXByb3RlY3RlZCBSZXF1ZXN0IHJlcXVlc3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgVENQL0lQIHRocmVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29ubgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHBhcmFtIGluCi0JICogQHBhcmFtIG91dAotCSAqIEBwYXJhbSBpc1JlcXVlc3QKLQkgKi8KLQlwdWJsaWMgVENQSVBUaHJlYWQoQ29ubmVjdGlvbiBjb25uLCBSZXF1ZXN0IHJlcXVlc3QsIElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIGlzUmVxdWVzdCkgewotCQlzdXBlcigiVENQL0lQIE1vbml0b3IgVENQL0lQIENvbm5lY3Rpb24iKTsKLQkJdGhpcy5jb25uID0gY29ubjsKLQkJdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdGhpcy5pbiA9IGluOwotCQl0aGlzLm91dCA9IG91dDsKLQkJdGhpcy5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7Ci0JCXNldFByaW9yaXR5KFRocmVhZC5OT1JNX1BSSU9SSVRZICsgMSk7Ci0JCXNldERhZW1vbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0ZW4gZm9yIGlucHV0LCBzYXZlIGl0LCBhbmQgcGFzcyB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlieXRlW10gYiA9IG5ldyBieXRlW0JVRkZFUl07Ci0JCQlpbnQgbiA9IGluLnJlYWQoYik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlvdXQud3JpdGUoYiwgMCwgbik7Ci0JCQkJaWYgKGIgIT0gbnVsbCAmJiBuID4gMCkgewotCQkJCQlieXRlW10geCA9IG51bGw7Ci0JCQkJCWlmIChuID09IEJVRkZFUikKLQkJCQkJCXggPSBiOwotCQkJCQllbHNlIHsKLQkJCQkJCXggPSBuZXcgYnl0ZVtuXTsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgeCwgMCwgbik7Ci0JCQkJCX0KLQkJCQkJaWYgKGlzUmVxdWVzdCkKLQkJCQkJCXJlcXVlc3QuYWRkVG9SZXF1ZXN0KHgpOwotCQkJCQllbHNlCi0JCQkJCQlyZXF1ZXN0LmFkZFRvUmVzcG9uc2UoeCk7Ci0JCQkJfQotCQkJCW4gPSBpbi5yZWFkKGIpOwotCQkJCVRocmVhZC55aWVsZCgpOwotCQkJfQotCQkJb3V0LmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9IGZpbmFsbHkgewotCQkJLy9yZXF1ZXN0LmZpcmVDaGFuZ2VkRXZlbnQoKTsKLQkJCWlmICghaXNSZXF1ZXN0KQotCQkJCWNvbm4uY2xvc2UoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmMzkyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQkvKioKLQkgKiBDb25maWcgdHJhY2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTkZJRyA9IDA7Ci0JCi0JLyoqCi0JICogV2FybmluZyB0cmFjZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgV0FSTklORyA9IDE7Ci0JCi0JLyoqCi0JICogU2V2ZXJlIHRyYWNlIGV2ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVZFUkUgPSAyOwotCQotCS8qKgotCSAqIEZpbmVzdCB0cmFjZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVNUID0gMzsKLQkKLQkvKioKLQkgKiBQYXJzaW5nIHRyYWNlIGV2ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBQQVJTSU5HID0gNDsKLQotCS8qKgotCSAqIFRyYWNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBUcmFjZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdGhlIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzKSB7Ci0JCXRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKGxldmVsID09IFNFVkVSRSkKLQkJCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgcywgdCkpOwotCQkKLQkJaWYgKCFNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybjsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbihNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCArICIgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIiAiICsgcyk7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYmYyMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotLyoqCi0gKiBBIE1lbWVudG8gaXMgYSBjbGFzcyBpbmRlcGVuZGVudCBjb250YWluZXIgZm9yIHBlcnNpc3RlbmNlCi0gKiBpbmZvLiAgSXQgaXMgYSByZWZsZWN0aW9uIG9mIDMgc3RvcmFnZSByZXF1aXJlbWVudHMuCi0gKgotICogMSkgICBXZSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcnNpc3QgYW4gb2JqZWN0IGFuZCByZXN0b3JlIGl0LiAgCi0gKiAyKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBiZSBhYnNlbnQuICBJZiBzbyB3ZSB3b3VsZCAKLSAqICAgICAgbGlrZSB0byBza2lwIHRoZSBvYmplY3QgYW5kIGtlZXAgcmVhZGluZy4gCi0gKiAzKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBjaGFuZ2UuICBJZiBzbyB0aGUgbmV3IGNsYXNzIAotICogICAgICBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgcGVyc2lzdGVuY2UgaW5mby4KLSAqCi0gKiBXZSBjb3VsZCBhc2sgdGhlIG9iamVjdHMgdG8gc2VyaWFsaXplIHRoZW1zZWx2ZXMgaW50byBhbiAKLSAqIE9iamVjdE91dHB1dFN0cmVhbSwgRGF0YU91dHB1dFN0cmVhbSwgb3IgSGFzaHRhYmxlLiAgSG93ZXZlciAKLSAqIGFsbCBvZiB0aGVzZSBhcHByb2FjaGVzIGZhaWwgdG8gbWVldCB0aGUgc2Vjb25kIHJlcXVpcmVtZW50LgotICoKLSAqIE1lbWVudG8gc3VwcG9ydHMgYmluYXJ5IHBlcnNpc3RlbmNlIHdpdGggYSB2ZXJzaW9uIElELgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHsKLQlwcml2YXRlIERvY3VtZW50IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBtZW1lbnRvIGZvciB0aGUgZG9jdW1lbnQgYW5kIGVsZW1lbnQuICBGb3Igc2ltcGxpY2l0eQotCSAqIHlvdSBzaG91bGQgdXNlIGNyZWF0ZVJlYWRSb290IGFuZCBjcmVhdGVXcml0ZVJvb3QgdG8gY3JlYXRlIHRoZSBpbml0aWFsCi0JICogbWVtZW50b3Mgb24gYSBkb2N1bWVudC4KLQkgKi8KLQlwcml2YXRlIFhNTE1lbWVudG8oRG9jdW1lbnQgZG9jLCBFbGVtZW50IGVsKSB7Ci0JCWZhY3RvcnkgPSBkb2M7Ci0JCWVsZW1lbnQgPSBlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI2NyZWF0ZUNoaWxkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpIHsKLQkJRWxlbWVudCBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudCh0eXBlKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgRG9jdW1lbnQgZnJvbSBhIFJlYWRlciBhbmQgYW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciByZWFkaW5nIAotCSAqIGEgZG9jdW1lbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVSZWFkUm9vdChJbnB1dFN0cmVhbSBpbikgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCWRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOwotCQkJTm9kZSBub2RlID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgKEVsZW1lbnQpIG5vZGUpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciB3cml0aW5nIGEgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIGEgbWVtZW50bwotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVXcml0ZVJvb3QoU3RyaW5nIHR5cGUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotCQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsKLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCBlbGVtZW50KTsgICAgICAgICAgICAKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNnZXRDaGlsZChTdHJpbmcpCi0JICovCi0JcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCS8vIEdldCB0aGUgbm9kZXMuCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkKLQkJLy8gRmluZCB0aGUgZmlyc3Qgbm9kZSB3aGljaCBpcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KLQkJZm9yIChpbnQgblggPSAwOyBuWCA8IHNpemU7IG5YICsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5YKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgZWxlbWVudDIgPSAoRWxlbWVudClub2RlOwotCQkJCWlmIChlbGVtZW50Mi5nZXROb2RlTmFtZSgpLmVxdWFscyh0eXBlKSkKLQkJCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGVsZW1lbnQyKTsKLQkJCX0KLQkJfQotCQotCQkvLyBBIGNoaWxkIHdhcyBub3QgZm91bmQuCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jZ2V0Q2hpbGRyZW4oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWVtZW50byBbXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSkgewotCQkvLyBHZXQgdGhlIG5vZGVzLgotCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG5ldyBJTWVtZW50b1swXTsKLQkKLQkJLy8gRXh0cmFjdCBlYWNoIG5vZGUgd2l0aCBnaXZlbiB0eXBlLgotCQlMaXN0PEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KHNpemUpOwotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQotCQkJCQlsaXN0LmFkZChlbGVtZW50Mik7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gQ3JlYXRlIGEgbWVtZW50byBmb3IgZWFjaCBub2RlLgotCQlzaXplID0gbGlzdC5zaXplKCk7Ci0JCUlNZW1lbnRvIFtdIHJlc3VsdHMgPSBuZXcgSU1lbWVudG9bc2l6ZV07Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgc2l6ZTsgeCArKykgewotCQkJcmVzdWx0c1t4XSA9IG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGxpc3QuZ2V0KHgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI2dldEludGVnZXIoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXIoU3RyaW5nIGtleSkgewotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAKLQkJU3RyaW5nIHN0clZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHN0clZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNnZXRTdHJpbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYSBtZW1lbnRvIGZyb20gdGhlIGdpdmVuIGZpbGVuYW1lLgotCSAqCi0JICogQHBhcmFtIGluIHRoZSBpbnB1dCBzdHJlYW0KLQkgKiBAcmV0dXJuIGEgbWVtZW50bwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1lbWVudG8gbG9hZE1lbWVudG8oSW5wdXRTdHJlYW0gaW4pIHsKLQkJcmV0dXJuIGNyZWF0ZVJlYWRSb290KGluKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI3B1dEludGVnZXIoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgbikgewotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZy52YWx1ZU9mKG4pKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI3B1dFN0cmluZyhTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGlzIE1lbWVudG8gdG8gYW4gb3V0cHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gb3MKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7Ci0JCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGZhY3RvcnkpOwotCQl0cnkgewotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7ICAgICAgICAgICAgCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0byBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgc3RyaW5nCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgc2F2ZVRvU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc2F2ZShvdXQpOwotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCJVVEYtOCIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jZ2V0Qm9vbGVhbihTdHJpbmcpCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5KSB7Ci0JCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBzdHJWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJaWYgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHN0clZhbHVlKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJCi0JCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNwdXRCb29sZWFuKFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpIHsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBDb25uZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyY2I4NWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9IVFRQQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLS8qKgotICogTWFuYWdlcyBhIG1vbml0b3Igc2VydmVyIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gaG9zdHMuIFRoaXMKLSAqIGNvbm5lY3Rpb24gbWF5IHNwYXduIG9uZSBvciBtb3JlIFRDUC9JUCByZXF1ZXN0cyB0byBiZSBkaXNwbGF5ZWQKLSAqIGluIHRoZSBtb25pdG9yIHNlcnZlciB2aWV3LgotICovCi1wdWJsaWMgY2xhc3MgSFRUUENvbm5lY3Rpb24gewotCXByb3RlY3RlZCBJTW9uaXRvciBtb25pdG9yOwotCi0JcHJvdGVjdGVkIGludCByZXEgPSAtMTsKLQlwcm90ZWN0ZWQgaW50IHJlc3AgPSAtMTsKLQotCXByb3RlY3RlZCBMaXN0PFJlcXVlc3Q+IHJlcXVlc3RzID0gbmV3IEFycmF5TGlzdDxSZXF1ZXN0PigpOwotCi0JLyoqCi0JICogSFRUUENvbm5lY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgSFRUUENvbm5lY3Rpb24oSU1vbml0b3IgbW9uaXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiVENQL0lQIG1vbml0b3IgY29ubmVjdGlvbiBvcGVuZWQgIiArIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHJlcXVlc3QuCi0JICogCi0JICogQHBhcmFtIGIgdGhlIHJlcXVlc3QgZGF0YQotCSAqIEBwYXJhbSBpc05ldyB0cnVlIGlmIG5ldwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlcXVlc3QoYnl0ZVtdIGIsIGJvb2xlYW4gaXNOZXcpIHsKLQkJaWYgKGlzTmV3KQotCQkJcmVxICsrOwotCQlIVFRQUmVxdWVzdCByZXF1ZXN0ID0gKEhUVFBSZXF1ZXN0KSBnZXRSZXF1ZXN0UmVzcG9uc2UocmVxKTsKLQkJcmVxdWVzdC5hZGRUb1JlcXVlc3QoYik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgcmVzcG9uc2UuCi0JICogCi0JICogQHBhcmFtIGIgdGhlIHJlc3BvbnNlIGRhdGEKLQkgKiBAcGFyYW0gaXNOZXcgdHJ1ZSBpZiBuZXcKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXNwb25zZShieXRlW10gYiwgYm9vbGVhbiBpc05ldykgewotCQlpZiAoaXNOZXcpCi0JCQlyZXNwICsrOwotCQlIVFRQUmVxdWVzdCByZXF1ZXN0ID0gKEhUVFBSZXF1ZXN0KSBnZXRSZXF1ZXN0UmVzcG9uc2UocmVzcCk7Ci0JCXJlcXVlc3QuYWRkVG9SZXNwb25zZShiKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCVJlcXVlc3QgcmVxdWVzdCA9IGdldFJlcXVlc3RSZXNwb25zZShyZXEpOwotCQlyZXF1ZXN0LnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gaXNSZXF1ZXN0Ci0JICogQHJldHVybiB0aGUgcmVxdWVzdAotCSAqLwotCXB1YmxpYyBSZXF1ZXN0IGdldFJlcXVlc3RSZXNwb25zZShib29sZWFuIGlzUmVxdWVzdCkgewotCQlpZiAoaXNSZXF1ZXN0KQotCQkJcmV0dXJuIGdldFJlcXVlc3RSZXNwb25zZShyZXEpOwotCQkKLQkJcmV0dXJuIGdldFJlcXVlc3RSZXNwb25zZShyZXNwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUmVxdWVzdCBnZXRSZXF1ZXN0UmVzcG9uc2UoaW50IGkpIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQl3aGlsZSAoaSA+PSByZXF1ZXN0cy5zaXplKCkpIHsKLQkJCQlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgSFRUUFJlcXVlc3QoKE1vbml0b3IpIG1vbml0b3IsIG1vbml0b3IuZ2V0TG9jYWxQb3J0KCksIG1vbml0b3IuZ2V0UmVtb3RlSG9zdCgpLCBtb25pdG9yLmdldFJlbW90ZVBvcnQoKSk7Ci0JCQkJcmVxdWVzdHMuYWRkKHJlcXVlc3QpOwotCQkJCXJldHVybiByZXF1ZXN0OwotCQkJfQotCQkJcmV0dXJuIHJlcXVlc3RzLmdldChpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGl0bGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlIHRoZSB0aXRsZQotCSAqIEBwYXJhbSBpc05ldyBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIHRpdGxlLCBib29sZWFuIGlzTmV3KSB7Ci0JCWlmIChpc05ldykKLQkJCXJlcSArKzsKLQkJSFRUUFJlcXVlc3QgcmVxdWVzdCA9IChIVFRQUmVxdWVzdCkgZ2V0UmVxdWVzdFJlc3BvbnNlKHJlcSk7Ci0JCXJlcXVlc3Quc2V0TmFtZSh0aXRsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9IVFRQUHJvdG9jb2xBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBQcm90b2NvbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyNGNmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBQcm90b2NvbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Qcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhUVFBQcm90b2NvbEFkYXB0ZXIgZXh0ZW5kcyBQcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZSB7Ci0JcHJvdGVjdGVkIE1hcDxJTW9uaXRvciwgQ29ubmVjdGlvbj4gbWFwID0gbmV3IEhhc2hNYXA8SU1vbml0b3IsIENvbm5lY3Rpb24+KCk7Ci0KLQkvKioKLQkgKiBAc2VlIFByb3RvY29sQWRhcHRlckRlbGVnYXRlI2Nvbm5lY3QoSU1vbml0b3IsIFNvY2tldCwgU29ja2V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSU1vbml0b3IgbW9uaXRvciwgU29ja2V0IGluLCBTb2NrZXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlDb25uZWN0aW9uIGNvbm4yID0gbmV3IENvbm5lY3Rpb24oaW4sIG91dCk7Ci0JCW1hcC5wdXQobW9uaXRvciwgY29ubjIpOwotCQlIVFRQQ29ubmVjdGlvbiBjb25uID0gbmV3IEhUVFBDb25uZWN0aW9uKG1vbml0b3IpOwotCQlIVFRQVGhyZWFkIHJlcXVlc3QgPSBuZXcgSFRUUFRocmVhZChjb25uMiwgaW4uZ2V0SW5wdXRTdHJlYW0oKSwgb3V0LmdldE91dHB1dFN0cmVhbSgpLCBjb25uLCB0cnVlLCBtb25pdG9yLmdldFJlbW90ZUhvc3QoKSwgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCkpOwotCQlIVFRQVGhyZWFkIHJlc3BvbnNlID0gbmV3IEhUVFBUaHJlYWQoY29ubjIsIG91dC5nZXRJbnB1dFN0cmVhbSgpLCBpbi5nZXRPdXRwdXRTdHJlYW0oKSwgY29ubiwgZmFsc2UsICJsb2NhbGhvc3QiLCBtb25pdG9yLmdldExvY2FsUG9ydCgpLCByZXF1ZXN0KTsKLQkJcmVxdWVzdC5zdGFydCgpOwotCQlyZXNwb25zZS5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUjZGlzY29ubmVjdChJTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KElNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlDb25uZWN0aW9uIGNvbm4gPSBtYXAuZ2V0KG1vbml0b3IpOwotCQkJaWYgKGNvbm4gIT0gbnVsbCkKLQkJCQljb25uLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUFJlcXVlc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlMTY1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JUHJvdG9jb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSFRUUFJlcXVlc3QgZXh0ZW5kcyBSZXF1ZXN0IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFUVVFU1RfSEVBREVSID0gInJlcXVlc3QtaGVhZGVyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFU1BPTlNFX0hFQURFUiA9ICJyZXNwb25zZS1oZWFkZXIiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVFVRVNUX0JPRFkgPSAicmVxdWVzdC1ib2R5IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFU1BPTlNFX0JPRFkgPSAicmVzcG9uc2UtYm9keSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTVBUWSA9IG5ldyBieXRlWzBdOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIEhUVFBSZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHBhcmFtIGxvY2FsUG9ydAotCSAqIEBwYXJhbSByZW1vdGVIb3N0Ci0JICogQHBhcmFtIHJlbW90ZVBvcnQKLQkgKi8KLQlwdWJsaWMgSFRUUFJlcXVlc3QoTW9uaXRvciBtb25pdG9yLCBpbnQgbG9jYWxQb3J0LCBTdHJpbmcgcmVtb3RlSG9zdCwgaW50IHJlbW90ZVBvcnQpIHsKLQkJc3VwZXIobW9uaXRvciwgSVByb3RvY29sQWRhcHRlci5IVFRQX1BST1RPQ09MX0lELCBsb2NhbFBvcnQsIHJlbW90ZUhvc3QsIHJlbW90ZVBvcnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVxdWVzdCNnZXRSZXF1ZXN0KGludCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldFJlcXVlc3QoaW50IHR5cGUyKSB7Ci0JCWlmICh0eXBlMiA9PSBBTEwpCi0JCQlyZXR1cm4gcmVxdWVzdDsKLQkJZWxzZSBpZiAodHlwZTIgPT0gVFJBTlNQT1JUKQotCQkJcmV0dXJuIGdldFJlcXVlc3RIZWFkZXIoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldFJlcXVlc3RDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXF1ZXN0I2dldFJlc3BvbnNlKGludCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldFJlc3BvbnNlKGludCB0eXBlMikgewotCQlpZiAodHlwZTIgPT0gQUxMKQotCQkJcmV0dXJuIHJlc3BvbnNlOwotCQllbHNlIGlmICh0eXBlMiA9PSBUUkFOU1BPUlQpCi0JCQlyZXR1cm4gZ2V0UmVzcG9uc2VIZWFkZXIoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldFJlc3BvbnNlQ29udGVudCgpOwotCX0KLQotCXByb3RlY3RlZCBieXRlW10gZ2V0UmVxdWVzdEhlYWRlcigpIHsKLQkJT2JqZWN0IG9iaiA9IGdldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9IRUFERVIpOwotCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBieXRlW10pKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoYnl0ZVtdKSBvYmo7Ci0JfQotCi0JcHJvdGVjdGVkIGJ5dGVbXSBnZXRSZXF1ZXN0Q29udGVudCgpIHsKLQkJT2JqZWN0IG9iaiA9IGdldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9CT0RZKTsKLQkJaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgYnl0ZVtdKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKGJ5dGVbXSkgb2JqOwotCX0KLQotCXByb3RlY3RlZCBieXRlW10gZ2V0UmVzcG9uc2VIZWFkZXIoKSB7Ci0JCU9iamVjdCBvYmogPSBnZXRQcm9wZXJ0eShIVFRQX1JFU1BPTlNFX0hFQURFUik7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChieXRlW10pIG9iajsKLQl9Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGdldFJlc3BvbnNlQ29udGVudCgpIHsKLQkJT2JqZWN0IG9iaiA9IGdldFByb3BlcnR5KEhUVFBfUkVTUE9OU0VfQk9EWSk7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChieXRlW10pIG9iajsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuKSB7Ci0JCXN1cGVyLnNldE5hbWUobik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9IVFRQVGhyZWFkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkNmI5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBNb25pdG9yIHNlcnZlciBJL08gdGhyZWFkLgotICovCi1wdWJsaWMgY2xhc3MgSFRUUFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUiA9IDIwNDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBDUiA9IChieXRlKSAnXHInOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTEYgPSAoYnl0ZSkgJ1xuJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGludCB0aHJlYWRDb3VudCA9IDA7Ci0KLQlwcml2YXRlIGJ5dGVbXSByZWFkQnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSXTsKLQotCS8vIGJ1ZmZlciBhbmQgaW5kZXgKLQlwcm90ZWN0ZWQgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzBdOwotCXByb3RlY3RlZCBpbnQgYnVmZmVySW5kZXggPSAwOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGluOwotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gb3V0OwotCXByb3RlY3RlZCBIVFRQQ29ubmVjdGlvbiBjb25uOwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVxdWVzdDsKLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBjb25uMjsKLQkKLQlwcm90ZWN0ZWQgSFRUUFRocmVhZCByZXF1ZXN0OwotCXByb3RlY3RlZCBib29sZWFuIGlzV2FpdGluZzsKLQkKLQkvLyB1c2VyIHRvIHRyYW5zbGF0ZSB0aGUgSG9zdDogaGVhZGVyCi0JcHJvdGVjdGVkIFN0cmluZyBob3N0OwotCXByb3RlY3RlZCBpbnQgcG9ydDsKLQotCXByb3RlY3RlZCBpbnQgY29udGVudExlbmd0aCA9IC0xOwotCXByb3RlY3RlZCBieXRlIHRyYW5zZmVyRW5jb2RpbmcgPSAtMTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3BvbnNlVHlwZSA9IG51bGw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbktlZXBBbGl2ZSA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25DbG9zZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTkNPRElOR19TVFJJTkcgPSBuZXcgU3RyaW5nW10gewotCQkiY2h1bmtlZCIsICJpZGVudGl0eSIsICJnemlwIiwgImNvbXByZXNzZWQiLCAiZGVmbGF0ZSJ9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIEVOQ09ESU5HX0NIVU5LRUQgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBFTkNPRElOR19JREVOVElUWSA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIEVOQ09ESU5HX0daSVAgPSAyOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBFTkNPRElOR19DT01QUkVTU0VEID0gMzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgRU5DT0RJTkdfREVGTEFURSA9IDQ7Ci0KLS8qIGNoYW5nZToKLVJlZmVyZXI6IGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9pbmRleC5odG1sCi1Ib3N0OiBsb2NhbGhvc3Q6ODA4MQotKi8KLS8qIFRoZSBDb25uZWN0aW9uIGhlYWRlciBoYXMgdGhlIGZvbGxvd2luZyBncmFtbWFyOgotCi0JICAgQ29ubmVjdGlvbiA9ICJDb25uZWN0aW9uIiAiOiIgMSMoY29ubmVjdGlvbi10b2tlbikKLQkgICBjb25uZWN0aW9uLXRva2VuICA9IHRva2VuCi0KLSAgIEhUVFAvMS4xIHByb3hpZXMgTVVTVCBwYXJzZSB0aGUgQ29ubmVjdGlvbiBoZWFkZXIgZmllbGQgYmVmb3JlIGEKLSAgIG1lc3NhZ2UgaXMgZm9yd2FyZGVkIGFuZCwgZm9yIGVhY2ggY29ubmVjdGlvbi10b2tlbiBpbiB0aGlzIGZpZWxkLAotICAgcmVtb3ZlIGFueSBoZWFkZXIgZmllbGQocykgZnJvbSB0aGUgbWVzc2FnZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlCi0gICBjb25uZWN0aW9uLXRva2VuLiAqLwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IEhUVFAgdGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBjb25uMgotCSAqIEBwYXJhbSBpbgotCSAqIEBwYXJhbSBvdXQKLQkgKiBAcGFyYW0gY29ubgotCSAqIEBwYXJhbSBpc1JlcXVlc3QKLQkgKiBAcGFyYW0gaG9zdAotCSAqIEBwYXJhbSBwb3J0Ci0JICovCi0JcHVibGljIEhUVFBUaHJlYWQoQ29ubmVjdGlvbiBjb25uMiwgSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQsIEhUVFBDb25uZWN0aW9uIGNvbm4sIGJvb2xlYW4gaXNSZXF1ZXN0LCBTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKLQkJc3VwZXIoIlRDUC9JUCBNb25pdG9yIEhUVFAgQ29ubmVjdGlvbiIpOwotCQl0aGlzLmNvbm4yID0gY29ubjI7Ci0JCXRoaXMuaW4gPSBpbjsKLQkJdGhpcy5vdXQgPSBvdXQ7Ci0JCXRoaXMuY29ubiA9IGNvbm47Ci0JCXRoaXMuaXNSZXF1ZXN0ID0gaXNSZXF1ZXN0OwotCQl0aGlzLmhvc3QgPSBob3N0OwotCQl0aGlzLnBvcnQgPSBwb3J0OwotCQotCQlzZXROYW1lKCJIVFRQICgiICsgaG9zdCArICI6IiArIHBvcnQgKyAiKSAiICsgKGlzUmVxdWVzdCA/ICJSRVFVRVNUIiA6ICJSRVNQT05TRSIpICsgIiAiICsgKHRocmVhZENvdW50KyspKTsKLQkJc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgKyAxKTsKLQkJc2V0RGFlbW9uKHRydWUpOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlN0YXJ0ZWQ6ICIgKyB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IEhUVFAgdGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBjb25uMgotCSAqIEBwYXJhbSBpbgotCSAqIEBwYXJhbSBvdXQKLQkgKiBAcGFyYW0gY29ubgotCSAqIEBwYXJhbSBpc1JlcXVlc3QKLQkgKiBAcGFyYW0gaG9zdAotCSAqIEBwYXJhbSBwb3J0Ci0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgSFRUUFRocmVhZChDb25uZWN0aW9uIGNvbm4yLCBJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCwgSFRUUENvbm5lY3Rpb24gY29ubiwgYm9vbGVhbiBpc1JlcXVlc3QsIFN0cmluZyBob3N0LCBpbnQgcG9ydCwgSFRUUFRocmVhZCByZXF1ZXN0KSB7Ci0JCXRoaXMoY29ubjIsIGluLCBvdXQsIGNvbm4sIGlzUmVxdWVzdCwgaG9zdCwgcG9ydCk7Ci0JCQotCQl0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGxpbmUgZmVlZCB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGFycmF5LgotCSAqIEByZXR1cm4gYnl0ZVtdCi0JICogQHBhcmFtIGIgYnl0ZVtdCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gY29udmVydChieXRlW10gYikgewotCQlpZiAoYiA9PSBudWxsIHx8IGIubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gYjsKLQkKLQkJaW50IHNpemUgPSBiLmxlbmd0aDsKLQkJYnl0ZVtdIHggPSBuZXcgYnl0ZVtzaXplICsgMl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgeCwgMCwgc2l6ZSk7Ci0JCXhbc2l6ZV0gPSAoYnl0ZSkgJ1xyJzsgICAgIC8vIENSCi0JCXhbc2l6ZSArIDFdID0gKGJ5dGUpICdcbic7IC8vIExGCi0JCXJldHVybiB4OwotCX0KLQotCS8qKgotCSAqIFJlYWQgbW9yZSBkYXRhIGludG8gdGhlIGJ1ZmZlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IG4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCQkKLQkJaWYgKG4gPD0gMCkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRW5kIG9mIGlucHV0Iik7Ci0JCQotCQkvLyBhZGQgdG8gZnVsbCBidWZmZXIKLQkJaW50IGxlbiA9IGJ1ZmZlci5sZW5ndGggLSBidWZmZXJJbmRleDsKLQkJaWYgKGxlbiA8IDApCi0JCQlsZW4gPSAwOwotCQlieXRlW10geCA9IG5ldyBieXRlW24gKyBsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmZmVySW5kZXgsIHgsIDAsIGxlbik7Ci0JCVN5c3RlbS5hcnJheWNvcHkocmVhZEJ1ZmZlciwgMCwgeCwgbGVuLCBuKTsKLQkJYnVmZmVySW5kZXggPSAwOwotCQlidWZmZXIgPSB4OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGxvY2F0aW9uIG9mIGEgQ1JMRi4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHJvdGVjdGVkIGludCBnZXRGaXJzdENSTEYoKSB7Ci0JCWludCBzaXplID0gYnVmZmVyLmxlbmd0aDsKLQkJaW50IGkgPSBidWZmZXJJbmRleCArIDE7Ci0JCXdoaWxlIChpIDwgc2l6ZSkgewotCQkJaWYgKGJ1ZmZlcltpIC0gMV0gPT0gQ1IgJiYgYnVmZmVyW2ldID09IExGKQotCQkJCXJldHVybiBpOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBPdXRwdXQgdGhlIGdpdmVuIGJ5dGVzLgotCSAqIEBwYXJhbSBiIGJ5dGVbXQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG91dHB1dEJ5dGVzKGJ5dGVbXSBiLCBib29sZWFuIGlzTmV3KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvdXQud3JpdGUoYik7Ci0JCWlmIChpc1JlcXVlc3QpCi0JCQljb25uLmFkZFJlcXVlc3QoYiwgaXNOZXcpOwotCQllbHNlCi0JCQljb25uLmFkZFJlc3BvbnNlKGIsIGlzTmV3KTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSB0aGUgSFRUUCBib2R5LgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZUJvZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUGFyc2luZyBib2R5IGZvcjogIiArIHRoaXMpOwotCQkKLQkJaWYgKHJlc3BvbnNlVHlwZSAhPSBudWxsICYmICgiMjA0Ii5lcXVhbHMocmVzcG9uc2VUeXBlKSB8fCAiMzA0Ii5lcXVhbHMocmVzcG9uc2VUeXBlKSkpIHsKLQkJCXNldEhUVFBCb2R5KG5ldyBieXRlWzBdKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGlzUmVxdWVzdCkgewotCQkJaWYgKGNvbnRlbnRMZW5ndGggIT0gLTEpIHsKLQkJCQlpZiAoY29udGVudExlbmd0aCA8IDEwMjQgKiAxMDI0KSB7IC8vIDFNYgotCQkJCQlieXRlW10gYiA9IHJlYWRCeXRlcyhjb250ZW50TGVuZ3RoKTsKLQkJCQkJb3V0LndyaXRlKGIpOwotCQkJCQljb25uLmFkZFJlcXVlc3QoYiwgZmFsc2UpOwotCQkJCQlzZXRIVFRQQm9keShiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlieXRlW10gYiA9IHJlbW92ZUZyb21CdWZmZXIoTWF0aC5taW4oYnVmZmVySW5kZXgsIGNvbnRlbnRMZW5ndGgpKTsKLQkJCQkJaW50IGJ5dGVzTGVmdCA9IGNvbnRlbnRMZW5ndGggLSBiLmxlbmd0aDsKLQkJCQkJb3V0LndyaXRlKGIpOwotCQkJCQkKLQkJCQkJaW50IG4gPSAwOwotCQkJCQl3aGlsZSAoYnl0ZXNMZWZ0ID4gMCkgewotCQkJCQkJbiA9IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQkJCQlieXRlc0xlZnQgLT0gbjsKLQkJCQkJCW91dC53cml0ZShyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJYiA9IE1lc3NhZ2VzLmVycm9yQ29udGVudFNpemUuZ2V0Qnl0ZXMoKTsKLQkJCQkJY29ubi5hZGRSZXF1ZXN0KGIsIGZhbHNlKTsKLQkJCQkJc2V0SFRUUEJvZHkoYik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0cmFuc2ZlckVuY29kaW5nICE9IC0xICYmIHRyYW5zZmVyRW5jb2RpbmcgIT0gRU5DT0RJTkdfSURFTlRJVFkpIHsKLQkJCQlwYXJzZUNodW5rKCk7Ci0JCQl9Ci0JCQkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJEb25lIHBhcnNpbmcgcmVxdWVzdCBib2R5IGZvcjogIiArIHRoaXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBqdXN0IHJldHVybiBib2R5IGZvciBIVFRQIDEuMCByZXNwb25zZXMKLQkJaWYgKCFpc1JlcXVlc3QgJiYgIWNvbm5lY3Rpb25LZWVwQWxpdmUgJiYgY29udGVudExlbmd0aCA9PSAtMSAmJiB0cmFuc2ZlckVuY29kaW5nID09IC0xKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiQXNzdW1pbmcgSFRUUCAxLjAgZm9yOiAiICsgdGhpcyk7Ci0JCQlpbnQgbiA9IGJ1ZmZlci5sZW5ndGggLSBidWZmZXJJbmRleDsKLQkJCWJ5dGVbXSBiID0gcmVhZEJ5dGVzKG4pOwotCQkJYnl0ZVtdIGJvZHkgPSBuZXcgYnl0ZVswXTsKLQkJCXdoaWxlIChuID49IDApIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiQnl0ZXMgcmVhZDogIiArIG4gKyAiICIgKyB0aGlzKTsKLQkJCQlpZiAoYiAhPSBudWxsICYmIG4gPiAwKSB7Ci0JCQkJCWJ5dGVbXSB4ID0gbnVsbDsKLQkJCQkJaWYgKG4gPT0gYi5sZW5ndGgpCi0JCQkJCQl4ID0gYjsKLQkJCQkJZWxzZSB7Ci0JCQkJCQl4ID0gbmV3IGJ5dGVbbl07Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGIsIDAsIHgsIDAsIG4pOwotCQkJCQl9Ci0JCQkJCW91dHB1dEJ5dGVzKHgsIGZhbHNlKTsKLQkJCQkJCi0JCQkJCS8vIGNvcHkgdG8gSFRUUCBib2R5Ci0JCQkJCWJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbYm9keS5sZW5ndGggKyB4Lmxlbmd0aF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoYm9keSwgMCwgdGVtcCwgMCwgYm9keS5sZW5ndGgpOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHgsIDAsIHRlbXAsIGJvZHkubGVuZ3RoLCB4Lmxlbmd0aCk7Ci0JCQkJCWJvZHkgPSB0ZW1wOwotCQkJCX0KLQkJCQlpZiAoYiA9PSBudWxsIHx8IGIubGVuZ3RoIDwgQlVGRkVSKQotCQkJCQliID0gbmV3IGJ5dGVbQlVGRkVSXTsKLQkJCQluID0gaW4ucmVhZChiKTsKLQkJCQlUaHJlYWQueWllbGQoKTsKLQkJCX0KLQkJCW91dC5mbHVzaCgpOwotCQkJc2V0SFRUUEJvZHkoYm9keSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHNwZWMgNC40LjEKLQkJaWYgKHJlc3BvbnNlVHlwZSAhPSBudWxsICYmIHJlc3BvbnNlVHlwZS5zdGFydHNXaXRoKCIxIikpIHsKLQkJCXNldEhUVFBCb2R5KG5ldyBieXRlWzBdKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gc3BlYyA0LjQuMgotCQlpZiAodHJhbnNmZXJFbmNvZGluZyAhPSAtMSAmJiB0cmFuc2ZlckVuY29kaW5nICE9IEVOQ09ESU5HX0lERU5USVRZKSB7Ci0JCQlwYXJzZUNodW5rKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHNwZWMgNC40LjMKLQkJaWYgKGNvbnRlbnRMZW5ndGggIT0gLTEpIHsKLQkJCWlmIChjb250ZW50TGVuZ3RoIDwgMTAyNCAqIDEwMjQpIHsgLy8gMU1iCi0JCQkJYnl0ZVtdIGIgPSByZWFkQnl0ZXMoY29udGVudExlbmd0aCk7Ci0JCQkJb3V0LndyaXRlKGIpOwotCQkJCWlmIChpc1JlcXVlc3QpCi0JCQkJCWNvbm4uYWRkUmVxdWVzdChiLCBmYWxzZSk7Ci0JCQkJZWxzZQotCQkJCQljb25uLmFkZFJlc3BvbnNlKGIsIGZhbHNlKTsKLQkJCQlzZXRIVFRQQm9keShiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnl0ZVtdIGIgPSByZW1vdmVGcm9tQnVmZmVyKE1hdGgubWluKGJ1ZmZlckluZGV4LCBjb250ZW50TGVuZ3RoKSk7Ci0JCQkJaW50IGJ5dGVzTGVmdCA9IGNvbnRlbnRMZW5ndGggLSBiLmxlbmd0aDsKLQkJCQlvdXQud3JpdGUoYik7Ci0JCQkJCi0JCQkJaW50IG4gPSAwOwotCQkJCXdoaWxlIChieXRlc0xlZnQgPiAwKSB7Ci0JCQkJCW4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCQkJCQlieXRlc0xlZnQgLT0gbjsKLQkJCQkJb3V0LndyaXRlKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCX0KLQkJCQkKLQkJCQliID0gTWVzc2FnZXMuZXJyb3JDb250ZW50U2l6ZS5nZXRCeXRlcygpOwotCQkJCWlmIChpc1JlcXVlc3QpCi0JCQkJCWNvbm4uYWRkUmVxdWVzdChiLCBmYWxzZSk7Ci0JCQkJZWxzZQotCQkJCQljb25uLmFkZFJlc3BvbnNlKGIsIGZhbHNlKTsKLQkJCQlzZXRIVFRQQm9keShiKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gc3BlYyA0LjQuNCAoPykKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJVbmtub3duIGJvZHkgZm9yOiAiICsgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgYW4gSFRUUCBjaHVuay4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2VDaHVuaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJQYXJzaW5nIGNodW5rIGZvcjogIiArIHRoaXMpOwotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJYnl0ZVtdIGJvZHkgPSBuZXcgYnl0ZVswXTsKLQkKLQkJd2hpbGUgKCFkb25lKSB7Ci0JCQkvLyByZWFkIGNodW5rIHNpemUKLQkJCWJ5dGVbXSBiID0gcmVhZExpbmUoKTsKLQkKLQkJCVN0cmluZyBzID0gbmV3IFN0cmluZyhiKTsKLQkJCWludCBpbmRleCA9IHMuaW5kZXhPZigiICIpOwotCQkJaW50IGxlbmd0aCA9IC0xOwotCQkJdHJ5IHsKLQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQlzID0gcy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCWxlbmd0aCA9IEludGVnZXIucGFyc2VJbnQocy50cmltKCksIDE2KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkVycm9yIGNodW5rIGZvcjogIiArIHRoaXMsIGUpOwotCQkJfQotCQotCQkJLy8gb3V0cHV0IGJ5dGVzCi0JCQlvdXRwdXRCeXRlcyhiLCBmYWxzZSk7Ci0JCi0JCQlpZiAobGVuZ3RoIDw9IDApCi0JCQkJZG9uZSA9IHRydWU7Ci0JCQllbHNlIHsKLQkJCQkvLyByZWFkIGFuZCBvdXRwdXQgY2h1bmsgZGF0YSBwbHVzIENSTEYKLQkJCQliID0gcmVhZEJ5dGVzKGxlbmd0aCArIDIpOwotCQkJCW91dHB1dEJ5dGVzKGIsIGZhbHNlKTsKLQkJCQkKLQkJCQkvLyBjb3B5IHRvIEhUVFAgYm9keQotCQkJCWJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbYm9keS5sZW5ndGggKyBiLmxlbmd0aCAtIDJdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoYm9keSwgMCwgdGVtcCwgMCwgYm9keS5sZW5ndGgpOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgdGVtcCwgYm9keS5sZW5ndGgsIGIubGVuZ3RoIC0gMik7Ci0JCQkJYm9keSA9IHRlbXA7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gcmVhZCB0cmFpbGVyCi0JCWJ5dGVbXSBiID0gcmVhZExpbmUoKTsKLQkJd2hpbGUgKGIubGVuZ3RoID4gMikgewotCQkJb3V0cHV0Qnl0ZXMoYiwgZmFsc2UpOwotCQkJYiA9IHJlYWRMaW5lKCk7Ci0JCX0KLQkKLQkJb3V0cHV0Qnl0ZXMoYiwgZmFsc2UpOwotCQlzZXRIVFRQQm9keShib2R5KTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSBhbiBIVFRQIGhlYWRlci4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2VIZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUGFyc2luZyBoZWFkZXIgZm9yOiAiICsgdGhpcyk7Ci0JCi0JCS8vIHJlYWQgdW50aWwgZmlyc3QgYmxhbmsgbGluZQotCQlib29sZWFuIGlzRmlyc3RMaW5lID0gdHJ1ZTsKLQkJYm9vbGVhbiBpc05ldyA9IHRydWU7Ci0JCi0JCWJ5dGVbXSBiID0gcmVhZExpbmUoKTsKLQkJd2hpbGUgKGIubGVuZ3RoID4gNSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlBhcnNpbmcgaGVhZGVyIGxpbmU6ICciICsgbmV3IFN0cmluZyhiKSArICInIik7Ci0JCQkKLQkJCWlmIChpc0ZpcnN0TGluZSkgewotCQkJCVN0cmluZyBzID0gbmV3IFN0cmluZyhiKTsKLQkJCQlpZiAoaXNSZXF1ZXN0KSB7Ci0JCQkJCXNldExhYmVsKHMpOwotCQkJCQlpc05ldyA9IGZhbHNlOwotCQkJCX0KLQkKLQkJCQlpZiAoIWlzUmVxdWVzdCkgewotCQkJCQlpbnQgaW5kZXgxID0gcy5pbmRleE9mKCcgJyk7Ci0JCQkJCWludCBpbmRleDIgPSBzLmluZGV4T2YoJyAnLCBpbmRleDEgKyAxKTsKLQkKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3BvbnNlVHlwZSA9IHMuc3Vic3RyaW5nKGluZGV4MSArIDEsIGluZGV4MikudHJpbSgpOwotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlJlc3BvbnNlIFR5cGU6ICIgKyB0aGlzICsgIiAiICsgcmVzcG9uc2VUeXBlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJFcnJvciBwYXJzaW5nIHJlc3BvbnNlIHR5cGUgZm9yOiAiICsgdGhpcywgZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJlc3BvbnNlVHlwZSAhPSBudWxsICYmIHJlc3BvbnNlVHlwZS5lcXVhbHMoIjEwMCIpKSB7Ci0JCQkJCQlvdXRwdXRCeXRlcyhiLCBpc05ldyk7Ci0JCQkJCQlpc05ldyA9IGZhbHNlOwotCi0JCQkJCQliID0gcmVhZExpbmUoKTsKLQkJCQkJCW91dHB1dEJ5dGVzKGIsIGZhbHNlKTsKLQotCQkJCQkJYiA9IHJlYWRMaW5lKCk7Ci0KLQkJCQkJCWluZGV4MSA9IHMuaW5kZXhPZignICcpOwotCQkJCQkJaW5kZXgyID0gcy5pbmRleE9mKCcgJywgaW5kZXgxICsgMSk7Ci0KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmVzcG9uc2VUeXBlID0gcy5zdWJzdHJpbmcoaW5kZXgxICsgMSwgaW5kZXgyKS50cmltKCk7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlJlc3BvbnNlIFR5cGU6ICIgKyB0aGlzICsgIiAiICsgcmVzcG9uc2VUeXBlKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkVycm9yIHBhcnNpbmcgcmVzcG9uc2UgdHlwZSBmb3I6ICIgKyB0aGlzLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpc0ZpcnN0TGluZSA9IGZhbHNlOwotCQkJfQotCQotCQkJLy8gdHJhbnNsYXRlCi0JCQliID0gdHJhbnNsYXRlSGVhZGVyTGluZShiKTsKLQkJCQotCQkJb3V0cHV0Qnl0ZXMoYiwgaXNOZXcpOwotCQkJaXNOZXcgPSBmYWxzZTsKLQkKLQkJCWIgPSByZWFkTGluZSgpOwotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUGFyc2luZyBmaW5hbCBoZWFkZXIgbGluZTogJyIgKyBuZXcgU3RyaW5nKGIpICsgIiciKTsKLQkJCi0JCW91dHB1dEJ5dGVzKGIsIGZhbHNlKTsKLQkJCi0JCVJlcXVlc3QgcnIgPSBjb25uLmdldFJlcXVlc3RSZXNwb25zZShpc1JlcXVlc3QpOwotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiU2V0dGluZyBoZWFkZXIgbGVuZ3RoOiAiICsgcnIuZ2V0UmVxdWVzdChSZXF1ZXN0LkFMTCkubGVuZ3RoKTsKLQkJCi0JCXNldEhUVFBIZWFkZXIocnIpOwotCX0KLQotCS8qKgotCSAqIFJlYWQgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgotCSAqIEByZXR1cm4gYnl0ZVtdCi0JICovCi0JcHJvdGVjdGVkIGJ5dGVbXSByZWFkQnl0ZXMoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJyZWFkQnl0ZXMoKSAiICsgbiArICIgZm9yOiAiICsgdGhpcyk7Ci0JCXdoaWxlIChidWZmZXIubGVuZ3RoIC0gYnVmZmVySW5kZXggPCBuKQotCQkJZmlsbEJ1ZmZlcigpOwotCQkKLQkJcmV0dXJuIHJlbW92ZUZyb21CdWZmZXIoYnVmZmVySW5kZXggKyBuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkIGFuZCByZXR1cm4gdGhlIG5leHQgZnVsbCBsaW5lLgotCSAqCi0JICogQHJldHVybiBieXRlW10KLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgInJlYWRMaW5lKCkgZm9yOiAiICsgdGhpcyk7Ci0JCQotCQlpbnQgbiA9IGdldEZpcnN0Q1JMRigpOwotCQl3aGlsZSAobiA8IDApIHsKLQkJCWZpbGxCdWZmZXIoKTsKLQkJCW4gPSBnZXRGaXJzdENSTEYoKTsKLQkJfQotCQlyZXR1cm4gcmVtb3ZlRnJvbUJ1ZmZlcihuICsgMSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGRhdGEgZnJvbSB0aGUgYnVmZmVyIHVwIHRvIHRoZSBhYnNvbHV0ZSBpbmRleCBuLgotCSAqIFJldHVybiB0aGUgZGF0YSBmcm9tIGJldHdlZW4gYnVmZmVySW5kZXggYW5kIG4uCi0JICoKLQkgKiBAcGFyYW0gbiB0aGUgYnl0ZXMgdG8gcmVtb3ZlCi0JICogQHJldHVybiBhIGJ5dGUgYXJyYXkKLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIHJlbW92ZUZyb21CdWZmZXIoaW50IG4pIHsKLQkJLy8gY29weSBsaW5lIG91dCBvZiBidWZmZXIKLQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtuIC0gYnVmZmVySW5kZXhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmZmVySW5kZXgsIGIsIDAsIG4gLSBidWZmZXJJbmRleCk7Ci0JCQotCQlpZiAoYnVmZmVyLmxlbmd0aCA+IEJVRkZFUiAqIDIgfHwgYnVmZmVySW5kZXggPiBCVUZGRVIpIHsKLQkJCS8vIHJlbW92ZSBsaW5lIGZyb20gYnVmZmVyCi0JCQlpbnQgc2l6ZSA9IGJ1ZmZlci5sZW5ndGg7Ci0JCQlieXRlW10geCA9IG5ldyBieXRlW3NpemUgLSBuXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBuLCB4LCAwLCBzaXplIC0gbik7Ci0JCQlidWZmZXIgPSB4OwotCQkJYnVmZmVySW5kZXggPSAwOwotCQl9IGVsc2UKLQkJCWJ1ZmZlckluZGV4ID0gbjsKLQkJCi0JCXJldHVybiBiOwotCX0KLQotCS8qKgotCSAqIExpc3RlbiBmb3IgaW5wdXQsIHNhdmUgaXQsIGFuZCBwYXNzIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqIFBoaWxvc29waHk6IFJlYWQgYSBzaW5nbGUgbGluZSBzZXBhcmF0ZWx5IGFuZCB0cmFuc2xhdGUuCi0JICogV2hlbiBibGFuayBsaW5lIGlzIHJlYWNoZWQsIGp1c3QgcGFzcyBhbGwgb3RoZXIgZGF0YSB0aHJvdWdoLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJY29udGVudExlbmd0aCA9IC0xOwotCQkJCQl0cmFuc2ZlckVuY29kaW5nID0gLTE7Ci0JCQkJCWNvbm5lY3Rpb25LZWVwQWxpdmUgPSBmYWxzZTsKLQkJCQkJY29ubmVjdGlvbkNsb3NlID0gZmFsc2U7Ci0JCQkJCQotCQkJCQlwYXJzZUhlYWRlcigpOwotCQkJCQlwYXJzZUJvZHkoKTsKLQkJCQkJCi0JCQkJCWlmIChpc1JlcXVlc3QgJiYgY29ubmVjdGlvbktlZXBBbGl2ZSkKLQkJCQkJCXdhaXRGb3JSZXNwb25zZSgpOwotCQkJCQkKLQkJCQkJLy9SZXF1ZXN0IHIgPSBjb25uLmdldFJlcXVlc3RSZXNwb25zZSh0cnVlKTsKLQkJCQkJLy9yLmZpcmVDaGFuZ2VkRXZlbnQoKTsKLQkJCQkJCi0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJEb25lIEhUVFAgcmVxdWVzdCBmb3IgIiArIHRoaXMgKyAiICIgKyBjb25uZWN0aW9uS2VlcEFsaXZlKTsKLQkJCQkJaWYgKCFpc1JlcXVlc3QgJiYgKCFyZXF1ZXN0LmNvbm5lY3Rpb25LZWVwQWxpdmUgfHwgY29ubmVjdGlvbkNsb3NlKSkgewotCQkJCQkJY29ubjIuY2xvc2UoKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmNvbm5lY3Rpb25LZWVwQWxpdmUgJiYgY29ubmVjdGlvbkNsb3NlKQotCQkJCQkJCXJlcXVlc3QuY29ubmVjdGlvbktlZXBBbGl2ZSA9IGZhbHNlOwotCQkJCQkJCW5vdGlmeVJlcXVlc3QoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoIWlzUmVxdWVzdCkKLQkJCQkJCW5vdGlmeVJlcXVlc3QoKTsKLQkJCQkJCi0JCQkJCVRocmVhZC55aWVsZCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyByZWFjaGVkIGVuZCBvZiBpbnB1dAotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJFbmQgb2YgYnVmZmVyIGZvcjogIiArIHRoaXMsIGUpOwotCQkJCWlmICghaXNSZXF1ZXN0KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXF1ZXN0LmNvbm5lY3Rpb25LZWVwQWxpdmUgPSBmYWxzZTsKLQkJCQkJCXJlcXVlc3QuY29ubjIuY2xvc2UoKTsKLQkJCQkJCW5vdGlmeVJlcXVlc3QoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgY2xvc2luZyByZXF1ZXN0IGluIHJlc3BvbnNlIHRvIGVycm9yOiAiICsgdGhpcywgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIHNlbmQgcmVzdCBvZiBidWZmZXIKLQkJCW91dC53cml0ZShidWZmZXIsIGJ1ZmZlckluZGV4LCBidWZmZXIubGVuZ3RoIC0gYnVmZmVySW5kZXgpOwotCQkJb3V0LmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgaW46ICIgKyB0aGlzLCBlKTsKLQkJfQotCQkvL2lmICghaXNSZXF1ZXN0KQotCQkvLwljb25uMi5jbG9zZSgpOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkNsb3NpbmcgdGhyZWFkICIgKyB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0aXRsZSBvZiB0aGUgY2FsbC4KLQkgKgotCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbChTdHJpbmcgcykgewotCQl0cnkgewotCQkJaW50IGluZGV4MSA9IHMuaW5kZXhPZignICcpOwotCQkJaWYgKGluZGV4MSA8IDAgfHwgaW5kZXgxID4gMTUpCi0JCQkJcmV0dXJuOwotCQkJaW50IGluZGV4MiA9IHMuaW5kZXhPZignICcsIGluZGV4MSArIDEpOwotCQkJaWYgKGluZGV4MiA8IDApCi0JCQkJcmV0dXJuOwotCQotCQkJY29ubi5zZXRMYWJlbChzLnN1YnN0cmluZyhpbmRleDEgKyAxLCBpbmRleDIpLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogVHJhbnNsYXRlIHRoZSBoZWFkZXIgbGluZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJ5dGVbXQotCSAqIEBwYXJhbSBiIGJ5dGVbXQotCSAqLwotCXByb3RlY3RlZCBieXRlW10gdHJhbnNsYXRlSGVhZGVyTGluZShieXRlW10gYikgewotCQlTdHJpbmcgcyA9IG5ldyBTdHJpbmcoYik7Ci0JCi0JCWlmIChpc1JlcXVlc3QgJiYgcy5zdGFydHNXaXRoKCJIb3N0OiAiKSkgewotCQkJU3RyaW5nIHQgPSAiSG9zdDogIiArIGhvc3Q7Ci0JCQlpZiAocG9ydCAhPSA4MCkKLQkJCQl0ICs9ICI6IiArIHBvcnQ7Ci0JCQlyZXR1cm4gY29udmVydCh0LmdldEJ5dGVzKCkpOwotCQl9IGVsc2UgaWYgKHMuc3RhcnRzV2l0aCgiQ29udGVudC1MZW5ndGg6ICIpKSB7Ci0JCQl0cnkgewotCQkJCWNvbnRlbnRMZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KHMuc3Vic3RyaW5nKDE2KS50cmltKCkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJDb250ZW50IGxlbmd0aDogIiArIHRoaXMgKyAiICIgKyBjb250ZW50TGVuZ3RoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkNvbnRlbnQgbGVuZ3RoIGVycm9yIiwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocy5zdGFydHNXaXRoKCJDb25uZWN0aW9uOiAiKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdCA9IHMuc3Vic3RyaW5nKDExKS50cmltKCk7Ci0JCQkJaWYgKHQuZXF1YWxzSWdub3JlQ2FzZSgiS2VlcC1BbGl2ZSIpKQotCQkJCQljb25uZWN0aW9uS2VlcEFsaXZlID0gdHJ1ZTsKLQkJCQkvLyByZXNwb25zZSBjb250YWlucyAiQ29ubmVjdGlvbjogY2xvc2UiIGhlYWRlcgotCQkJCS8vIGNsb3NlIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudCBldmVuIGlmICJrZWVwYWxpdmUiIGhhZCBiZWVuIHJlcXVlc3RlZAotCQkJCS8vIHdlIGNhbid0IGp1c3QgcmVzZXQgcmVxdWVzdC5rZWVwQWxpdmUgLSBpdCdzIHVzZWQgYXMgaW5kaWNhdG9yIHdoZXRoZXIKLQkJCQkvLyB0aGUgcmVxdWVzdCB0aHJlYWQgaXMgKGdvaW5nIHRvKSB3YWl0IGZvciB0aGUgcmVzcG9uc2UgdGhyZWFkCi0JCQkJLy8gKGFuZCBtdXN0IGJlIG5vdGlmaWVkIChvbmx5IHRoZW4pKSwKLQkJCQkvLyBzbyB3ZSBoYXZlIHRvIGxldCBpdCBhbG9uZQotCQkJCWlmICh0LmVxdWFsc0lnbm9yZUNhc2UoImNsb3NlIikpCi0JCQkJCWNvbm5lY3Rpb25DbG9zZSA9IHRydWU7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIktlZXAgYWxpdmU6ICIgKyBjb25uZWN0aW9uS2VlcEFsaXZlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkVycm9yIGdldHRpbmcgQ29ubmVjdGlvbjogZnJvbSBoZWFkZXIiLCBlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChzLnN0YXJ0c1dpdGgoIlRyYW5zZmVyLUVuY29kaW5nOiAiKSkgewotCQkJU3RyaW5nIHQgPSBzLnN1YnN0cmluZygxOSkudHJpbSgpOwotCQkJaW50IHNpemUgPSBFTkNPRElOR19TVFJJTkcubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoRU5DT0RJTkdfU1RSSU5HW2ldLmVxdWFsc0lnbm9yZUNhc2UodCkpIHsKLQkJCQkJdHJhbnNmZXJFbmNvZGluZyA9IChieXRlKSBpOwotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiVHJhbnNmZXIgZW5jb2Rpbmc6ICIgKyBFTkNPRElOR19TVFJJTkdbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB7Ci0JCXRyeSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiQ2xvc2luZzogIiArIHRoaXMpOwotCQkJb3V0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgY2xvc2luZyBjb25uZWN0aW9uICIgKyB0aGlzLCBlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdhaXRGb3JSZXNwb25zZSgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIldhaXRpbmcgZm9yIHJlc3BvbnNlICIgKyB0aGlzKTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQl0cnkgewotCQkJCWlzV2FpdGluZyA9IHRydWU7Ci0JCQkJd2FpdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgaW4gd2FpdEZvclJlc3BvbnNlKCkgIiArIHRoaXMsIGUpOwotCQkJfQotCQkJaXNXYWl0aW5nID0gZmFsc2U7Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkRvbmUgd2FpdGluZyBmb3IgcmVzcG9uc2UgIiArIHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVJlcXVlc3QoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJOb3RpZnlpbmcgcmVxdWVzdCAiICsgdGhpcyk7Ci0JCXdoaWxlIChyZXF1ZXN0LmNvbm5lY3Rpb25LZWVwQWxpdmUgJiYgIXJlcXVlc3QuaXNXYWl0aW5nKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiV2FpdGluZyBmb3IgcmVxdWVzdCAiICsgdGhpcyk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlzeW5jaHJvbml6ZWQgKHJlcXVlc3QpIHsKLQkJCXRyeSB7Ci0JCQkJcmVxdWVzdC5ub3RpZnkoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkVycm9yIGluIG5vdGlmeVJlcXVlc3QoKSAiICsgdGhpcywgZSk7Ci0JCQl9Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkRvbmUgbm90aWZ5aW5nIHJlcXVlc3QgIiArIHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEhUVFBIZWFkZXIoUmVxdWVzdCBycikgewotCQlpZiAoaXNSZXF1ZXN0KSB7Ci0JCQlieXRlW10gYiA9IHJyLmdldFJlcXVlc3QoUmVxdWVzdC5BTEwpOwotCQkJYnl0ZVtdIGggPSBuZXcgYnl0ZVtiLmxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGIsIDAsIGgsIDAsIGIubGVuZ3RoKTsKLQkJCXJyLnNldFByb3BlcnR5KEhUVFBSZXF1ZXN0LkhUVFBfUkVRVUVTVF9IRUFERVIsIGgpOwotCQl9IGVsc2UgewotCQkJYnl0ZVtdIGIgPSByci5nZXRSZXNwb25zZShSZXF1ZXN0LkFMTCk7Ci0JCQlieXRlW10gaCA9IG5ldyBieXRlW2IubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgaCwgMCwgYi5sZW5ndGgpOwotCQkJcnIuc2V0UHJvcGVydHkoSFRUUFJlcXVlc3QuSFRUUF9SRVNQT05TRV9IRUFERVIsIGgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SFRUUEJvZHkoYnl0ZVtdIGIpIHsKLQkJUmVxdWVzdCByciA9IGNvbm4uZ2V0UmVxdWVzdFJlc3BvbnNlKGlzUmVxdWVzdCk7Ci0JCWlmIChpc1JlcXVlc3QpCi0JCQlyci5zZXRQcm9wZXJ0eShIVFRQUmVxdWVzdC5IVFRQX1JFUVVFU1RfQk9EWSwgYik7Ci0JCWVsc2UKLQkJCXJyLnNldFByb3BlcnR5KEhUVFBSZXF1ZXN0LkhUVFBfUkVTUE9OU0VfQk9EWSwgYik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9SZXNlbmRIVFRQQ29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9SZXNlbmRIVFRQQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWUzNDQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvUmVzZW5kSFRUUENvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBBIHJlc2VuZCBIVFRQIGNvbm5lY3Rpb24gd3JhcHMgYW4gSFRUUCBjb25uZWN0aW9uIHRvIHNlbmQgYW4gZXhpc3RpbmcgcmVxdWVzdC4KLSAqLwotcHVibGljIGNsYXNzIFJlc2VuZEhUVFBDb25uZWN0aW9uIGV4dGVuZHMgSFRUUENvbm5lY3Rpb24gewotCXByb3RlY3RlZCBSZXF1ZXN0IGV4aXN0aW5nUmVxdWVzdDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyByZXNlbmQgY29ubmVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqLwotCXB1YmxpYyBSZXNlbmRIVFRQQ29ubmVjdGlvbihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuZXhpc3RpbmdSZXF1ZXN0ID0gcmVxdWVzdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuSFRUUENvbm5lY3Rpb24jZ2V0UmVxdWVzdFJlc3BvbnNlKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgUmVxdWVzdCBnZXRSZXF1ZXN0UmVzcG9uc2UoaW50IGkpIHsKLQkJcmV0dXJuIGV4aXN0aW5nUmVxdWVzdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9SZXNlbmRIVFRQUmVxdWVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9SZXNlbmRIVFRQUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTQ4ODU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvUmVzZW5kSFRUUFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHA7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlNvY2tldFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBXcmFwcyBhbiBleGlzdGluZyByZXF1ZXN0IHRvIGNyZWF0ZSBhbiBIVFRQIHJlcXVlc3QgdGhhdCBjYW4gYmUgc2VudC4gVGhlCi0gKiByZXNwb25zZSBpcyBpZ25vcmVkLiBPbmx5IHRoZSByZXF1ZXN0IGlzIGltcG9ydGFudCBpbiB0aGlzIGNhc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNlbmRIVFRQUmVxdWVzdCBleHRlbmRzIEhUVFBSZXF1ZXN0IHsKLQlwcml2YXRlIGJvb2xlYW4gc2VudCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBieXRlW10gaGVhZGVyOwotCi0JcHJpdmF0ZSBieXRlW10gY29udGVudDsKLQotCXByaXZhdGUgUmVxdWVzdCBvcmlnaW5hbFJlcXVlc3QgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gcmVxIHRoZSByZXF1ZXN0IHRoYXQgaXMgdG8gYmUgcmVzZW50LgotCSAqLwotCXB1YmxpYyBSZXNlbmRIVFRQUmVxdWVzdChNb25pdG9yIG1vbml0b3IsIFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKG1vbml0b3IsIHJlcS5nZXRMb2NhbFBvcnQoKSwgcmVxLmdldFJlbW90ZUhvc3QoKSwgcmVxLmdldFJlbW90ZVBvcnQoKSk7Ci0JCXNldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9IRUFERVIsIHJlcS5nZXRQcm9wZXJ0eShIVFRQX1JFUVVFU1RfSEVBREVSKSk7Ci0JCXNldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9CT0RZLCByZXEuZ2V0UHJvcGVydHkoSFRUUF9SRVFVRVNUX0JPRFkpKTsKLQkJaGVhZGVyID0gcmVxLmdldFJlcXVlc3QoVFJBTlNQT1JUKTsKLQkJY29udGVudCA9IHJlcS5nZXRSZXF1ZXN0KENPTlRFTlQpOwotCQlyZXF1ZXN0ID0gcmVxLmdldFJlcXVlc3QoQUxMKTsKLQkJbmFtZSA9IHJlcS5nZXROYW1lKCk7Ci0JCXRoaXMub3JpZ2luYWxSZXF1ZXN0ID0gcmVxOwotCX0KLQotCS8qKgotCSAqIFNlbmQgdGhlIHJlcXVlc3QuCi0JICovCi0JcHVibGljIHZvaWQgc2VuZFJlcXVlc3QoKSB7Ci0JCXRyeSB7Ci0JCQlTb2NrZXQgaW5Tb2NrZXQgPSBuZXcgU29ja2V0V3JhcHBlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVxdWVzdCkpOwotCQkJU29ja2V0IG91dFNvY2tldCA9IG5ldyBTb2NrZXQocmVtb3RlSG9zdCwgcmVtb3RlUG9ydCk7Ci0JCQkvL0Nvbm5lY3Rpb24gY29ubiA9IG5ldyBDb25uZWN0aW9uKGluU29ja2V0LCBvdXRTb2NrZXQpOwotCQkJLy9UQ1BJUFRocmVhZCByZXF1ZXN0VGhyZWFkID0gbmV3IFRDUElQVGhyZWFkKGNvbm4sIHRoaXMsIGluLAotCQkJLy8gb3V0U29ja2V0LmdldE91dHB1dFN0cmVhbSgpLCB0cnVlKTsKLQkJCS8vcmVxdWVzdFRocmVhZC5zdGFydCgpOwotCQkJLy9uZXcgVENQSVBUaHJlYWQoY29ubiwgdGhpcywgb3V0U29ja2V0LmdldElucHV0U3RyZWFtKCksCi0JCQkvLyBpblNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgZmFsc2UpLnN0YXJ0KCk7Ci0JCQlDb25uZWN0aW9uIGNvbm4yID0gbmV3IENvbm5lY3Rpb24oaW5Tb2NrZXQsIG91dFNvY2tldCk7Ci0JCQlSZXNlbmRIVFRQQ29ubmVjdGlvbiBjb25uID0gbmV3IFJlc2VuZEhUVFBDb25uZWN0aW9uKHRoaXMpOwotCi0JCQlIVFRQVGhyZWFkIHJlcXVlc3QyID0gbmV3IEhUVFBUaHJlYWQoY29ubjIsIGluU29ja2V0LmdldElucHV0U3RyZWFtKCksCi0JCQkJCW91dFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgY29ubiwgdHJ1ZSwgcmVtb3RlSG9zdCwgcmVtb3RlUG9ydCk7Ci0JCQlIVFRQVGhyZWFkIHJlc3BvbnNlMiA9IG5ldyBIVFRQVGhyZWFkKGNvbm4yLCBvdXRTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSwKLQkJCQkJaW5Tb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCksIGNvbm4sIGZhbHNlLCAibG9jYWxob3N0IiwgbG9jYWxQb3J0LCByZXF1ZXN0Mik7Ci0JCQlyZXF1ZXN0Mi5zdGFydCgpOwotCQkJcmVzcG9uc2UyLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3BvbnNlID0gKCJVbmFibGUgdG8gcmVzZW5kIHRvIHNlcnZlci5cbiIgKyBlKS5nZXRCeXRlcygpOwotCQl9Ci0JCXNlbnQgPSB0cnVlOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBSZXF1ZXN0I2FkZFRvUmVxdWVzdChieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9SZXF1ZXN0KGJ5dGVbXSBhZGRSZXF1ZXN0KSB7Ci0JCS8vIERvbid0IHdhbnQgdG8gYWRkIHRvIHRoZSByZXF1ZXN0IGFzIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmVxdWVzdC4KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzZW50LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQmVlblNlbnQoKSB7Ci0JCXJldHVybiBzZW50OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEBwYXJhbSB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWVzdChieXRlW10gcmVxdWVzdCwgaW50IHR5cGUpIHsKLQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCXJlcXVlc3QgPSBuZXcgYnl0ZVswXTsKLQkJaWYgKHR5cGUgPT0gVFJBTlNQT1JUKQotCQkJaGVhZGVyID0gcmVxdWVzdDsKLQkJZWxzZSBpZiAodHlwZSA9PSBDT05URU5UKQotCQkJY29udGVudCA9IHJlcXVlc3Q7Ci0JCQotCQlpbnQgbGVuZ3RoID0gMDsKLQkJaW50IGhlYWRlckxlbmd0aCA9IDA7Ci0JCWlmIChoZWFkZXIgIT0gbnVsbCkgewotCQkJbGVuZ3RoICs9IGhlYWRlci5sZW5ndGg7Ci0JCQloZWFkZXJMZW5ndGggPSBsZW5ndGg7Ci0JCX0KLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCWxlbmd0aCArPSBjb250ZW50Lmxlbmd0aDsKLQkJYnl0ZVtdIG5ld1JlcXVlc3QgPSBuZXcgYnl0ZVtsZW5ndGhdOwotCQlpZiAoaGVhZGVyICE9IG51bGwpCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGhlYWRlciwgMCwgbmV3UmVxdWVzdCwgMCwgaGVhZGVyLmxlbmd0aCk7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnQsIDAsIG5ld1JlcXVlc3QsIGhlYWRlckxlbmd0aCwgY29udGVudC5sZW5ndGgpOwotCQlzdXBlci5zZXRSZXF1ZXN0KG5ld1JlcXVlc3QpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBIVFRQUmVxdWVzdCNnZXRSZXF1ZXN0Q29udGVudCgpCi0JICovCi0JcHJvdGVjdGVkIGJ5dGVbXSBnZXRSZXF1ZXN0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIEhUVFBSZXF1ZXN0I2dldFJlcXVlc3RIZWFkZXIoKQotCSAqLwotCXByb3RlY3RlZCBieXRlW10gZ2V0UmVxdWVzdEhlYWRlcigpIHsKLQkJcmV0dXJuIGhlYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCByZXF1ZXN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgUmVxdWVzdCBnZXRPcmlnaW5hbFJlcXVlc3QoKSB7Ci0JCXJldHVybiBvcmlnaW5hbFJlcXVlc3Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0NvbnRlbnRGaWx0ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudEZpbHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2RmYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudEZpbHRlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLS8qKgotICogQSBjb250ZW50IGZpbHRlciB0aGF0IGZpbHRlcnMgY29udGVudHMgZnJvbSB0aGUgbW9uaXRvciB0cmFmZmljIG9uIGEgcmVxdWVzdC4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5jb250ZW50RmlsdGVyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogVGhlIHN1YmNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLCB3aGljaCB3aWxsIGJlIHVzZWQKLSAqIGF1dG9tYXRpY2FsbHkgdG8gaW5zdGFudGlhdGUgdGhlIGRlbGVnYXRlIHdoZW4gcmVxdWlyZWQuIAotICogPC9wPgotICogPHA+Ci0gKiBbaXNzdWU6IFRoZSBub3Rpb24gb2YgY29udGVudCBmaWx0ZXJzIGlzIGEgVUkvcHJlc2VudGF0aW9uCi0gKiBjb25jZXJuLCBub3Qgc29tZXRoaW5nIHRoYXQgaXMgbWFrZXMgc2Vuc2UgdG8gaGF2ZSBhcyBjb3JlCi0gKiBmdW5jdGlvbmFsaXR5LiBUaGUgY29udGVudEZpbHRlcnMgZXh0ZW5zaW9uIHBvaW50LCBJQ29udGVudEZpbHRlciwKLSAqIGFuZCBDb250ZW50RmlsdGVyRGVsZWdhdGUgc2hvdWxkIGFsbCBtb3ZlIHRvIHRoZSBvLmUud3N0LmludGVybmV0Lm1vbml0b3IudWkKLSAqIHBsdWctaW4uXQotICogW2lzc3VlOiBDUyAtIEknZCBlY2hvIHRoZSBjb21tZW50IGFib3ZlIHRoYXQgdGhpcyBzZWVtcyBsaWtlIGEgVUkgY29uY2Vybi4gIAotICogSSBub3RpY2VkIHRoZXJlJ3MgYWxzbyBhIHZpZXdlciBvbiB0aGUgVUkgc2lkZSwgc28gaSdtIG5vdCBzdXJlIGhvdyB0aGVzZSB3b3VsZCBpbnRlcmFjdC4gCi0gKiBJIGFzc3VtZSB0aGF0IGZpbHRlcnMgb3BlcmF0ZSBvbiB0aGUgYnl0ZSBzdHJlYW0gYW5kIGFyZW4ndCBjb25jZXJuZWQgd2l0aCBVSSBwcmVzZW50YXRpb24uLi4KLSAqIGJ1dCB1c3VhbGx5IFVJJ3MgYW5kIGZpbHRlcnMgYXJlIHRpZ2h0bHkgY291cGxlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRGaWx0ZXJEZWxlZ2F0ZSB7Ci0JLyoqCi0JICogRmlsdGVyIHRoZSBnaXZlbiBjb250ZW50IGZyb20gdGhlIGdpdmVuIHJlcXVlc3QuIFRoZSBjb250ZW50IHRoYXQgaGFzIGJlZW4gZmlsdGVyZWQgb3V0IHdpbGwgCi0JICogbm90IGJlIHNob3duIHRvIGNsaWVudHMgb2YgdGhlIFRDUC9JUCBtb25pdG9yLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IHRoYXQgdGhlIGZpbHRlciB3aWxsIGJlIHBlcmZvcm1lZCBvbgotCSAqIEBwYXJhbSBpc1JlcXVlc3Qgc2V0IHRvIHRydWUgaWYgdGhlIGNvbnRlbnQgZmlsdGVyIGFwcGxpZXMgdG8gcmVxdWVzdCBtb25pdG9yIHRyYWZmaWMsCi0JICogICAgb3Igc2V0IHRvIGZhbHNlIGlmIHRoZSBjb250ZW50IGZpbHRlciBhcHBsaWVzIHRvIHRoZSByZXNwb25zZSBtb25pdG9yIHRyYWZmaWMKLQkgKiBAcGFyYW0gY29udGVudCB0aGUgbWVzc2FnZSBjb250ZW50IHRvIGJlIGZpbHRlcmVkIG91dAotCSAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIGNvbnRlbnQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHBhcnNpbmcgb3IgZmlsdGVyaW5nIHRoZSBjb250ZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IGJ5dGVbXSBmaWx0ZXIoUmVxdWVzdCByZXF1ZXN0LCBib29sZWFuIGlzUmVxdWVzdCwgYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDdmMTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotLyoqCi0gKiBSZXByZXNlbnRzIGEgbW9uaXRvciBiZXR3ZWVuIGEgY2xpZW50IGFuZCBzZXJ2ZXIuCi0gKiBUaGUgbW9uaXRvciB3YXRjaGVzIGFsbCBuZXR3b3JrIHRyYWZmaWMgYmV0d2VlbiBhIGxvY2FsIGNsaWVudCAodGFsa2luZwotICogb24gYSBnaXZlbiBsb2NhbCBwb3J0KSBhbmQgYSByZW1vdGUgc2VydmVyIChpZGVudGlmaWVkIGJ5IGhvc3QgYW5kIHBvcnQpLgotICogVGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIG1vbml0b3JzIGlzIGF2YWlsYWJsZSB2aWEge0BsaW5rIE1vbml0b3JDb3JlI2dldE1vbml0b3JzKCl9LgotICogSU1vbml0b3IgaXMgdGhyZWFkLXNhZmUuCi0gKiA8cD4KLSAqIElNb25pdG9ycyBhcmUgcmVhZC1vbmx5LiBUbyBtYWtlIGNoYW5nZXMgdG8gYSBtb25pdG9yLCB5b3UgbXVzdCBjcmVhdGUgYW4KLSAqIElNb25pdG9yV29ya2luZ0NvcHkgYnkgY2FsbGluZyBjcmVhdGVXb3JraW5nQ29weSgpLiBDaGFuZ2VzIHRvIHRoZSB3b3JraW5nIGNvcHkKLSAqIGFyZSBhcHBsaWVkIHdoZW4gdGhlIHdvcmtpbmcgY29weSBpcyBzYXZlZC4gTW9uaXRvcnMgYW5kIG1vbml0b3Igd29ya2luZyBjb3BpZXMKLSAqIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotICogICAqIGVxdWFscygpIHJldHVybnMgdHJ1ZSBmb3IgYSBtb25pdG9yIGFuZCBpdCdzIHdvcmtpbmcgY29weQotICogPHA+Ci0gKiBbaXNzdWU6IFdoeSB0aGUgYnVpbHQtaW4gYXNzdW1wdGlvbiB0aGF0IHRoZSBjbGllbnQgaXMgbG9jYWw/IEEgbW9uaXRvcgotICogd291bGQgbWFrZSBqdXN0IGFzIG11Y2ggc2Vuc2Ugc2l0dGluZyBiZXR3ZWVuIGEgY2xpZW50IG9uIGEgcmVtb3RlIG1hY2hpbmUKLSAqIGFuZCBhIHNlcnZlci5dCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogQHNlZSBJTW9uaXRvcldvcmtpbmdDb3B5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vbml0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgbW9uaXRvci4KLQkgKiBFYWNoIG1vbml0b3IgaGFzIGEgZGlzdGluY3QsIGZpeGVkIGlkLiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOwotCSAqIHRoZXkgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9uaXRvciBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbW90ZSBob3N0IG5hbWUgb2YgdGhlIHNlcnZlciBiZWluZyBtb25pdG9yZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgcmVtb3RlIGhvc3QgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSG9zdCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbW90ZSBwb3J0IG51bWJlciBvZiB0aGUgc2VydmVyIGJlaW5nIG1vbml0b3JlZC4KLQkgKiAgCi0JICogQHJldHVybiB0aGUgcmVtb3RlIHBvcnQgbnVtYmVyCi0JICovCi0JcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWwgcG9ydCBudW1iZXIgb2YgdGhlIGNsaWVudCBiZWluZyBtb25pdG9yZWQuIFRoaXMKLQkgKiBpcyB0aGUgcG9ydCB0aGF0IHRoZSBjbGllbnQgaXMgdGFsa2luZyB0byB0aGUgcmVtb3RlIHNlcnZlciBvbi4KLQkgKiAgCi0JICogQHJldHVybiB0aGUgbG9jYWwgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3RvY29sIHRoYXQgdGhpcyBtb25pdG9yIHVzZXMgdG8gcmVhZCBuZXR3b3JrCi0JICogdHJhZmZpYy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm90b2NvbCBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbm5lY3Rpb24gdGltZW91dCAoaW4gbXMpLiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMgbm8gdGltZW91dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aW1lb3V0Ci0JICovCi0JcHVibGljIGludCBnZXRUaW1lb3V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtb25pdG9yIHN0YXJ0cyBieSBkZWZhdWx0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vbml0b3Igc2hvdWxkIGJlIHN0YXJ0ZWQgYnkgZGVmYXVsdCwgb3IKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG1vbml0b3IgaXMgY3VycmVudGx5IHJ1bm5pbmcuIE1vbml0b3Igd29ya2luZwotCSAqIGNvcGllcyB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UgKHNpbmNlIHRoZXkgY2Fubm90IGJlIHJ1bikuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbW9uaXRvciBpcyBjdXJyZW50bHkgcnVubmluZywgb3IKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCk7Ci0JCi0JLyoqCi0JICogRGVsZXRlcyB0aGlzIG1vbml0b3IuIFRoZSBtb25pdG9yIHdpbGwgbm8gbG9uZ2VyIGJlIGF2YWlsYWJsZSB0byBjbGllbnRzLgotCSAqIElmIHRoZSBtb25pdG9yIGlzIGN1cnJlbnRseSBydW5uaW5nLCBpdCB3aWxsIGJlIHN0b3BwZWQgZmlyc3QuCi0JICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiB0aGUgbW9uaXRvciBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgb3IgaWYKLQkgKiBpdCBpcyBjYWxsZWQgb24gYSB3b3JraW5nIGNvcHkuIENsaWVudHMgaGF2ZSBubyBvYmxpZ2F0aW9uIHRvIGRlbGV0ZQotCSAqIHdvcmtpbmcgY29waWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG1vbml0b3IgaXMgYSB3b3JraW5nIGNvcHkuIE1vbml0b3JzIHdoaWNoIHJldHVybgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IHRvIHRoaXMgbWV0aG9kIGNhbiBiZSBzYWZlbHkgY2FzdCB0bwotCSAqIHtAbGluayBJTW9uaXRvcldvcmtpbmdDb3B5fS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbW9uaXRvciBpcyBhIHdvcmtpbmcgY29weSwgYW5kCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgd29ya2luZyBjb3B5IGZvciB0aGlzIG1vbml0b3IuIElmIHRoZSByZWNlaXZlciBpcyBub3QgYQotCSAqIHdvcmtpbmcgY29weSwgYSBuZXcgd29ya2luZyBjb3B5IHdpbGwgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdG8gaGF2ZQotCSAqIHRoZSBzYW1lIGF0dHJpYnV0ZXMgYXMgdGhpcyBtb25pdG9yLiBJZiB0aGUgcmVjZWl2ZXIgaXMgYSB3b3JraW5nIGNvcHksCi0JICogdGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybnMgdGhlIHJlY2VpdmVyLiBBZnRlciBjb25maWd1cmluZyBhdHRyaWJ1dGVzIG9uCi0JICogdGhlIHdvcmtpbmcgY29weSwgY2FsbGluZyB7QGxpbmsgSU1vbml0b3JXb3JraW5nQ29weSNzYXZlKCl9IGFwcGxpZXMKLQkgKiB0aGUgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgbW9uaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgd29ya2luZyBjb3B5IG9mIHRoaXMgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBJTW9uaXRvcldvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCi0JLyoqCi0JICogU3RhcnRzIHRoZSBnaXZlbiBtb25pdG9yIGxpc3RlbmluZyBvbiBpdHMgY2xpZW50IHBvcnQuIFRoaXMgbWV0aG9kIGlzCi0JICogc3luY2hyb25vdXMgYW5kIHRoZSBtb25pdG9yIHdpbGwgYmUgcnVubmluZyBhbmQgcmVhZHkgZm9yIHVzZSBieSB0aGUKLQkgKiB0aW1lIHRoYXQgdGhlIG1ldGhvZCByZXR1cm5zLiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBtb25pdG9yCi0JICogaXMgYWxyZWFkeSBydW5uaW5nLgotCSAqIDxwPgotCSAqIEEgQ29yZUV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIG1vbml0b3IgaXMgbm90IHZhbGlkLCB0aGUgbG9jYWwgcG9ydAotCSAqIGlzIGluIHVzZSwgb3IgaWYgYW5vdGhlciBwcm9ibGVtIG9jY3VycyB3aGVuIHN0YXJ0aW5nIHRoZSBtb25pdG9yLiAKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgY2FsbGVkIG9uIGEgd29ya2luZyBjb3B5IG9yIGFmdGVyIHRoZSBtb25pdG9yCi0JICogaGFzIGJlZW4gZGVsZXRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgbW9uaXRvcidzIHByb3BlcnRpZXMgYXJlIGludmFsaWQsCi0JICogICBpZiBpdCBmYWlscyB0byBzdGFydCBiZWNhdXNlIHRoZSBwb3J0IGlzIGluIHVzZSwgb3IgYW5vdGhlciBwcm9ibGVtIG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTdG9wcyB0aGUgZ2l2ZW4gbW9uaXRvciBhbmQgZnJlZXMgdXAgYWxsIHVuZGVybHlpbmcgb3BlcmF0aW5nIAotCSAqIHN5c3RlbSByZXNvdXJjZXMuIFRoaXMgbWV0aG9kIGlzIHN5bmNocm9ub3VzIGFuZCB0aGUgbW9uaXRvciB3aWxsIGJlCi0JICogcnVubmluZyBhbmQgcmVhZHkgZm9yIHVzZSBieSB0aGUgdGltZSB0aGF0IHRoZSBtZXRob2QgcmV0dXJucy4KLQkgKiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBtb25pdG9yIHdhcyBub3QgYWxyZWFkeSBydW5uaW5nLgotCSAqIDxwPgotCSAqIEFmdGVyIHJldHVybmluZyBmcm9tIHRoaXMgbWV0aG9kLCB0aGUgbW9uaXRvciBtYXkgYmUgcmVzdGFydGVkIGF0Ci0JICogYW55IHRpbWUuIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGNhbGxlZCBvbiBhIHdvcmtpbmcgY29weSBvciBhZnRlcgotCSAqIHRoZSBtb25pdG9yIGhhcyBiZWVuIGRlbGV0ZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKTsKLQotCS8qKgotCSAqIEFkZHMgYSByZXF1ZXN0IGxpc3RlbmVyLgotCSAqIE9uY2UgcmVnaXN0ZXJlZCwgYSBsaXN0ZW5lciBzdGFydHMgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbiBvZiAKLQkgKiBjaGFuZ2VzIHRvIHRoZSBnbG9iYWwgbGlzdCBvZiByZXF1ZXN0cy4gVGhlIGxpc3RlbmVyIGNvbnRpbnVlcyB0byByZWNlaXZlCi0JICogbm90aWZpY2F0aW9ucyB1bnRpbCBpdCBpcyByZW1vdmVkLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkgKiA8cD4KLQkgKiBJZiBhIGxpc3RlbmVyIGlzIGFkZGVkIHRvIGEgd29ya2luZyBjb3B5LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQKLQkgKiB0byB0aGUgb3JpZ2luYWwgbW9uaXRvci4gSWYgdGhlIG1vbml0b3IgZG9lcyBub3QgZXhpc3QgeWV0ICh3aGVuIHRoZSB3b3JraW5nCi0JICogY29weSB3YXMganVzdCBjcmVhdGVkIGZyb20gTW9uaXRvckNvcmUuY3JlYXRlTW9uaXRvcigpKSwgdGhlIGxpc3RlbmVyIHdpbGwKLQkgKiBiZSBhZGRlZCB0byB0aGUgY3JlYXRlZCBtb25pdG9yIHdoZW4gKGlmKSB0aGUgd29ya2luZyBjb3B5IGlzIHNhdmVkLiAKLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHJlcXVlc3QgbGlzdGVuZXIKLQkgKiBAc2VlICNyZW1vdmVSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcmVxdWVzdCBsaXN0ZW5lci4gSGFzIG5vIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMKLQkgKiBub3QgcmVnaXN0ZXJlZC4KLQkgKiA8cD4KLQkgKiBJZiBhIGxpc3RlbmVyIGlzIHJlbW92ZWQgZnJvbSBhIHdvcmtpbmcgY29weSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlCi0JICogcmVtb3ZlZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIG9yaWdpbmFsIG1vbml0b3IuIFJlbW92aW5nIGEgbW9uaXRvciBmcm9tCi0JICogYSBuZXdseSBjcmVhdGVkIG1vbml0b3IgaGFzIG5vIGVmZmVjdCB1bmxlc3MgdGhlIG1vbml0b3IgaGFkIGFscmVhZHkgYmVlbgotCSAqIGFkZGVkLCBpbiB3aGljaCBjYXNlIGl0IGlzIHJlbW92ZWQgZnJvbSBub3RpZmljYXRpb24gYW5kIHdpbGwgbm90IGJlIGFkZGVkCi0JICogdG8gdGhlIGNyZWF0ZWQgbW9uaXRvciB3aGVuIChpZikgdGhlIHdvcmtpbmcgY29weSBpcyBzYXZlZC4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLQkgKiBAc2VlICNhZGRSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoaXMgbW9uaXRvci4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhbiBlcnJvciBpZiB0aGUgbW9uaXRvcgotCSAqIGhhcyBpbnZhbGlkIHBvcnRzIG9yIHJlbW90ZSBob3N0bmFtZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBub3Qgb24gdGhlIHdvcmtpbmcgY29weSBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiBiZSB2YWxpZGF0ZWQKLQkgKiBhdCBhbnkgdGltZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhpcwotCSAqICAgcnVudGltZSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMKLQkgKiAgIHdyb25nIHdpdGggaXQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjOTQ3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9uaXRvckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLS8qKgotICogTGlzdGVuZXIgZm9yIGdsb2JhbCBjaGFuZ2VzIGFmZmVjdGluZyBtb25pdG9ycy4KLSAqIDxwPgotICogQ2xpZW50cyBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGFuZCByZWdpc3RlcgotICogdGhlaXIgbGlzdGVuZXIgdmlhIHtAbGluayBNb25pdG9yQ29yZSNhZGRNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lcil9LgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb25pdG9yTGlzdGVuZXIgewotCQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBnaXZlbiBtb25pdG9yIGhhcyBiZWVuIGNyZWF0ZWQgKGFkZGVkIHRvIHRoZQotCSAqIGdsb2JhbCBsaXN0IG9mIGtub3duIG1vbml0b3JzKS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbmV3bHktY3JlYXRlZCBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgbW9uaXRvckFkZGVkKElNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdpdmVuIG1vbml0b3IgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIG1vbml0b3IgaXMgbmV2ZXIgYSB3b3JraW5nIGNvcHkuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkCi0JICovCi0JcHVibGljIHZvaWQgbW9uaXRvckNoYW5nZWQoSU1vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgZ2l2ZW4gbW9uaXRvciBoYXMgYmVlbiBkZWxldGVkIChyZW1vdmVkCi0JICogZnJvbSB0aGUgZ2xvYmFsIGxpc3Qgb2Yga25vd24gbW9uaXRvcnMpLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRoYXQgaGFzIGJlZW4gZGVsZXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG1vbml0b3JSZW1vdmVkKElNb25pdG9yIG1vbml0b3IpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vbml0b3JXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vbml0b3JXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjc0MDU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFRpYW5jaGFvIExpIChUaWFuY2hhby5MaUBnbWFpbC5jb20pIC0gU3RhcnQgbW9uaXRvcnMgYnkgZGVmYXVsdCAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0vKioKLSAqIFJlcHJlc2VudHMgYSB3b3JraW5nIGNvcHkgb2YgYSBtb25pdG9yLiBBIHdvcmtpbmcgY29weSBpcyBhIGNvcHkgdGhhdCB0aGUKLSAqIGF0dHJpYnV0ZXMgY2FuIGJlIGNoYW5nZWQuCi0gKiBJTW9uaXRvcldvcmtpbmdDb3B5IGlzIHRocmVhZC1zYWZlLiBIb3dldmVyLCB3b3JraW5nIGNvcGllcyBpbnN0YW5jZXMKLSAqIHNob3VsZCBiZSBzaG9ydC1saXZlZCB0byByZWR1Y2UgdGhlIGNoYW5jZSBvZiBtdWx0aXBsZSB3b3JraW5nIGNvcGllcwotICogYmVpbmcgY3JlYXRlZCBieSBkaWZmZXJlbnQgY2xpZW50cyBhbmQgb25lIGNsaWVudCBvdmVyd3JpdHRpbmcgY2hhbmdlcwotICogbWFkZSB0byB0aGUgb3RoZXIgd29ya2luZyBjb3B5LiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiBAc2VlIElNb25pdG9yCi0gKiAKLSAqIFtpc3N1ZSA6IENTIC0gaXQgc291bmRzIGxpa2UgdGhpcyBpcyBzb21ldGhpbmcgdXNlZnVsIGZvciBjcmVhdGluZyBtb25pdG9ycy4gCi0gKiBTaG91bGRuJ3QgdGhpcyBiZSBjYWxsZWQgYSBJTW9uaXRvckNvbmZpZ3VyYXRpb24/ICBJcyB0aGVyZSBhbiBhZHZhbnRhZ2UgdG8gbWFraW5nCi0gKiB0aGlzIGFjdHVhbGx5IHNlZW0gdG8gYmUgYSBJTW9uaXRvcj8gIFBlcmhhcHMgc29tZSBVSSBjb252ZW5pZW5jZT8gIAotICogSXMgYSBJTW9uaXRvcldvcmtpbmdDb3B5IGFjdHVhbGx5ICd1c2VhYmxlJyBmb3IgbW9uaXRvcmluZyAuLiBvciBpcyBpdCByZWFsbHkganVzdCBhIGNvbmZpZ3VyYXRpb24/IF0KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9uaXRvcldvcmtpbmdDb3B5IGV4dGVuZHMgSU1vbml0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIG9yaWdpbmFsIG1vbml0b3IgdGhhdCB0aGlzIHdvcmtpbmcgY29weSBjb3JyZXNwb25kcyB0bywgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHdvcmtpbmcgY29weSB3YXMganVzdCBjcmVhdGVkIGZyb20KLQkgKiBNb25pdG9yQ29yZS5jcmVhdGVNb25pdG9yKCkuCi0JICogCi0JICogQHJldHVybiB0aGUgb3JpZ2luYWwgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB3b3JraW5nIGNvcHkKLQkgKiAgICB3YXMganVzdCBjcmVhdGVkCi0JICovCi0JcHVibGljIElNb25pdG9yIGdldE9yaWdpbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsb2NhbCBwb3J0IG51bWJlciBvZiB0aGUgY2xpZW50IHRvIGJlIG1vbml0b3JlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcG9ydCB0aGUgbG9jYWwgKGNsaWVudCkgcG9ydCBudW1iZXIKLQkgKiBAc2VlIElNb25pdG9yI2dldExvY2FsUG9ydCgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWxQb3J0KGludCBwb3J0KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHJlbW90ZSBob3N0IG5hbWUgb2YgdGhlIHNlcnZlciB0byBiZSBtb25pdG9yZWQuCi0JICogCi0JICogQHBhcmFtIGhvc3QgdGhlIG5ldyByZW1vdGUgaG9zdCBuYW1lCi0JICogQHNlZSBJTW9uaXRvciNnZXRSZW1vdGVIb3N0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdGVIb3N0KFN0cmluZyBob3N0KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHJlbW90ZSBwb3J0IG51bWJlciBvZiB0aGUgc2VydmVyIHRvIGJlIG1vbml0b3JlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcG9ydCB0aGUgbmV3IHJlbW90ZSBwb3J0IG51bWJlcgotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UmVtb3RlUG9ydCgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3RlUG9ydChpbnQgcG9ydCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcm90b2NvbCB0byBiZSB1c2VkIHRvIHJlYWQgbmV0d29yawotCSAqIHRyYWZmaWMgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCB0aGUgY2xpZW50LgotCSAqIAotCSAqIEBwYXJhbSBwcm90b2NvbElkIHRoZSBwcm90b2NvbCBpZAotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UHJvdG9jb2woKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3RvY29sKFN0cmluZyBwcm90b2NvbElkKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbm5lY3Rpb24gdGltZW91dCAoaW4gbXMpLiBVc2UgMCB0byBjbGVhciB0aGUgdGltZW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gdGltZW91dCB0aGUgY29ubmVjdGlvbiB0aW1lb3V0Ci0JICogQHNlZSBJTW9uaXRvciNnZXRUaW1lb3V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KTsKLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGlzIG1vbml0b3Igc3RhcnRzIGJ5IGRlZmF1bHQuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0QnlEZWZhdWx0IHJ1biB0aGUgbW9uaXRvciBvbiBwbHVnLWluIHN0YXJ0dXAKLQkgKiBAc2VlIElNb25pdG9yI2lzQXV0b1N0YXJ0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvU3RhcnQoYm9vbGVhbiBzdGFydEJ5RGVmYXVsdCk7Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY2hhbmdlcyBtYWRlIHRvIHRoaXMgd29ya2luZyBjb3B5LgotCSAqIEZvciBhIGJyYW5kIG5ldyB3b3JraW5nIGNvcHkgKGNyZWF0ZWQgYnkKLQkgKiB7QGxpbmsgTW9uaXRvckNvcmUjY3JlYXRlTW9uaXRvcigpfSwgYW5kIG5vdCB5ZXQgc2F2ZWQpLCB0aGlzIG1ldGhvZAotCSAqIGNyZWF0ZXMgYSBuZXcgbW9uaXRvciBpbnN0YW5jZSB3aXRoIGF0dHJpYnV0ZXMgbWF0Y2hpbmcgdGhpcyB3b3JraW5nIGNvcHkuCi0JICogRm9yIGEgd29ya2luZyBjb3B5IGNsb25lZCBmcm9tIGFuIGV4aXN0aW5nIG1vbml0b3IgaW5zdGFuY2UgKGJ5Ci0JICoge0BsaW5rIElNb25pdG9yI2NyZWF0ZVdvcmtpbmdDb3B5KCl9KSwgdGhpcyBtZXRob2Qgc3RvcHMgdGhlIGV4aXN0aW5nCi0JICogbW9uaXRvciAodXNpbmcge0BsaW5rIElNb25pdG9yI3N0b3AoKX0pIGlmIG5lY2Vzc2FyeSwKLQkgKiBhbmQgdGhlbiBzZXRzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBtb25pdG9yIGluc3RhbmNlIHRvIG1hdGNoIHRoaXMKLQkgKiB3b3JraW5nIGNvcHkgKHRoZSBtb25pdG9yIGluc3RhbmNlIGlzIHJldHVybmVkKS4KLQkgKiA8cD4KLQkgKiBTYXZpbmcgYSB3b3JraW5nIGNvcHkgZm9yIGEgbW9uaXRvciB0aGF0IHdhcyBhbHJlYWR5IGRlbGV0ZWQgd2lsbCBjYXVzZQotCSAqIHRoZSBtb25pdG9yIHRvIGdldCByZWNyZWF0ZWQgKHdpdGggYW55IGNoYW5nZXMgaW4gdGhlIHdvcmtpbmcgY29weSkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHRocm93cyBhIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHNhdmluZyB0aGUKLQkgKiBtb25pdG9yLiBObyB2YWxpZGF0aW9uIGNoZWNrcyBvY2N1ciB3aGVuIHNhdmluZyB0aGUgbW9uaXRvci4gVGhpcyBjYW4gYmUKLQkgKiBkb25lIGJ5IGNhbGxpbmcgSU1vbml0b3IudmFsaWRhdGUoKSBwcmlvciB0byBzYXZpbmcuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiB0aGUgYWZmZWN0ZWQgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB0aHJvd24gaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSBzYXZpbmcgdGhlIG1vbml0b3IgCi0JICovCi0JcHVibGljIElNb25pdG9yIHNhdmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JUmVxdWVzdExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JUmVxdWVzdExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMGM1YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVJlcXVlc3RMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLS8qKgotICogTGlzdGVuZXIgZm9yIG5ldyBvciBtb2RpZmllZCByZXF1ZXN0cyBjcmVhdGVkIGZyb20gYSBzaW5nbGUgbW9uaXRvci4KLSAqIEVhY2ggcmVxdWVzdCByZXByZXNlbnRzIG1lc3NhZ2UgdHJhZmZpYyBiZXR3ZWVuIGEgbW9uaXRvcmVkIGNsaWVudAotICogYW5kIHNlcnZlci4KLSAqIDxwPgotICogUmVxdWVzdHMgYXJlIG5vdCBwZXJzaXN0ZWQgLSB0aGV5IG9ubHkgZXhpc3QgaW4gdGhpcyBBUEkgdW50aWwgdGhlCi0gKiBjb25uZWN0aW9uIGlzIGRvbmUuIEFuIGluaXRpYWwgcmVxdWVzdEFkZGVkKCkgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUKLSAqCXJlcXVlc3QgaXMgY3JlYXRlZCAoYnkgdGhlIGNsaWVudCBjcmVhdGluZyBhIGNvbm5lY3Rpb24pLCBhbmQgdGhlbgotICogcmVxdWVzdENoYW5nZWQoKSBldmVudHMgb2NjdXIgYXMgZGF0YSBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgcmVxdWVzdAotICogb3IgY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgcmVxdWVzdCdzIHByb3BlcnRpZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgSU1vbml0b3IjYWRkUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlcXVlc3RMaXN0ZW5lciB7Ci0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdpdmVuIHJlcXVlc3Qgd2FzIGNyZWF0ZWQuCi0JICogPHA+Ci0JICogUmVxdWVzdHMgbWF5IGJlIGNyZWF0ZWQgd2l0aCBsaXR0bGUgdG8gbm8gZGF0YSBpbiB0aGVtLgotCSAqIEFzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCB0aGUKLQkgKiA8Y29kZT5yZXF1ZXN0Q2hhbmdlZDwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgZnJvbSB3aGljaCB0aGUgcmVxdWVzdCB3YXMgaW5pdGlhdGVkCi0JICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdGhhdCBoYXMgYmVlbiBhZGRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlcXVlc3RBZGRlZChJTW9uaXRvciBtb25pdG9yLCBSZXF1ZXN0IHJlcXVlc3QpOwotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdpdmVuIHJlcXVlc3QgaGFzIGJlZW4gY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZQotCSAqIHJlcXVlc3QuCi0JICogPHA+Ci0JICogSW5kaXZpZHVhbCB2YWx1ZXMgd2l0aGluIHRoZSByZXF1ZXN0IGFyZSByYXJlbHkgbW9kaWZpZWQuCi0JICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCB3aGVuIHRoZXkgYXJlIGluaXRpYWxseSBzZXQgb3IKLQkgKiB3aGVuIG1vcmUgZGF0YSBpcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQgb3Igc2VydmVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciBmcm9tIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyBpbml0aWF0ZWQKLQkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdCB0aGF0IGhhcyBiZWVuIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2hhbmdlZChJTW9uaXRvciBtb25pdG9yLCBSZXF1ZXN0IHJlcXVlc3QpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTW9uaXRvckNvcmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL01vbml0b3JDb3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTQ4ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTW9uaXRvckNvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1vbml0b3JNYW5hZ2VyOwotLyoqCi0gKiBNYWluIGNsYXNzIGZvciBjcmVhdGluZyBuZXcgbW9uaXRvcnMgYW5kIGxvY2F0aW5nIGV4aXN0aW5nIG9uZXMuIFRoZSBtZXRob2RzIG9uCi0gKiB0aGlzIGNsYXNzIGFyZSB0aHJlYWQgc2FmZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLiBJdCBpcyBub3QgaW50ZW5kZWQKLSAqIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTW9uaXRvckNvcmUgewotCXByaXZhdGUgc3RhdGljIE1vbml0b3JNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBDYW5ub3QgY3JlYXRlIE1vbml0b3JDb3JlIC0gdXNlIHN0YXRpYyBtZXRob2RzLgotCSAqLwotCXByaXZhdGUgTW9uaXRvckNvcmUoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtb25pdG9yIG1hbmFnZXIgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9uaXRvciBtYW5hZ2VyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTW9uaXRvck1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCW1hbmFnZXIgPSBNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwga25vd24gbW9uaXRvciBpbnN0YW5jZXMuIFRoZSBsaXN0IHdpbGwgbm90IGNvbnRhaW4gYW55Ci0JICogd29ya2luZyBjb3BpZXMgYW5kIGlzIHBlcnNpc3RlZCBiZXR3ZWVuIHdvcmtiZW5jaCBzZXNzaW9ucy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGw7IGNsaWVudHMgbWF5IHNhZmVseSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIG1vbml0b3IgaW5zdGFuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9uaXRvcltdIGdldE1vbml0b3JzKCkgewotCQlMaXN0PElNb25pdG9yPiBsaXN0ID0gZ2V0TWFuYWdlcigpLmdldE1vbml0b3JzKCk7Ci0JCUlNb25pdG9yW10gbSA9IG5ldyBJTW9uaXRvcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShtKTsKLQkJcmV0dXJuIG07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtb25pdG9yIHdvcmtpbmcgY29weS4gQWZ0ZXIgY29uZmlndXJpbmcgcGFyYW1ldGVycyBvbgotCSAqIHRoZSB3b3JraW5nIGNvcHksIGNhbGxpbmcge0BsaW5rIElNb25pdG9yV29ya2luZ0NvcHkjc2F2ZSgpfSBicmluZ3MKLQkgKiB0aGUgbW9uaXRvciBpbnRvIGV4aXN0ZW5jZS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB7QGxpbmsgSU1vbml0b3IjZGVsZXRlKCl9Ci0JICogdG8gZGVsZXRlIHRoZSBtb25pdG9yIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogV2hlbiBtb25pdG9ycyBhcmUgY3JlYXRlZCwgdGhlIGxvY2FsIGFuZCByZW1vdGUgcG9ydCB2YWx1ZXMgZGVmYXVsdCB0bwotCSAqIDxjb2RlPjgwPC9jb2RlPiwgYnV0IHRoZXkgZG8gbm90IGhhdmUgYSBwcm90b2NvbCBvciByZW1vdGUgaG9zdCAodmFsdWVzCi0JICogYXJlIDxjb2RlPm51bGw8L2NvZGU+KS4KLQkgKiA8L3A+IAotCSAqIAotCSAqIEByZXR1cm4gYSBtb25pdG9yIHdvcmtpbmcgY29weQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vbml0b3JXb3JraW5nQ29weSBjcmVhdGVNb25pdG9yKCkgewotCQlyZXR1cm4gZ2V0TWFuYWdlcigpLmNyZWF0ZU1vbml0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbW9uaXRvciBsaXN0ZW5lci4KLQkgKiBPbmNlIHJlZ2lzdGVyZWQsIGEgbGlzdGVuZXIgc3RhcnRzIHJlY2VpdmluZyBub3RpZmljYXRpb24gb2YgCi0JICogY2hhbmdlcyB0byB0aGUgbW9uaXRvcnMuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZQotCSAqIG5vdGlmaWNhdGlvbnMgdW50aWwgaXQgaXMgcmVtb3ZlZC4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIG1vbml0b3IgbGlzdGVuZXIKLQkgKiBAc2VlICNyZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTW9uaXRvckxpc3RlbmVyKElNb25pdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCWdldE1hbmFnZXIoKS5hZGRNb25pdG9yTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIG1vbml0b3IgbGlzdGVuZXIuIEhhcyBubwotCSAqIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotCSAqIEBzZWUgI2FkZE1vbml0b3JMaXN0ZW5lcihJTW9uaXRvckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJZ2V0TWFuYWdlcigpLnJlbW92ZU1vbml0b3JMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUmVxdWVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmViZDJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1JlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIFJlcHJlc2VudHMgYSBUQ1AvSVAgcmVxdWVzdCBtYWRlIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLSAqIEVhY2ggcmVxdWVzdCByZXByZXNlbnRzIGEgcmVxdWVzdC1yZXNwb25zZSBwYWlyLCB3aGVyZSB0aGUgcmVxdWVzdAotICogaXMgZnJvbSBjbGllbnQgLT4gc2VydmVyLCBhbmQgdGhlIHJlc3BvbnNlIGlzIGZyb20gc2VydmVyIC0+IGNsaWVudC4KLSAqIDxwPgotICogUmVxdWVzdHMgYXJlIGNyZWF0ZWQgYnkgYSBydW5uaW5nIG1vbml0b3IuIFRoZXkgZG8gbm90IGhhdmUgYSByZWZlcmVuY2UKLSAqIGJhY2sgdG8gdGhlIG1vbml0b3IgYmVjYXVzZSB0aGUgbW9uaXRvciBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgbW9kaWZpZWQKLSAqIHNpbmNlIHRoZSByZXF1ZXN0IHdhcyBjcmVhdGVkLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+cHJvdG9jb2xBZGFwdGVyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LiAKLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3QgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQlwcm90ZWN0ZWQgTW9uaXRvciBtb25pdG9yOwotCXByb3RlY3RlZCBEYXRlIGRhdGU7Ci0JcHJvdGVjdGVkIGxvbmcgcmVzcG9uc2VUaW1lID0gLTE7Ci0JcHJvdGVjdGVkIGludCBsb2NhbFBvcnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyByZW1vdGVIb3N0OwotCXByb3RlY3RlZCBpbnQgcmVtb3RlUG9ydDsKLQlwcm90ZWN0ZWQgYnl0ZVtdIHJlcXVlc3Q7Ci0JcHJvdGVjdGVkIGJ5dGVbXSByZXNwb25zZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbElkOwotCi0JcHJvdGVjdGVkIFByb3BlcnRpZXMgcHJvcGVydGllczsKLQkKLQkvKioKLQkgKiBSZXF1ZXN0MiBjb250ZW50IHR5cGUgKHZhbHVlIDEpIGZvciB0aGUgdHJhbnNwb3J0IChoZWFkZXIpIG9mIGEgcmVxdWVzdAotCSAqIG9yIHJlc3BvbnNlLgotCSAqIAotCSAqIEBzZWUgI2dldFJlcXVlc3QoaW50KQotCSAqIEBzZWUgI2dldFJlc3BvbnNlKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU1BPUlQgPSAxOwotCi0JLyoqCi0JICogUmVxdWVzdDIgY29udGVudCB0eXBlICh2YWx1ZSAyKSBmb3IgdGhlIGNvbnRlbnQgKGJvZHkpIG9mIGEgcmVxdWVzdAotCSAqIG9yIHJlc3BvbnNlLgotCSAqIAotCSAqIEBzZWUgI2dldFJlcXVlc3QoaW50KQotCSAqIEBzZWUgI2dldFJlc3BvbnNlKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UID0gMjsKLQotCS8qKgotCSAqIFJlcXVlc3QyIGNvbnRlbnQgdHlwZSAodmFsdWUgMykgZm9yIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIHJlcXVlc3QKLQkgKiBvciByZXNwb25zZS4KLQkgKiAKLQkgKiBAc2VlICNnZXRSZXF1ZXN0KGludCkKLQkgKiBAc2VlICNnZXRSZXNwb25zZShpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMID0gMzsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBSZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvcgotCSAqIEBwYXJhbSBwcm90b2NvbElkIHRoZSBwcm90b2NvbCBpZAotCSAqIEBwYXJhbSBsb2NhbFBvcnQgYSBsb2NhbCBwb3J0IG51bWJlcgotCSAqIEBwYXJhbSByZW1vdGVIb3N0IGEgcmVtb3RlIGhvc3RuYW1lCi0JICogQHBhcmFtIHJlbW90ZVBvcnQgYSByZW1vdGUgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgUmVxdWVzdChNb25pdG9yIG1vbml0b3IsIFN0cmluZyBwcm90b2NvbElkLCBpbnQgbG9jYWxQb3J0LCBTdHJpbmcgcmVtb3RlSG9zdCwgaW50IHJlbW90ZVBvcnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJdGhpcy5wcm90b2NvbElkID0gcHJvdG9jb2xJZDsKLQkJdGhpcy5sb2NhbFBvcnQgPSBsb2NhbFBvcnQ7Ci0JCXRoaXMucmVtb3RlSG9zdCA9IHJlbW90ZUhvc3Q7Ci0JCXRoaXMucmVtb3RlUG9ydCA9IHJlbW90ZVBvcnQ7Ci0JCWRhdGUgPSBuZXcgRGF0ZSgpOwotCQlwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCW1vbml0b3IuYWRkUmVxdWVzdCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm90b2NvbCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyByZXF1ZXN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3RvY29sIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKLQkJcmV0dXJuIHByb3RvY29sSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGltZSB0aGlzIHJlcXVlc3Qgd2FzIG1hZGUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB0aW1lc3RhbXAKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXREYXRlKCkgewotCQlyZXR1cm4gZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbCAoY2xpZW50KSBwb3J0LgotCSAqCi0JICogQHJldHVybiB0aGUgbG9jYWwgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKLQkJcmV0dXJuIGxvY2FsUG9ydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZW1vdGUgKHNlcnZlcikgaG9zdC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHJlbW90ZSBob3N0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgewotCQlyZXR1cm4gcmVtb3RlSG9zdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZW1vdGUgKHNlcnZlcikgcG9ydC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHJlbW90ZSBwb3J0IG51bWJlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpIHsKLQkJcmV0dXJuIHJlbW90ZVBvcnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgY29udGVudCBvZiB0aGUgcmVxdWVzdCBwb3J0aW9uIG9mIHRoaXMgcmVxdWVzdC4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IEkgZG9uJ3Qga25vdyBob3cgdG8gZXhwbGFpbiB0aGlzLiBGb3IgYmFzaWMgVENQL0lQIHJlcXVlc3RzLAotCSAqIGRpc3RpbmN0aW9uIGJldHdlZW4gdHJhbnNwb3J0IGFuZCBjb250ZW50IGlzIGlnbm9yZWQuCi0JICogRm9yIEhUVFAgcmVxdWVzdHMsIHRoaXMgVFJBTlNQT1JUIHJldHVybnMganVzdCB0aGUgSFRUUCBoZWFkZXIgYW5kIAotCSAqIENPTlRFTlQgcmV0dXJucyBqdXN0IHRoZSBIVFRQIGJvZHkgd2l0aG91dCB0aGUgaGVhZGVycy4gV2hhdCB3b3VsZAotCSAqIGl0IG1lYW4gZm9yIG90aGVyIHByb3RvY29scz8KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgY29udGVudCB0eXBlOiBvbmUgb2Yge0BsaW5rICNUUkFOU1BPUlR9LAotCSAqICAgIHtAbGluayAjQ09OVEVOVH0sIG9yIHtAbGluayAjQUxMfQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgYnl0ZXMKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldFJlcXVlc3QoaW50IHR5cGUpIHsKLQkJcmV0dXJuIHJlcXVlc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgY29udGVudCBvZiB0aGUgcmVzcG9uc2UgcG9ydGlvbiBvZiB0aGlzIHJlcXVlc3QuCi0JICogPHA+Ci0JICogW2lzc3VlOiBJIGRvbid0IGtub3cgaG93IHRvIGV4cGxhaW4gdGhpcy4gRm9yIGJhc2ljIFRDUC9JUCByZXF1ZXN0cywKLQkgKiBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRyYW5zcG9ydCBhbmQgY29udGVudCBpcyBpZ25vcmVkLgotCSAqIEZvciBIVFRQIHJlcXVlc3RzLCB0aGlzIFRSQU5TUE9SVCByZXR1cm5zIGp1c3QgdGhlIEhUVFAgaGVhZGVyIGFuZCAKLQkgKiBDT05URU5UIHJldHVybnMganVzdCB0aGUgSFRUUCBib2R5IHdpdGhvdXQgdGhlIGhlYWRlcnMuIFdoYXQgd291bGQKLQkgKiBpdCBtZWFuIGZvciBvdGhlciBwcm90b2NvbHM/XQotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSBjb250ZW50IHR5cGU6IG9uZSBvZiB7QGxpbmsgI1RSQU5TUE9SVH0sCi0JICogICAge0BsaW5rICNDT05URU5UfSwgb3Ige0BsaW5rICNBTEx9Ci0JICogQHJldHVybiB0aGUgY29udGVudCBieXRlcwotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0UmVzcG9uc2UoaW50IHR5cGUpIHsKLQkJcmV0dXJuIHJlc3BvbnNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlcidzIHJlc3BvbnNlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBJZiB0aGUgcmVxdWVzdAotCSAqIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgeWV0LCAtMSBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHNlcnZlcidzIHJlc3BvbnNlIHRpbWUsIG9yIC0xIGlmIHRoZXJlIGhhcyBiZWVuIG5vCi0JICogICAgcmVzcG9uc2UgeWV0Ci0JICovCi0JcHVibGljIGxvbmcgZ2V0UmVzcG9uc2VUaW1lKCkgewotCQlyZXR1cm4gcmVzcG9uc2VUaW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuYW1lIGZvciB0aGlzIHJlcXVlc3QuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGdldFJlbW90ZUhvc3QoKSArICI6IiArIGdldFJlbW90ZVBvcnQoKTsKLQkJCi0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgcmVxdWVzdC4KLQkgKgotCSAqIEBwYXJhbSBuIHRoZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbikgewotCQluYW1lID0gbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBnaXZlbiBrZXktdmFsdWUgcHJvcGVydHkgb24gdGhpcyByZXF1ZXN0LiBUbyByZW1vdmUgYSBwcm9wZXJ0eSwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIG51bGwuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IGNhbGxlZCBieSBwcm90b2NvbCBhZGFwdGVycyB0byBhdHRhY2ggcHJvdG9jb2wtCi0JICogc3BlY2lmaWMgZmllbGRzIHRvIHRoZSByZXF1ZXN0LCBidXQgaXQgbWF5IGJlIGNhbGxlZCBieSBhbnkgY2xpZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocHJvcGVydGllcy5jb250YWluc0tleShrZXkpKQotCQkJCXByb3BlcnRpZXMucmVtb3ZlKGtleSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQlwcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBhZGQgcHJvcGVydHkiLCBlKTsKLQkJfQotCQltb25pdG9yLnJlcXVlc3RDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGlzIHJlcXVlc3QuCi0JICogSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGtleSB0aGUgcHJvcGVydHkga2V5IAotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIHRvIHRoZSByZXF1ZXN0LgotCSAqCi0JICogQHBhcmFtIGFkZFJlcXVlc3QgYnl0ZVtdCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9SZXF1ZXN0KGJ5dGVbXSBhZGRSZXF1ZXN0KSB7Ci0JCWlmIChhZGRSZXF1ZXN0ID09IG51bGwgfHwgYWRkUmVxdWVzdC5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkKLQkJaWYgKHJlcXVlc3QgPT0gbnVsbCB8fCByZXF1ZXN0Lmxlbmd0aCA9PSAwKSB7Ci0JCQlzZXRSZXF1ZXN0KGFkZFJlcXVlc3QpOwotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCWludCBzaXplID0gcmVxdWVzdC5sZW5ndGggKyBhZGRSZXF1ZXN0Lmxlbmd0aDsKLQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtzaXplXTsKLQkJU3lzdGVtLmFycmF5Y29weShyZXF1ZXN0LCAwLCBiLCAwLCByZXF1ZXN0Lmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYWRkUmVxdWVzdCwgMCwgYiwgcmVxdWVzdC5sZW5ndGgsIGFkZFJlcXVlc3QubGVuZ3RoKTsKLQkJcmVxdWVzdCA9IGI7Ci0JCWZpcmVDaGFuZ2VkRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdG8gdGhlIHJlc3BvbnNlLgotCSAqCi0JICogQHBhcmFtIGFkZFJlc3BvbnNlIGJ5dGVbXQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvUmVzcG9uc2UoYnl0ZVtdIGFkZFJlc3BvbnNlKSB7Ci0JCWlmIChhZGRSZXNwb25zZSA9PSBudWxsIHx8IGFkZFJlc3BvbnNlLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHJlc3BvbnNlID09IG51bGwgfHwgcmVzcG9uc2UubGVuZ3RoID09IDApIHsKLQkJCXNldFJlc3BvbnNlKGFkZFJlc3BvbnNlKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaW50IHNpemUgPSByZXNwb25zZS5sZW5ndGggKyBhZGRSZXNwb25zZS5sZW5ndGg7Ci0JCWJ5dGVbXSBiID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocmVzcG9uc2UsIDAsIGIsIDAsIHJlc3BvbnNlLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYWRkUmVzcG9uc2UsIDAsIGIsIHJlc3BvbnNlLmxlbmd0aCwgYWRkUmVzcG9uc2UubGVuZ3RoKTsKLQkJcmVzcG9uc2UgPSBiOwotCQlmaXJlQ2hhbmdlZEV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSByZXF1ZXN0LgotCSAqCi0JICogQHBhcmFtIHJlcXVlc3QgYnl0ZVtdCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVxdWVzdChieXRlW10gcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCA9PSBudWxsIHx8IHJlcXVlc3QubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCQotCQl0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotCQltb25pdG9yLnJlcXVlc3RDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcmVzcG9uc2UuCi0JICoKLQkgKiBAcGFyYW0gcmVzcG9uc2UgYnl0ZVtdCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVzcG9uc2UoYnl0ZVtdIHJlc3BvbnNlKSB7Ci0JCWlmIChyZXNwb25zZSA9PSBudWxsIHx8IHJlc3BvbnNlLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQotCQl0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7Ci0JCXJlc3BvbnNlVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZGF0ZS5nZXRUaW1lKCk7Ci0JCW1vbml0b3IucmVxdWVzdENoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9uaXRvciB0aGF0IGNyZWF0ZWQgdGhpcyByZXF1ZXN0LgotCSAqIENoYW5nZSBldmVudHMgd2lsbCBiZSBmaXJlZCBmcm9tIHRoaXMgbW9uaXRvci4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhlIG1vbml0b3IgbWF5IGhhdmUgYmVlbiBlZGl0dGVkIHNpbmNlIHRoaXMKLQkgKiByZXF1ZXN0IHdhcyBjcmVhdGVkLCBzbyB5b3UgY2Fubm90IHJlbHkgb24gdGhlIG1vbml0b3IncwotCSAqIGhvc3RuYW1lIG9yIHBvcnQgdmFsdWVzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb25pdG9yIHRoYXQgY3JlYXRlZCB0aGlzIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgSU1vbml0b3IgZ2V0TW9uaXRvcigpIHsKLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIGNoYW5nZSBldmVudCB0byBub3RpZnkgbW9uaXRvciBsaXN0ZW5lcnMgdGhhdCB0aGUgcmVxdWVzdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQ2hhbmdlZEV2ZW50KCkgewotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5yZXF1ZXN0Q2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNWVkNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5UaGlzIHBhY2thZ2UgZ2l2ZXMgY29yZSAobm9uLVVJKSBhY2Nlc3MgdG8gdGhlIFRDUC9JUCBtb25pdG9yLiBDbGllbnRzIGNhbgotcXVlcnkgZm9yIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG1vbml0b3JzLCBzdGFydC9zdG9wIG1vbml0b3JzLCBhbmQKLWxpc3RlbiBmb3IgcmVxdWVzdHMgYmVpbmcgcmVjZWl2ZWQgYnkgYSBydW5uaW5nIG1vbml0b3IuPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VGhlIE1vbml0b3JDb3JlIGNsYXNzIGdpdmVzIGluaXRpYWwgYWNjZXNzIHRvIGFsbCBvZiB0aGUgQVBJLiBGcm9tIGhlcmUgeW91Ci1jYW4gcXVlcnkgdGhlIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG9uZXMsIGFuZCBhZGQvcmVtb3ZlIGEgbGlzdGVuZXIgZm9yCi1tb25pdG9yIGNoYW5nZXMuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VGhlIElNb25pdG9yIGludGVyZmFjZSBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgbW9uaXRvciwKLWFsbG93aW5nIHlvdSB0byBjaGFuZ2UgaXQgdmlhIGEgd29ya2luZyBjb3B5LCBzdGFydC9zdG9wIGl0LCBvciBhZGQgYSBsaXN0ZW5lcgotZm9yIHJlcXVlc3QgYWN0aXZpdHkuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0ZTA0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLTxoZWFkPgotCTwhLS0gIEVzY2FwZSB0byB0aGUgcm9vdCBvZiB5b3VyIHNvdXJjZSBmb2xkZXIgIC0tPgotCTxtZXRhCi0JCW5hbWU9InJvb3QiCi0JCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLQk8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi0KLTxhYnN0cmFjdD5UaGlzIHBhY2thZ2UgZ2l2ZXMgY29yZSAobm9uLVVJKSBhY2Nlc3MgdG8gdGhlIFRDUC9JUCBtb25pdG9yLiBDbGllbnRzIGNhbgotcXVlcnkgZm9yIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG1vbml0b3JzLCBzdGFydC9zdG9wIG1vbml0b3JzLCBhbmQKLWxpc3RlbiBmb3IgcmVxdWVzdHMgYmVpbmcgcmVjZWl2ZWQgYnkgYSBydW5uaW5nIG1vbml0b3IuPC9hYnN0cmFjdD4KLQotPHA+VGhlIE1vbml0b3JDb3JlIGNsYXNzIGdpdmVzIGluaXRpYWwgYWNjZXNzIHRvIGFsbCBvZiB0aGUgQVBJLiBGcm9tIGhlcmUgeW91Ci1jYW4gcXVlcnkgdGhlIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG9uZXMsIGFuZCBhZGQvcmVtb3ZlIGEgbGlzdGVuZXIgZm9yCi1tb25pdG9yIGNoYW5nZXMuPC9wPgotCi08cD5UaGUgSU1vbml0b3IgaW50ZXJmYWNlIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBtb25pdG9yLAotYWxsb3dpbmcgeW91IHRvIGNoYW5nZSBpdCB2aWEgYSB3b3JraW5nIGNvcHksIHN0YXJ0L3N0b3AgaXQsIG9yIGFkZCBhIGxpc3RlbmVyCi1mb3IgcmVxdWVzdCBhY3Rpdml0eS48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlNTI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1Nb25pdG9yCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotZXh0ZW5zaW9uUG9pbnRQcm90b2NvbEFkYXB0ZXJzPVByb3RvY29sIEFkYXB0ZXJzCi1leHRlbnNpb25Qb2ludENvbnRlbnRGaWx0ZXJzPUNvbnRlbnQgRmlsdGVycwotZXh0ZW5zaW9uUG9pbnRTdGFydHVwPVN0YXJ0dXAKLQotSFRUUD1IVFRQCi1UQ1BJUD1UQ1AvSVAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTgyNWZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbi1wb2ludCBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRQcm90b2NvbEFkYXB0ZXJzIiBpZD0iaW50ZXJuYWxQcm90b2NvbEFkYXB0ZXJzIiBzY2hlbWE9InNjaGVtYS9wcm90b2NvbEFkYXB0ZXJzLmV4c2QiLz4KLTxleHRlbnNpb24tcG9pbnQgbmFtZT0iJWV4dGVuc2lvblBvaW50Q29udGVudEZpbHRlcnMiIGlkPSJpbnRlcm5hbENvbnRlbnRGaWx0ZXJzIiBzY2hlbWE9InNjaGVtYS9pbnRlcm5hbENvbnRlbnRGaWx0ZXJzLmV4c2QiLz4KLTxleHRlbnNpb24tcG9pbnQgbmFtZT0iJWV4dGVuc2lvblBvaW50U3RhcnR1cCIgaWQ9ImludGVybmFsU3RhcnR1cCIgc2NoZW1hPSJzY2hlbWEvc3RhcnR1cC5leHNkIi8+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWxQcm90b2NvbEFkYXB0ZXJzIj4KLSAgPHByb3RvY29sQWRhcHRlcgotICAgIGlkPSJUQ1AvSVAiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVENQSVBQcm90b2NvbEFkYXB0ZXIiCi0gICAgbmFtZT0iJVRDUElQIi8+Ci0gIDxwcm90b2NvbEFkYXB0ZXIKLSAgICBpZD0iSFRUUCIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLkhUVFBQcm90b2NvbEFkYXB0ZXIiCi0gICAgbmFtZT0iJUhUVFAiLz4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL2ludGVybmFsQ29udGVudEZpbHRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvaW50ZXJuYWxDb250ZW50RmlsdGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTJkZDM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvaW50ZXJuYWxDb250ZW50RmlsdGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiIGlkPSJjb250ZW50RmlsdGVycyIgbmFtZT0iQ29udGVudCBGaWx0ZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gZmlsdGVyIGNvbnRlbnQgcmVjZWl2ZWQgaW4gYSBtb25pdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmaWx0ZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudEZpbHRlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4KLUNvbnRlbnQgZmlsdGVyIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudEZpbHRlckRlbGVnYXRlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGZpbHRlcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9yZGVyIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIGludGVnZXIgdXNlZCB0byBvcmRlciBmaWx0ZXJzIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuIExvd2VyIG9yZGVycyBhcmUgcHJvY2Vzc2VkIGZpcnN0Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjb250ZW50IGZpbHRlciBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmNvbnRlbnRGaWx0ZXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7ZmlsdGVyCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlSWRlbnRpZmllciZxdW90OwotICAgICAgICAgICAgbmFtZT0mcXVvdDslZXhhbXBsZU5hbWUmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVDb250ZW50RmlsdGVyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIGFic3RyYWN0IGNsYXNzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudEZpbHRlckRlbGVnYXRlJmx0Oy9jb2RlJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL3Byb3RvY29sQWRhcHRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvcHJvdG9jb2xBZGFwdGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2I4M2I1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvcHJvdG9jb2xBZGFwdGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZSIgaWQ9ImludGVybmFsUHJvdG9jb2xBZGFwdGVycyIgbmFtZT0iUHJvdG9jb2wgQWRhcHRlcnMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIGFuIGFkYXB0ZXIgZm9yIGEgbmV3IHByb3RvY29sIChlLmcuIEhUVFApLiBUaGlzIGFsbG93cyBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvdG9jb2xzIHRvIGJlIG1vbml0b3JlZCBpbiBhIHNwZWNpZmljIHdheS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3RvY29sQWRhcHRlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icHJvdG9jb2xBZGFwdGVyIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Qcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsNCi1Qcm90b2NvbCBhZGFwdGVyIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHByb3RvY29sIGFkYXB0ZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHByb3RvY29sIGFkYXB0ZXIgZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBhIHByb3RvY29sIGFkYXB0ZXIgZm9yIFRDUC9JUDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5wcm90b2NvbEFkYXB0ZXJzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtwcm90b2NvbEFkYXB0ZXINCi0gICAgICAgICAgICBpZD0mcXVvdDtUQ1BJUCZxdW90Ow0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLlRDUElQUHJvdG9jb2xBZGFwdGVyJnF1b3Q7DQotICAgICAgICAgICAgbmFtZT0mcXVvdDslVENQSVAmcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBhYnN0cmFjdCBjbGFzcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlByb3RvY29sQWRhcHRlckRlbGVnYXRlJmx0Oy9jb2RlJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL3N0YXJ0dXAuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvc3RhcnR1cC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTkyZTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvc3RhcnR1cC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiIGlkPSJpbnRlcm5hbFN0YXJ0dXAiIG5hbWU9IlN0YXJ0dXAiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBsb2FkIGEgc2Vjb25kYXJ5IHBsdWdpbi4gVGhlIGV4dGVuc2lvbiBwb2ludCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBtb25pdG9yIGNvcmUgcGx1Z2luIHN0YXJ0cyB1cC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3RhcnR1cCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InN0YXJ0dXAiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLklTdGFydHVwIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzdGFydHVwIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnN0YXJ0dXBzJnF1b3Q7Jmd0OwotICAgICAgJmx0O3N0YXJ0dXAKLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLm15cGx1Z2luJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5teXBsdWdpbi5TdGFydHVwJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjE2NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb25pdG9ydWkvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjY1YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLW1vbml0b3J1aS5qYXIKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLW9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpXzMuMC4wLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDEyZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODExNzNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIE5vdiAxMCAxNzoxMTozNSBIU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIwODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotI1RodSBTZXAgMTMgMTU6MjU6MDYgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwqLnRlc3RzdWl0ZSwqLmRlcGxveSwqLmxvY2F0aW9uLCouZXhlY3V0aW9uLCouZGF0YXBvb2wsKi5hcnRpZmFjdCwqLmh0bWwsKi5zdmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGZmYTI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBGZWIgMjMgMjE6MTY6MjggRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTYwZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1NhdCBBcHIgMjIgMTg6MzY6MTQgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhiZTc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDQucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vyczt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywxLjEuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZGRjZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KLXNvdXJjZS4uID0gbW9uaXRvcnVpLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9jbGVhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9jbGVhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTk1NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvY2xlYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvaHR0cEhlYWRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9odHRwSGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyMGMzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9odHRwSGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3Bpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9waW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzUwYjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3Bpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9zb3J0UmVzcG9uc2VUaW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzM0ZTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jdmlldzE2L21vbml0b3JWaWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY3ZpZXcxNi9tb25pdG9yVmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzRmMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jdmlldzE2L21vbml0b3JWaWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2NsZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2NsZWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmOThjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9jbGVhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9odHRwSGVhZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2h0dHBIZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDcxYThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2h0dHBIZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvcGluLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L3Bpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNjE1ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvcGluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZTBjNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9jbGVhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9jbGVhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTk1NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvY2xlYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvaHR0cEhlYWRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9odHRwSGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyMGMzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9odHRwSGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3Bpbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9waW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzUwYjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3Bpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9yZXNlbmRSZXF1ZXN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3Jlc2VuZFJlcXVlc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjYyYjYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3Jlc2VuZFJlcXVlc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9zb3J0UmVzcG9uc2VUaW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzNGU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9zb3J0UmVzcG9uc2VUaW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZXRvb2wxNi9lZGl0UmVxdWVzdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V0b29sMTYvZWRpdFJlcXVlc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0ZTU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZXRvb2wxNi9lZGl0UmVxdWVzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V2aWV3MTYvbW9uaXRvclZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9ldmlldzE2L21vbml0b3JWaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3NGYxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V2aWV3MTYvbW9uaXRvclZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9ob3N0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvaG9zdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9ob3N0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9mZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L21vbml0b3JPZmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmU1ZjMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9mZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L21vbml0b3JPbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L21vbml0b3JPbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZjM5NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9tb25pdG9yT24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi90Y3AuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi90Y3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTZlMjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvdGNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxZDFjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotLyoqCi0gKiBDb25zdGFudCBpZHMgZm9yIGNvbnRleHQgaGVscC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZXh0SWRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG12dzAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfVFJFRSA9IE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRtdncwMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1JFUVVFU1QgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXZ3MDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVNQT05TRSA9IE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRtdncwMDA2IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUYgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXByMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TSE9XID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG1wcjAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTU9OSVRPUlMgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXByMDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ESUFMT0cgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXByMDAwNiI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YmQyMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIFRpYW5jaGFvIExpIChUaWFuY2hhby5MaUBnbWFpbC5jb20pIC0gU3RhcnQgbW9uaXRvcnMgYnkgZGVmYXVsdCAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFRyYW5zbGF0ZWQgbWVzc2FnZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdE1vbml0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TW9uaXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbFBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3RlSG9zdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdGVQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW90ZUdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbm5lY3Rpb25UaW1lb3V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1dG9TdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZVR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlNob3dWaWV3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vbml0b3JMaXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtblN0YXR1czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5SZW1vdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5Mb2NhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5BdXRvU3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0b3A7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdG9wcGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGhlYWRlckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltYWdlVmlld0ludmFsaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sVmlld0ludmFsaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaHRtbFZpZXdJbnZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdEYXRlRm9ybWF0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdUaW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXNwb25zZVRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1Jlc3BvbnNlVGltZUZvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3UmVzcG9uc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1JlcXVlc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU29ydEJ5UmVzcG9uc2VUaW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTaXplRm9ybWF0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkNsZWFyVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TaG93SGVhZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblBpbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9wZXJ0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBubzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDE0MTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkgLSBTdGFydCBtb25pdG9ycyBieSBkZWZhdWx0IAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIC0tLS0tLS0tLS0tLS0tLSBUQ1AvSVAgTW9uaXRvciB2aWV3IC0tLS0tLS0tLS0tLS0tLQotCi0jIExhYmVscwotdmlld1JlcXVlc3Q9UmVxdWVzdDogezB9Ci12aWV3UmVzcG9uc2U9UmVzcG9uc2U6IHswfQotdmlld1RpbWU9VGltZSBvZiByZXF1ZXN0OiB7MH0KLXZpZXdUeXBlPVR5cGU6IHswfQotdmlld1Jlc3BvbnNlVGltZT1SZXNwb25zZSBUaW1lOiB7MH0KLXZpZXdTaXplPVNpemU6IHswfQotdmlld1Jlc3BvbnNlVGltZUZvcm1hdD17MH0gbXMKLXZpZXdTaXplRm9ybWF0PXswfSAoezF9KSBieXRlcwotCi0jIFRoZSBmb2xsb3dpbmcgc3RyaW5nIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSB0aW1lIGZvcm1hdCBvZiB0aGUgVENQL0lQIG1vbml0b3IKLSMgdmlldy4gSXQgdXNlcyB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGZvdW5kIGluIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OgotIyAgIGsgLSBob3VyIGluIGRheSwgaCAtIGhvdXIgaW4gYW0vcG0sIG0gLSBtaW51dGUsIHMgLSBzZWNvbmQsIFMgLSBtaWxsaXNlY29uZCwKLSMgICBhIC0gYW0vcG0gbWFya2VyLiB1c2UgZHVwbGljYXRlIGNoYXJzIChlLmcuICdtbScpIHRvIGZpbGwgd2l0aCB6ZXJvcyAoaS5lLiAKLSMgICAnMDEnIGluc3RlYWQgb2YgJzEnKQotdmlld0RhdGVGb3JtYXQ9aDptbS5zLlMgYQotCi0jIEFjdGlvbnMKLWFjdGlvblNvcnRCeVJlc3BvbnNlVGltZT1Tb3J0IEJ5IFJlc3BvbnNlIFRpbWUKLWFjdGlvbkNsZWFyVG9vbFRpcD1DbGVhcgotYWN0aW9uU2hvd0hlYWRlcj1TaG93IEhlYWRlcgotYWN0aW9uUGluPVBpbiBTZWxlY3Rpb24KLWFjdGlvblByb3BlcnRpZXM9UHJvcGVydGllcwotCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFJlcXVlc3RSZXNwb25zZSBWaWV3ZXJzIC0tLS0tLS0tLS0tLS0tLQotaGVhZGVyTGFiZWw9SGVhZGVyOiB7MH0KLWltYWdlVmlld0ludmFsaWQ9PE5vdCBhIHZhbGlkIGltYWdlIGZpbGU+Ci14bWxWaWV3SW52YWxpZD08Tm90IGEgdmFsaWQgWE1MIGZpbGU+Ci1odG1sVmlld0ludmFsaWQ9PE5vdCBhIHZhbGlkIEhUTUwgZmlsZT4KLQotIyAtLS0tLS0tLS0tLS0tLS0gRXJyb3JzIC0tLS0tLS0tLS0tLS0tLQotZXJyb3JEaWFsb2dUaXRsZT1FcnJvcgotCi0jIC0tLS0tLS0tLS0tLS0tLSBHZW5lcmFsIFVJIC0tLS0tLS0tLS0tLS0tLQotbW9uaXRvckxpc3Q9VENQL0lQICZNb25pdG9yczoKLWNvbHVtbkxvY2FsPUxvY2FsIFBvcnQKLWNvbHVtblJlbW90ZT1Ib3N0IG5hbWUKLWNvbHVtblR5cGU9VHlwZQotY29sdW1uU3RhdHVzPVN0YXR1cwotY29sdW1uQXV0b1N0YXJ0PUF1dG8tc3RhcnQKLWFkZD0mQWRkLi4uCi1lZGl0PSZFZGl0Li4uCi1yZW1vdmU9JlJlbW92ZQotc3RhcnQ9JlN0YXJ0Ci1zdG9wPVMmdG9wCi1zdGFydGVkPVN0YXJ0ZWQKLXN0b3BwZWQ9U3RvcHBlZAoteWVzPVllcwotbm89Tm8KLQotbmV3TW9uaXRvcj1OZXcgTW9uaXRvcgotZWRpdE1vbml0b3I9RWRpdCBNb25pdG9yCi0KLWxvY2FsUG9ydD0mTG9jYWwgbW9uaXRvcmluZyBwb3J0OgotcmVtb3RlR3JvdXA9TW9uaXRvcgotcmVtb3RlSG9zdD0mSG9zdCBuYW1lOgotcmVtb3RlUG9ydD0mUG9ydDoKLXBhcnNlVHlwZT0mVHlwZToKLWF1dG9TdGFydD0mU3RhcnQgbW9uaXRvciBhdXRvbWF0aWNhbGx5Ci1jb25uZWN0aW9uVGltZW91dD1UJmltZW91dCAoaW4gbWlsbGlzZWNvbmRzKToKLQotcHJlZmVyZW5jZURlc2NyaXB0aW9uPUNvbmZpZ3VyZSBUQ1AvSVAgbW9uaXRvcnMgb24gbG9jYWwgYW5kIHJlbW90ZSBwb3J0cy4KLXByZWZTaG93Vmlldz1TJmhvdyB0aGUgVENQL0lQIE1vbml0b3IgdmlldyB3aGVuIHRoZXJlIGlzIGFjdGl2aXR5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvckNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvckNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODdiM2NiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTW9uaXRvckNvcmU7Ci0vKioKLSAqIE1vbml0b3IgY29udGVudCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogTW9uaXRvckNvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb25pdG9yQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogRGlzcG9zZXMgb2YgdGhpcyBjb250ZW50IHByb3ZpZGVyLiAgCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyIAotCSAqIHdoZW4gaXRzIGlucHV0IGlzIHNldCB0byB0aGUgZ2l2ZW4gZWxlbWVudC4gCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7Ci0JfQotCi0JLyoKLQkgKiBOb3RpZmllcyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCB0aGUgZ2l2ZW4gdmlld2VyJ3MgaW5wdXQKLQkgKiBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiYTg3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JUHJvdG9jb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTW9uaXRvckNvcmU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIElNb25pdG9yV29ya2luZ0NvcHkgbW9uaXRvcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBva0J1dHRvbjsKLQlwcml2YXRlIFNwaW5uZXIgbW9uaXRvclBvcnQ7Ci0JcHJpdmF0ZSBMYWJlbCB2YWxpZGF0ZUxhYmVsOwotCi0JaW50ZXJmYWNlIFN0cmluZ01vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyBzKTsKLQl9Ci0KLQlpbnRlcmZhY2UgQm9vbGVhbk1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKGJvb2xlYW4gYik7Ci0JfQotCi0JaW50ZXJmYWNlIFR5cGVNb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChJUHJvdG9jb2xBZGFwdGVyIHR5cGUpOwotCX0KLQotCWludGVyZmFjZSBJbnRNb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChpbnQgaSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG1vbml0b3IgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIE1vbml0b3JEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElNb25pdG9yV29ya2luZ0NvcHkgbW9uaXRvcikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCWlzRWRpdCA9IHRydWU7Ci0JfQotCQotCXB1YmxpYyBNb25pdG9yRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJbW9uaXRvciA9IE1vbml0b3JDb3JlLmNyZWF0ZU1vbml0b3IoKTsKLQkJaXNFZGl0ID0gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJaWYgKGlzRWRpdCkKLQkJCXNoZWxsLnNldFRleHQoTWVzc2FnZXMuZWRpdE1vbml0b3IpOwotCQllbHNlCi0JCQlzaGVsbC5zZXRUZXh0KE1lc3NhZ2VzLm5ld01vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIGNvbXAsIFN0cmluZyB0eHQsIGJvb2xlYW4gc2VsZWN0ZWQsIGZpbmFsIEJvb2xlYW5Nb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0VGV4dCh0eHQpOwotCQlidXR0b24uc2V0U2VsZWN0aW9uKHNlbGVjdGVkKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKLQkJCQkJbGlzdGVuZXIudmFsdWVDaGFuZ2VkKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb21wLCBTdHJpbmcgdHh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0eHQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIGNvbXAsIFN0cmluZyB0eHQsIGZpbmFsIFN0cmluZ01vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbXAsIFNXVC5CT1JERVIpOwotCQlpZiAodHh0ICE9IG51bGwpCi0JCQl0ZXh0LnNldFRleHQodHh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewkKLQkJCQkJbGlzdGVuZXIudmFsdWVDaGFuZ2VkKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFNwaW5uZXIgY3JlYXRlU3Bpbm5lcihDb21wb3NpdGUgY29tcCwgaW50IHYsIGZpbmFsIEludE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZpbmFsIFNwaW5uZXIgcyA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIpOwotCQlzLnNldE1pbmltdW0oMCk7Ci0JCXMuc2V0TWF4aW11bShJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCWlmICh2ICE9IC0xKQotCQkJcy5zZXRTZWxlY3Rpb24odik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQlzLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsJCi0JCQkJCWxpc3RlbmVyLnZhbHVlQ2hhbmdlZChzLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZVR5cGVDb21ibyhDb21wb3NpdGUgY29tcCwgZmluYWwgU3RyaW5nW10gdHlwZXMsIFN0cmluZyBzZWwsIGZpbmFsIFN0cmluZ01vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZpbmFsIENvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJaW50IHNpemUgPSB0eXBlcy5sZW5ndGg7Ci0JCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpdGVtc1tpXSA9IHR5cGVzW2ldOwotCQkJaWYgKHR5cGVzW2ldLmVxdWFscyhzZWwpKQotCQkJCWluZGV4ID0gaTsKLQkJfQotCQljb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JCWlmIChpbmRleCA+PSAwKQotCQkJY29tYm8uc2VsZWN0KGluZGV4KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewkKLQkJCQkJbGlzdGVuZXIudmFsdWVDaGFuZ2VkKHR5cGVzW2NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJKChHcmlkTGF5b3V0KWNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5QUkVGX0RJQUxPRyk7Ci0JCQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLmxvY2FsUG9ydCk7Ci0JCW1vbml0b3JQb3J0ID0gY3JlYXRlU3Bpbm5lcihjb21wb3NpdGUsIG1vbml0b3IuZ2V0TG9jYWxQb3J0KCksIG5ldyBJbnRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChpbnQgaSkgewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3Iuc2V0TG9jYWxQb3J0KGkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQl2YWxpZGF0ZUZpZWxkcygpOwotCQkJfQotCQl9KTsKLQkJCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWdyb3VwLnNldFRleHQoTWVzc2FnZXMucmVtb3RlR3JvdXApOwotCQkKLQkJY3JlYXRlTGFiZWwoZ3JvdXAsIE1lc3NhZ2VzLnJlbW90ZUhvc3QpOwotCQljcmVhdGVUZXh0KGdyb3VwLCBtb25pdG9yLmdldFJlbW90ZUhvc3QoKSwgbmV3IFN0cmluZ01vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyBzKSB7Ci0JCQkJbW9uaXRvci5zZXRSZW1vdGVIb3N0KHMpOwotCQkJCXZhbGlkYXRlRmllbGRzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY3JlYXRlTGFiZWwoZ3JvdXAsIE1lc3NhZ2VzLnJlbW90ZVBvcnQpOwotCQljcmVhdGVTcGlubmVyKGdyb3VwLCBtb25pdG9yLmdldFJlbW90ZVBvcnQoKSwgbmV3IEludE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKGludCBpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5zZXRSZW1vdGVQb3J0KGkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQl2YWxpZGF0ZUZpZWxkcygpOwotCQkJfQotCQl9KTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGdyb3VwLCBNZXNzYWdlcy5wYXJzZVR5cGUpOwotCQljcmVhdGVUeXBlQ29tYm8oZ3JvdXAsIG5ldyBTdHJpbmdbXSB7IlRDUC9JUCIsIkhUVFAifSwgbW9uaXRvci5nZXRQcm90b2NvbCgpLCBuZXcgU3RyaW5nTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoU3RyaW5nIHByb3RvY29sSWQpIHsKLQkJCQltb25pdG9yLnNldFByb3RvY29sKHByb3RvY29sSWQpOwotCQkJfQotCQl9KTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGdyb3VwLCBNZXNzYWdlcy5jb25uZWN0aW9uVGltZW91dCk7Ci0JCWNyZWF0ZVNwaW5uZXIoZ3JvdXAsIG1vbml0b3IuZ2V0VGltZW91dCgpLCBuZXcgSW50TW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoaW50IGkpIHsKLQkJCQltb25pdG9yLnNldFRpbWVvdXQoaSk7Ci0JCQkJdmFsaWRhdGVGaWVsZHMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQljcmVhdGVMYWJlbChncm91cCwgIiIpOwotCQljcmVhdGVDaGVja0JveChncm91cCwgTWVzc2FnZXMuYXV0b1N0YXJ0LCBtb25pdG9yLmlzQXV0b1N0YXJ0KCksIG5ldyBCb29sZWFuTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoYm9vbGVhbiBiKSB7Ci0JCQkJbW9uaXRvci5zZXRBdXRvU3RhcnQoYik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdmFsaWRhdGVMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiIpOwotCQl2YWxpZGF0ZUxhYmVsLnNldEZvcmVncm91bmQoY29tcG9zaXRlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlJTW9uaXRvciBzYXZlZE1vbml0b3IgPSBudWxsOwotCQl0cnkgewotCQkJc2F2ZWRNb25pdG9yID0gbW9uaXRvci5zYXZlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGNlLmdldFN0YXR1cygpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc2F2ZWRNb25pdG9yICE9IG51bGwgJiYgc2F2ZWRNb25pdG9yLmlzQXV0b1N0YXJ0KCkpCi0JCQl0cnkgewotCQkJCXNhdmVkTW9uaXRvci5zdGFydCgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGNlLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBidXR0b25Db250cm9sID0gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7Ci0JCXZhbGlkYXRlRmllbGRzKCk7Ci0JCXJldHVybiBidXR0b25Db250cm9sOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRPS0J1dHRvbkVuYWJsZWQoYm9vbGVhbiBjdXJJc0VuYWJsZWQpIHsKLQkJaWYgKG9rQnV0dG9uID09IG51bGwpCi0JCQlva0J1dHRvbiA9IGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQkJCi0JCWlmIChva0J1dHRvbiAhPSBudWxsKQotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChjdXJJc0VuYWJsZWQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmllbGRzKCkgewotCQlpZiAobW9uaXRvclBvcnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBtb25pdG9yLnZhbGlkYXRlKCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJaWYgKG1vbml0b3IuZ2V0UmVtb3RlSG9zdCgpID09IG51bGwgfHwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCkubGVuZ3RoKCkgPCAxKQotCQkJCXZhbGlkYXRlTGFiZWwuc2V0VGV4dCgiIik7Ci0JCQllbHNlCi0JCQkJdmFsaWRhdGVMYWJlbC5zZXRUZXh0KHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0gZWxzZQotCQkJdmFsaWRhdGVMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCi0JCXNldE9LQnV0dG9uRW5hYmxlZChyZXN1bHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDI3NDgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgVGlhbmNoYW8gTGkgKFRpYW5jaGFvLkxpQGdtYWlsLmNvbSkgLSBTdGFydCBtb25pdG9ycyBieSBkZWZhdWx0IAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTW9uaXRvckNvcmU7Ci0vKioKLSAqIFRoZSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBob2xkcyBtb25pdG9yIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkaXNwbGF5QnV0dG9uOwotCQotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBlZGl0OwotCXByb3RlY3RlZCBCdXR0b24gcmVtb3ZlOwotCXByb3RlY3RlZCBCdXR0b24gc3RhcnQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzdG9wOwotCQotCXByb3RlY3RlZCBMaXN0PE9iamVjdD4gc2VsZWN0aW9uMjsKLQotCS8qKgotCSAqIE1vbml0b3JQcmVmZXJlbmNlUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb25pdG9yUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBwcmVmZXJlbmNlIG9wdGlvbnMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuUFJFRik7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmZXJlbmNlRGVzY3JpcHRpb24pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCWRpc3BsYXlCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZGlzcGxheUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLnByZWZTaG93Vmlldyk7Ci0JCWRpc3BsYXlCdXR0b24uc2V0U2VsZWN0aW9uKE1vbml0b3JVSVBsdWdpbi5nZXRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDg7Ci0JCWRpc3BsYXlCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaXNwbGF5QnV0dG9uLCBDb250ZXh0SWRzLlBSRUZfU0hPVyk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5tb25pdG9yTGlzdCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEudmVydGljYWxJbmRlbnQgPSA4OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJdGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDM1MDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YWJsZSwgQ29udGV4dElkcy5QUkVGX01PTklUT1JTKTsKLQkJCi0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQotCQlUYWJsZUNvbHVtbiBzdGF0dXNDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJc3RhdHVzQ29sdW1uLnNldFRleHQoTWVzc2FnZXMuY29sdW1uU3RhdHVzKTsKLQkJQ29sdW1uV2VpZ2h0RGF0YSBjb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNiwgNjAsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQkKLQkJVGFibGVDb2x1bW4gcmVtb3RlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCXJlbW90ZUNvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtblJlbW90ZSk7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMiwgMTIwLCB0cnVlKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2xEYXRhKTsKLQkJCi0JCVRhYmxlQ29sdW1uIGh0dHBDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJaHR0cENvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtblR5cGUpOwotCQljb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNSwgNTAsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQkKLQkJVGFibGVDb2x1bW4gbG9jYWxDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJbG9jYWxDb2x1bW4uc2V0VGV4dChNZXNzYWdlcy5jb2x1bW5Mb2NhbCk7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg2LCA2MCwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCQotCQlUYWJsZUNvbHVtbiBzdGFydE9uU3RhcnR1cENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQlzdGFydE9uU3RhcnR1cENvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtbkF1dG9TdGFydCk7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg3LCA3MCwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCQotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQkKLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IE1vbml0b3JDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IE1vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KCJyb290Iik7Ci0JCQotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlidXR0b25Db21wLnNldExheW91dChsYXlvdXQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCUJ1dHRvbiBhZGQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5hZGQpOwotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKQotCQkJCQlyZXR1cm47Ci0JCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQotCQkJCUlNb25pdG9yW10gbW9uaXRvcnMgPSBNb25pdG9yQ29yZS5nZXRNb25pdG9ycygpOwotCQkJCU9iamVjdCBtb25pdG9yID0gbW9uaXRvcnNbbW9uaXRvcnMubGVuZ3RoIC0gMV07Ci0JCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vbml0b3IpKTsKLQkJCX0KLQkJfSk7CQkKLQkJCi0JCWVkaXQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5lZGl0KTsKLQkJZWRpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBnZXRTZWxlY3Rpb24oKS5nZXQoMCk7Ci0JCQkJSU1vbml0b3JXb3JraW5nQ29weSB3YyA9IG1vbml0b3IuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQkKLQkJCQlNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBNb25pdG9yRGlhbG9nKGdldFNoZWxsKCksIHdjKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKHdjLnNhdmUoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJcmVtb3ZlID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMucmVtb3ZlKTsKLQkJcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3IuZGVsZXRlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQkJdGFibGVWaWV3ZXIucmVtb3ZlKG1vbml0b3IpOwotCQkJCQkKLQkJCQkJSU1vbml0b3JbXSBtb25pdG9ycyA9IE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7Ci0JCQkJCWlmIChtb25pdG9ycy5sZW5ndGggPiAwKSB7Ci0JCQkJCQlPYmplY3QgbW9uaXRvcjIgPSBtb25pdG9yc1ttb25pdG9ycy5sZW5ndGggLSAxXTsKLQkJCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb25pdG9yMikpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJc3RhcnQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5zdGFydCk7Ci0JCWRhdGEgPSAoR3JpZERhdGEpIHN0YXJ0LmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDk7Ci0JCXN0YXJ0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3Iuc3RhcnQoKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgY2UuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBjZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJCXRhYmxlVmlld2VyLnJlZnJlc2gobW9uaXRvciwgdHJ1ZSk7Ci0JCQkJfQotCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbih0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQlzdGFydC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCXN0b3AgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5zdG9wKTsKLQkJc3RvcC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLnN0b3AoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKG1vbml0b3IsIHRydWUpOwotCQkJCX0KLQkJCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24odGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJc3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSB1c2luZyB0aGUgcGFzc2VkIHdvcmtiZW5jaC4KLQkgKgotCSAqIEBwYXJhbSB3b3JrYmVuY2ggdGhlIGN1cnJlbnQgd29ya2JlbmNoCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGZyYW1ld29yayBob29rIG1ldGhvZCBmb3Igc3ViY2xhc3NlcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB3aGVuCi0JICogdGhlIERlZmF1bHRzIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLCBidXQgc2hvdWxkIGNhbGwgPGNvZGU+c3VwZXIucGVyZm9ybURlZmF1bHRzPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlkaXNwbGF5QnV0dG9uLnNldFNlbGVjdGlvbihNb25pdG9yVUlQbHVnaW4uZ2V0RGVmYXVsdFNob3dPbkFjdGl2aXR5UHJlZmVyZW5jZSgpKTsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCU1vbml0b3JVSVBsdWdpbi5zZXRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoZGlzcGxheUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCU1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uMjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWwyKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsMjsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWwuaXRlcmF0b3IoKTsKLQkJc2VsZWN0aW9uMiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJTW9uaXRvcikKLQkJCQlzZWxlY3Rpb24yLmFkZChvYmopOwotCQl9Ci0JCQotCQlpZiAoIXNlbGVjdGlvbjIuaXNFbXB0eSgpKSB7Ci0JCQlyZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQotCQkJYm9vbGVhbiBhbGxTdG9wcGVkID0gdHJ1ZTsKLQkJCWJvb2xlYW4gYWxsU3RhcnRlZCA9IHRydWU7Ci0JCQkKLQkJCWl0ZXJhdG9yID0gc2VsZWN0aW9uMi5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAobW9uaXRvci5pc1J1bm5pbmcoKSkKLQkJCQkJYWxsU3RvcHBlZCA9IGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJYWxsU3RhcnRlZCA9IGZhbHNlOwotCQkJfQotCQkJc3RhcnQuc2V0RW5hYmxlZChhbGxTdG9wcGVkKTsKLQkJCXN0b3Auc2V0RW5hYmxlZChhbGxTdGFydGVkKTsKLQkJCWVkaXQuc2V0RW5hYmxlZChzZWxlY3Rpb24yLnNpemUoKSA9PSAxICYmIGFsbFN0b3BwZWQpOwotCQl9IGVsc2UgewotCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXN0YXJ0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksIENvbnRleHRJZHMuUFJFRik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3NTMyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBUaWFuY2hhbyBMaSAoVGlhbmNoYW8uTGlAZ21haWwuY29tKSAtIFN0YXJ0IG1vbml0b3JzIGJ5IGRlZmF1bHQgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci0vKioKLSAqIE1vbml0b3IgdGFibGUgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yVGFibGVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JLyoqCi0JICogTW9uaXRvclRhYmxlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb25pdG9yVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJSU1vbml0b3IgbW9uaXRvciA9IChJTW9uaXRvcikgZWxlbWVudDsKLQkJCWlmIChtb25pdG9yLmlzUnVubmluZygpKQotCQkJCXJldHVybiBNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2UoTW9uaXRvclVJUGx1Z2luLklNR19NT05JVE9SX09OKTsKLQkJCXJldHVybiBNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2UoTW9uaXRvclVJUGx1Z2luLklNR19NT05JVE9SX09GRik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJSU1vbml0b3IgbW9uaXRvciA9IChJTW9uaXRvcikgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCWlmIChtb25pdG9yLmlzUnVubmluZygpKQotCQkJCXJldHVybiBNZXNzYWdlcy5zdGFydGVkOwotCQkJcmV0dXJuIE1lc3NhZ2VzLnN0b3BwZWQ7Ci0JCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkKLQkJCXJldHVybiBtb25pdG9yLmdldFJlbW90ZUhvc3QoKSArICI6IiArIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpOwotCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKQotCQkJcmV0dXJuIG1vbml0b3IuZ2V0UHJvdG9jb2woKTsKLQkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMykKLQkJCXJldHVybiBtb25pdG9yLmdldExvY2FsUG9ydCgpICsgIiI7Ci0JCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDQpIHsKLQkJCWlmIChtb25pdG9yLmlzQXV0b1N0YXJ0KCkpCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnllczsKLQkJCXJldHVybiBNZXNzYWdlcy5ubzsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gIlgiOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgbm90TnVsbChTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuICIiOwotCQkKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDNjZjI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3Lk1vbml0b3JWaWV3OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotLyoqCi0gKiBUaGUgVENQL0lQIG1vbml0b3IgVUkgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvclVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gQlVGRkVSID0gbmV3IGJ5dGVbNDA5Nl07Ci0KLQlwcml2YXRlIHN0YXRpYyBNb25pdG9yVUlQbHVnaW4gc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIEltYWdlRGVzY3JpcHRvcj4gaW1hZ2VEZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLQlwcml2YXRlIHN0YXRpYyBVUkwgSUNPTl9CQVNFX1VSTDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0NMQ0wgPSAiY2xjbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTENMID0gImVsY2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRExDTCA9ICJkbGNsMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX09CSiA9ICJvYmoxNi8iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfU09SVF9SRVNQT05TRV9USU1FID0gIklNR19FTENMX1NPUlRfUkVTUE9OU0VfVElNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfQ0xFQVIgPSAiSU1HX0VMQ0xfQ0xFQVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX0hUVFBfSEVBREVSID0gIklNR19FTENMX0hUVFBfSEVBREVSIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9QSU4gPSAiSU1HX0VMQ0xfUElOIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9TT1JUX1JFU1BPTlNFX1RJTUUgPSAiSU1HX0NMQ0xfU09SVF9SRVNQT05TRV9USU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9DTEVBUiA9ICJJTUdfQ0xDTF9DTEVBUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfSFRUUF9IRUFERVIgPSAiSU1HX0NMQ0xfSFRUUF9IRUFERVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX1BJTiA9ICJJTUdfQ0xDTF9QSU4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1NPUlRfUkVTUE9OU0VfVElNRSA9ICJJTUdfRExDTF9TT1JUX1JFU1BPTlNFX1RJTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX0NMRUFSID0gIklNR19ETENMX0NMRUFSIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9IVFRQX0hFQURFUiA9ICJJTUdfRExDTF9IVFRQX0hFQURFUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfUElOID0gIklNR19ETENMX1BJTiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUkVRVUVTVF9SRVNQT05TRSA9ICJyZXF1ZXN0UmVzcG9uc2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19SRVNFTkRfUkVRVUVTVF9SRVNQT05TRSA9ICJyZXNlbmRSZXF1ZXN0UmVzcG9uc2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0hPU1QgPSAiaG9zdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX01PTklUT1JfT04gPSAibW9uaXRvck9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTU9OSVRPUl9PRkYgPSAibW9uaXRvck9mZiI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19WSUVXX09OX0FDVElWSVRZID0gInNob3ctdmlldyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTl9WSUVXID0gInBpbi12aWV3IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19IRUFERVIgPSAic2hvdy1oZWFkZXIiOwotCi0JcHJvdGVjdGVkIExpc3Q8UmVxdWVzdD4gcmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0PFJlcXVlc3Q+KCk7Ci0KLQlwcm90ZWN0ZWQgSU1vbml0b3JMaXN0ZW5lciBtb25pdG9yTGlzdGVuZXIgPSBuZXcgSU1vbml0b3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9uaXRvckFkZGVkKElNb25pdG9yIG1vbml0b3IpIHsKLQkJCW1vbml0b3IuYWRkUmVxdWVzdExpc3RlbmVyKHJlcXVlc3RMaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb25pdG9yQ2hhbmdlZChJTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vbml0b3JSZW1vdmVkKElNb25pdG9yIG1vbml0b3IpIHsKLQkJCW1vbml0b3IucmVtb3ZlUmVxdWVzdExpc3RlbmVyKHJlcXVlc3RMaXN0ZW5lcik7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElSZXF1ZXN0TGlzdGVuZXIgcmVxdWVzdExpc3RlbmVyID0gbmV3IElSZXF1ZXN0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHJlcXVlc3RBZGRlZChJTW9uaXRvciBtb25pdG9yLCBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCWFkZFJlcXVlc3QocmVxdWVzdCk7Ci0JCQkKLQkJCWlmIChNb25pdG9yVmlldy52aWV3ICE9IG51bGwpCi0JCQkJTW9uaXRvclZpZXcudmlldy5kb1JlcXVlc3RBZGRlZChyZXF1ZXN0KTsKLQkJCWVsc2UgaWYgKE1vbml0b3JVSVBsdWdpbi5nZXRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoKSkKLQkJCQlNb25pdG9yVmlldy5vcGVuKHJlcXVlc3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVxdWVzdENoYW5nZWQoSU1vbml0b3IgbW9uaXRvciwgUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQlpZiAoTW9uaXRvclZpZXcudmlldyAhPSBudWxsKQotCQkJCU1vbml0b3JWaWV3LnZpZXcuZG9SZXF1ZXN0Q2hhbmdlZChyZXF1ZXN0KTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBNb25pdG9yVUlQbHVnaW4gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvclVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlzaW5nbGV0b24gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHByZS1sb2FkcyB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiBJbWFnZVJlZ2lzdHJ5Ci0JICovCi0JcHJvdGVjdGVkIEltYWdlUmVnaXN0cnkgY3JlYXRlSW1hZ2VSZWdpc3RyeSgpIHsKLQkJSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSA9IHN1cGVyLmNyZWF0ZUltYWdlUmVnaXN0cnkoKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19SRVFVRVNUX1JFU1BPTlNFLCBVUkxfT0JKICsgInRjcC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX1JFU0VORF9SRVFVRVNUX1JFU1BPTlNFLCBVUkxfRUxDTCArICJyZXNlbmRSZXF1ZXN0LmdpZiIpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0hPU1QsIFVSTF9PQkogKyAiaG9zdC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX01PTklUT1JfT04sIFVSTF9PQkogKyAibW9uaXRvck9uLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfTU9OSVRPUl9PRkYsIFVSTF9PQkogKyAibW9uaXRvck9mZi5naWYiKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19DTENMX0NMRUFSLCBVUkxfQ0xDTCArICJjbGVhci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0NMQ0xfU09SVF9SRVNQT05TRV9USU1FLCBVUkxfQ0xDTCArICJzb3J0UmVzcG9uc2VUaW1lLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfQ0xDTF9IVFRQX0hFQURFUiwgVVJMX0NMQ0wgKyAiaHR0cEhlYWRlci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0NMQ0xfUElOLCBVUkxfQ0xDTCArICJwaW4uZ2lmIik7Ci0JCQotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRUxDTF9DTEVBUiwgVVJMX0VMQ0wgKyAiY2xlYXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19FTENMX1NPUlRfUkVTUE9OU0VfVElNRSwgVVJMX0VMQ0wgKyAic29ydFJlc3BvbnNlVGltZS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0VMQ0xfSFRUUF9IRUFERVIsIFVSTF9FTENMICsgImh0dHBIZWFkZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19FTENMX1BJTiwgVVJMX0VMQ0wgKyAicGluLmdpZiIpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0RMQ0xfQ0xFQVIsIFVSTF9ETENMICsgImNsZWFyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRExDTF9TT1JUX1JFU1BPTlNFX1RJTUUsIFVSTF9ETENMICsgInNvcnRSZXNwb25zZVRpbWUuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19ETENMX0hUVFBfSEVBREVSLCBVUkxfRExDTCArICJodHRwSGVhZGVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRExDTF9QSU4sIFVSTF9ETENMICsgInBpbi5naWYiKTsKLQkJCi0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiBhbiBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCWdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQkJcmV0dXJuIGdldEluc3RhbmNlKCkuaW1hZ2VEZXNjcmlwdG9ycy5nZXQoa2V5KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9uaXRvclVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGFuIGltYWdlIHdpdGggdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSBwYXJ0aWFsVVJMCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVySW1hZ2UoSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIGtleSwgU3RyaW5nIHBhcnRpYWxVUkwpIHsKLQkJaWYgKElDT05fQkFTRV9VUkwgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGhTdWZmaXggPSAiaWNvbnMvIjsKLQkJCUlDT05fQkFTRV9VUkwgPSBzaW5nbGV0b24uZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aFN1ZmZpeCk7Ci0JCX0KLQotCQl0cnkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobmV3IFVSTChJQ09OX0JBU0VfVVJMLCBwYXJ0aWFsVVJMKSk7Ci0JCQlyZWdpc3RyeS5wdXQoa2V5LCBpZCk7Ci0JCQlpbWFnZURlc2NyaXB0b3JzLnB1dChrZXksIGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlZ2lzdGVyaW5nIGltYWdlIiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCQotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXREZWZhdWx0KE1vbml0b3JVSVBsdWdpbi5TSE9XX1ZJRVdfT05fQUNUSVZJVFksIHRydWUpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXREZWZhdWx0KE1vbml0b3JVSVBsdWdpbi5QSU5fVklFVywgZmFsc2UpOwotCQkKLQkJTW9uaXRvckNvcmUuYWRkTW9uaXRvckxpc3RlbmVyKG1vbml0b3JMaXN0ZW5lcik7Ci0JCQotCQlJTW9uaXRvcltdIG1vbml0b3JzID0gTW9uaXRvckNvcmUuZ2V0TW9uaXRvcnMoKTsKLQkJaWYgKG1vbml0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoSU1vbml0b3IgbW9uaXRvciA6IG1vbml0b3JzKQotCQkJCW1vbml0b3IuYWRkUmVxdWVzdExpc3RlbmVyKHJlcXVlc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCQotCQlJTW9uaXRvcltdIG1vbml0b3JzID0gTW9uaXRvckNvcmUuZ2V0TW9uaXRvcnMoKTsKLQkJaWYgKG1vbml0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoSU1vbml0b3IgbW9uaXRvciA6IG1vbml0b3JzKQotCQkJCW1vbml0b3IucmVtb3ZlUmVxdWVzdExpc3RlbmVyKHJlcXVlc3RMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCU1vbml0b3JDb3JlLnJlbW92ZU1vbml0b3JMaXN0ZW5lcihtb25pdG9yTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0U2hvd09uQWN0aXZpdHlQcmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihTSE9XX1ZJRVdfT05fQUNUSVZJVFkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oU0hPV19WSUVXX09OX0FDVElWSVRZKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvd09uQWN0aXZpdHlQcmVmZXJlbmNlKGJvb2xlYW4gYikgewotCQlnZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFNIT1dfVklFV19PTl9BQ1RJVklUWSwgYik7Ci0JCWdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFBpblZpZXdQcmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKFBJTl9WSUVXKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGluVmlld1ByZWZlcmVuY2UoYm9vbGVhbiBiKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoUElOX1ZJRVcsIGIpOwotCQlnZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRTaG93SGVhZGVyUHJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihTSE9XX0hFQURFUik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNob3dIZWFkZXJQcmVmZXJlbmNlKGJvb2xlYW4gYikgewotCQlnZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFNIT1dfSEVBREVSLCBiKTsKLQkJZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gdW56aXAgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIGd6aXAuIFRoZSByZXR1cm5lZCBieXRlCi0JICogYXJyYXkgaXMgZWl0aGVyIHRoZSB1bnppcHBlZCByZXN1bHRzLCBvciB0aGUgb3JpZ2luYWwgYnl0ZSBhcnJheSBpZiB1bnppcHBpbmcKLQkgKiB3YXMgbm90IHN1Y2Nlc3NmdWwuIFRoZSBieXRlIGFycmF5IG11c3Qgbm90IGJlIG51bGwuCi0JICogCi0JICogQHBhcmFtIGIgYSBieXRlIGFycmF5Ci0JICogQHJldHVybiB0aGUgdW56aXBwZWQgYXJyYXksIG9yIHRoZSBvcmlnaW5hbCBhcnJheSBpZiB1bnN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBieXRlW10gdW56aXAoYnl0ZVtdIGIpIHsKLQkJaWYgKGIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCXRyeSB7Ci0JCQlHWklQSW5wdXRTdHJlYW0gZ2luID0gbmV3IEdaSVBJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYikpOwotCQkJYnl0ZVtdIHQgPSBuZXcgYnl0ZVswXTsKLQkJCXdoaWxlIChnaW4uYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQkJaW50IG4gPSBnaW4ucmVhZChCVUZGRVIpOwotCQkJCWlmIChuID4gMCkgewotCQkJCQlieXRlW10gdGVtcCA9IG5ldyBieXRlW3QubGVuZ3RoICsgbl07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkodCwgMCwgdGVtcCwgMCwgdC5sZW5ndGgpOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KEJVRkZFUiwgMCwgdGVtcCwgdC5sZW5ndGgsIG4pOwotCQkJCQl0ID0gdGVtcDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkNvdWxkIG5vdCB1bnppcCBieXRlIGFycmF5Iik7Ci0JCQlyZXR1cm4gYjsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwYXJzZSB0aGUgZ2l2ZW4gYnl0ZXMgaW50byBTdHJpbmcgZm9ybS4gVGhlIGJ5dGVzCi0JICogYXJlIHBhcnNlZCBpbnRvIGEgbGluZSBkZWxpbWl0ZWQgc3RyaW5nLiBUaGUgYnl0ZSBhcnJheSBtdXN0IG5vdCBiZSBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBiIGEgYnl0ZSBhcnJheQotCSAqIEByZXR1cm4gdGhlIHN0cmluZyBhZnRlciB0aGUgY29udmVyc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlKGJ5dGVbXSBiKSB7Ci0JCWlmIChiID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYik7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihiaW4pKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJU3RyaW5nIHMgPSBici5yZWFkTGluZSgpOwotCQkJCi0JCQl3aGlsZSAocyAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKHMpOwotCQkJCXMgPSBici5yZWFkTGluZSgpOwotCQkJCWlmIChzICE9IG51bGwpCi0JCQkJCXNiLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHBhcnNpbmcgaW5wdXQiLCBlKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKCFyZXF1ZXN0cy5jb250YWlucyhyZXF1ZXN0KSkKLQkJCXJlcXVlc3RzLmFkZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY3VycmVudCByZXF1ZXN0cy4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVxdWVzdHMKLQkgKi8KLQlwdWJsaWMgUmVxdWVzdFtdIGdldFJlcXVlc3RzKCkgewotCQlSZXF1ZXN0W10gciA9IG5ldyBSZXF1ZXN0W3JlcXVlc3RzLnNpemUoKV07Ci0JCXJlcXVlc3RzLnRvQXJyYXkocik7Ci0JCXJldHVybiByOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhclJlcXVlc3RzKCkgewotCQlyZXF1ZXN0cyA9IG5ldyBBcnJheUxpc3Q8UmVxdWVzdD4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9SZXF1ZXN0QWN0aW9uRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9SZXF1ZXN0QWN0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTkyN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFjdGlvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBBbiBhY3Rpb24gZmlsdGVyIGZvciByZXF1ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RBY3Rpb25GaWx0ZXIgaW1wbGVtZW50cyBJQWN0aW9uRmlsdGVyewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfU0VOVCA9ICJyZXF1ZXN0c2VudCI7Ci0KLQkvKioKLQkgKiBAc2VlIElBY3Rpb25GaWx0ZXIjdGVzdEF0dHJpYnV0ZShPYmplY3QsIFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGUoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlSZXF1ZXN0IHJlcXVlc3QgPSAoUmVxdWVzdCkgdGFyZ2V0OwotCQlpZiAobmFtZS5lcXVhbHMoUkVRVUVTVF9TRU5UKSkgewotCQkJaWYgKHZhbHVlLmVxdWFscygidHJ1ZSIpKQotCQkJCXJldHVybiByZXF1ZXN0LmdldFJlc3BvbnNlVGltZSgpICE9IC0xOwotCQkJCi0JCQlyZXR1cm4gcmVxdWVzdC5nZXRSZXNwb25zZVRpbWUoKSA9PSAtMTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL1JlcXVlc3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjN2Q2ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyOwotLyoqCi0gKiBBZGFwdGVyIGZhY3RvcnkgdG8gYWRhcHQgUmVxdWVzdHMgdG8gSUFjdGlvbkZpbHRlci4KLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JcHJpdmF0ZSBSZXF1ZXN0QWN0aW9uRmlsdGVyIHJlcUFjdGlvbkZpbHRlciA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gSUFjdGlvbkZpbHRlci5jbGFzcykgewotCQkJaWYgKHJlcUFjdGlvbkZpbHRlciA9PSBudWxsKSB7Ci0JCQkJcmVxQWN0aW9uRmlsdGVyID0gbmV3IFJlcXVlc3RBY3Rpb25GaWx0ZXIoKTsKLQkJCX0KLQkJCXJldHVybiByZXFBY3Rpb25GaWx0ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpCi0JICovCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7IElBY3Rpb25GaWx0ZXIuY2xhc3MgfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzYyMmIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLS8qKgotICogU1dUIFV0aWxpdHkgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBGb250TWV0cmljcyBmb250TWV0cmljczsKLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCB0ZXN0Q29udHJvbCkgewotCQkvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0JCUdDIGdjID0gbmV3IEdDKHRlc3RDb250cm9sKTsKLQkJZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlpbnQgd2lkdGhIaW50ID0gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCXJldHVybiBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYnV0dG9uIHdpdGggdGhlIHN0YW5kYXJkIHNpemUuCi0JICogCi0JICogQHBhcmFtIGNvbXAgdGhlIGNvbXBvbmVudCB0byBhZGQgdGhlIGJ1dHRvbiB0bwotCSAqIEBwYXJhbSBsYWJlbCB0aGUgYnV0dG9uIGxhYmVsCi0JICogQHJldHVybiBhIGJ1dHRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29tcCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dChsYWJlbCk7Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXApOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGIpOwotCQliLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBiOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgY29tcCwgU3RyaW5nIHR4dCwgYm9vbGVhbiBpc1NlbGVjdGVkKXsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQodHh0KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJYnV0dG9uLnNldFNlbGVjdGlvbihpc1NlbGVjdGVkKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29tcCwgU3RyaW5nIHR4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodHh0KTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjdlMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU3RhcnR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JU3RhcnR1cDsKLS8qKgotICogU3RhcnR1cCBob29rLgotICovCi1wdWJsaWMgY2xhc3MgU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklTdGFydHVwI3N0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgLSBwbHVnaW4gbG9hZGluZyBpcyBlbm91Z2gKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3YWMzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yUGx1Z2luOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTkZJRyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFdBUk5JTkcgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVZFUkUgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGSU5FU1QgPSAzOwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJdHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewotCQlpZiAobGV2ZWwgPT0gU0VWRVJFKQotCQkJTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vbml0b3JQbHVnaW4uUExVR0lOX0lELCBzLCB0KSk7Ci0JCQotCQlpZiAoIU1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIgIiArIHMpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvY3VzdG9tL01vbml0b3JTdGFja0xheW91dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvY3VzdG9tL01vbml0b3JTdGFja0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNiMTExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9Nb25pdG9yU3RhY2tMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuY3VzdG9tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLS8qKgotICogVGhpcyBMYXlvdXQgc3RhY2tzIGFsbCB0aGUgY29udHJvbHMgb25lIG9uIHRvcCBvZiB0aGUgb3RoZXIgYW5kIHJlc2l6ZXMgYWxsIGNvbnRyb2xzCi0gKiB0byBoYXZlIHRoZSBzYW1lIHNpemUgYW5kIGxvY2F0aW9uLgotICogVGhlIGNvbnRyb2wgc3BlY2lmaWVkIGluIHRvcENvbnRyb2wgaXMgdmlzaWJsZSBhbmQgYWxsIG90aGVyIGNvbnRyb2xzIGFyZSBub3QgdmlzaWJsZS4KLSAqIFVzZXJzIG11c3Qgc2V0IHRoZSB0b3BDb250cm9sIHZhbHVlIHRvIGZsaXAgYmV0d2VlbiB0aGUgdmlzaWJsZSBpdGVtcyBhbmQgdGhlbiBjYWxsIAotICogbGF5b3V0KCkgb24gdGhlIGNvbXBvc2l0ZSB3aGljaCBoYXMgdGhlIE1vbml0b3JTdGFja0xheW91dC4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JTdGFja0xheW91dCBleHRlbmRzIExheW91dCB7Ci0gCS8qKgotIAkgKiB0b3BDb250cm9sIHRoZSBDb250cm9sIHRoYXQgaXMgZGlzcGxheWVkIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotIAkgKiBBbGwgb3RoZXIgY29udHJvbHMgdGhhdCBhcmUgY2hpbGRyZW4gb2YgdGhlIHBhcmVudCBjb21wb3NpdGUgd2lsbCBub3QgYmUgdmlzaWJsZS4KLSAJICovCi0gCXB1YmxpYyBDb250cm9sIHRvcENvbnRyb2w7Ci0KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlDb250cm9sIGNoaWxkcmVuW10gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJaW50IG1heFdpZHRoID0gMDsKLQkJaW50IG1heEhlaWdodCA9IDA7Ci0JCWZvciAoQ29udHJvbCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQlpZiAoY2hpbGQgPT0gdG9wQ29udHJvbCkgewotCQkJCVBvaW50IHNpemUgPSBjaGlsZC5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJCW1heFdpZHRoID0gTWF0aC5tYXgoc2l6ZS54LCBtYXhXaWR0aCk7Ci0JCQkJbWF4SGVpZ2h0ID0gTWF0aC5tYXgoc2l6ZS55LCBtYXhIZWlnaHQpOwotCQkJfQotCQl9Ci0JCWludCB3aWR0aCA9IG1heFdpZHRoOwotCQlpbnQgaGVpZ2h0ID0gbWF4SGVpZ2h0OwotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQl3aWR0aCA9IHdIaW50OwotCQlpZiAoaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQloZWlnaHQgPSBoSGludDsKLQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaENhY2hlKENvbnRyb2wgY29udHJvbCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCUNvbnRyb2wgY2hpbGRyZW5bXSA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0JCWZvciAoQ29udHJvbCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShyZWN0LngrMiwgcmVjdC55LCByZWN0LndpZHRoLTIsIHJlY3QuaGVpZ2h0KTsKLQkJCQljaGlsZC5zZXRCb3VuZHMocik7Ci0JCQl9IGVsc2UKLQkJCQljaGlsZC5zZXRCb3VuZHMocmVjdCk7Ci0JCQljaGlsZC5zZXRWaXNpYmxlKGNoaWxkID09IHRvcENvbnRyb2wpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb25pdG9yU3RhY2tMYXlvdXQiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQ1MTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5jdXN0b207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotLyoqCi0gKiBUaGUgU2FzaEZvcm0gaXMgYSBjb21wb3NpdGUgY29udHJvbCB0aGF0IGxheXMgb3V0IGl0cyBjaGlsZHJlbiBpbiBhCi0gKiByb3cgb3IgY29sdW1uIGFycmFuZ2VtZW50IChhcyBzcGVjaWZpZWQgYnkgdGhlIG9yaWVudGF0aW9uKSBhbmQgcGxhY2VzCi0gKiBhIFNhc2ggYmV0d2VlbiBlYWNoIGNoaWxkLiBPbmUgY2hpbGQgbWF5IGJlIG1heGltaXplZCB0byBvY2N1cHkgdGhlCi0gKiBlbnRpcmUgc2l6ZSBvZiB0aGUgU2FzaEZvcm0uICBUaGUgcmVsYXRpdmUgc2l6ZXMgb2YgdGhlIGNoaWxkcmVuIG1heQotICogYmUgc3BlY2lmaWVkIHVzaW5nIHdlaWdodHMuCi0gKiA8cD4KLSAqIDxkbD4KLSAqIDxkdD48Yj5TdHlsZXM6PC9iPjwvZHQ+Ci0gKiA8ZGQ+SE9SSVpPTlRBTCwgVkVSVElDQUwsIFNNT09USDwvZGQ+Ci0gKiA8L2RsPgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgU2FzaEZvcm0gZXh0ZW5kcyBDb21wb3NpdGUgewotCXB1YmxpYyBpbnQgU0FTSF9XSURUSCA9IDM7Ci0KLQlpbnQgc2FzaFN0eWxlOwotCVNhc2hbXSBzYXNoZXMgPSBuZXcgU2FzaFswXTsKLQkvLyBSZW1lbWJlciBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kCi0JLy8gY29sb3JzIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNldAotCS8vIHNhc2hlcyB0byB0aGUgZGVmYXVsdCBjb2xvciAobnVsbCkgb3IKLQkvLyBhIHNwZWNpZmljIGNvbG9yCi0JQ29sb3IgYmFja2dyb3VuZCA9IG51bGw7Ci0JQ29sb3IgZm9yZWdyb3VuZCA9IG51bGw7Ci0JQ29udHJvbFtdIGNvbnRyb2xzID0gbmV3IENvbnRyb2xbMF07Ci0JQ29udHJvbCBtYXhDb250cm9sID0gbnVsbDsKLQlMaXN0ZW5lciBzYXNoTGlzdGVuZXI7Ci0Jc3RhdGljIGZpbmFsIGludCBEUkFHX01JTklNVU0gPSAyMDsKLQotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZVNhc2ggPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNpemU7ICAKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gaXRzIHBhcmVudAotICogYW5kIGEgc3R5bGUgdmFsdWUgZGVzY3JpYmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCi0gKiA8cD4KLSAqIFRoZSBzdHlsZSB2YWx1ZSBpcyBlaXRoZXIgb25lIG9mIHRoZSBzdHlsZSBjb25zdGFudHMgZGVmaW5lZCBpbgotICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCi0gKiBjbGFzcywgb3IgbXVzdCBiZSBidWlsdCBieSA8ZW0+Yml0d2lzZSBPUjwvZW0+J2luZyB0b2dldGhlciAKLSAqICh0aGF0IGlzLCB1c2luZyB0aGUgPGNvZGU+aW50PC9jb2RlPiAifCIgb3BlcmF0b3IpIHR3byBvciBtb3JlCi0gKiBvZiB0aG9zZSA8Y29kZT5TV1Q8L2NvZGU+IHN0eWxlIGNvbnN0YW50cy4gVGhlIGNsYXNzIGRlc2NyaXB0aW9uCi0gKiBsaXN0cyB0aGUgc3R5bGUgY29uc3RhbnRzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGNsYXNzLgotICogU3R5bGUgYml0cyBhcmUgYWxzbyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHBhcmVudCBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0gKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIHdpZGdldCB0byBjb25zdHJ1Y3QKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50PC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSBTV1QjSE9SSVpPTlRBTAotICogQHNlZSBTV1QjVkVSVElDQUwKLSAqIEBzZWUgI2dldFN0eWxlKCkKLSAqLwotcHVibGljIFNhc2hGb3JtKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCXN1cGVyKHBhcmVudCwgY2hlY2tTdHlsZTIoc3R5bGUpKTsKLQlzdXBlci5zZXRMYXlvdXQobmV3IFNhc2hGb3JtTGF5b3V0KCkpOwotCXNhc2hTdHlsZSA9ICgoc3R5bGUgJiBTV1QuVkVSVElDQUwpICE9IDApID8gU1dULkhPUklaT05UQUwgOiBTV1QuVkVSVElDQUw7Ci0JaWYgKChzdHlsZSAmIFNXVC5CT1JERVIpICE9IDApIHNhc2hTdHlsZSB8PSBTV1QuQk9SREVSOwotCWlmICgoc3R5bGUgJiBTV1QuU01PT1RIKSAhPSAwKSBzYXNoU3R5bGUgfD0gU1dULlNNT09USDsKLQlzYXNoTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCW9uRHJhZ1Nhc2goZSk7Ci0JCX0KLQl9OwotfQotc3RhdGljIGludCBjaGVja1N0eWxlMihpbnQgc3R5bGUpIHsKLQlpbnQgbWFzayA9IFNXVC5CT1JERVIgfCBTV1QuTEVGVF9UT19SSUdIVCB8IFNXVC5SSUdIVF9UT19MRUZUOwotCXJldHVybiBzdHlsZSAmIG1hc2s7Ci19Ci0vKioKLSAqIFJldHVybnMgU1dULkhPUklaT05UQUwgaWYgdGhlIGNvbnRyb2xzIGluIHRoZSBTYXNoRm9ybSBhcmUgbGFpZCBvdXQgc2lkZSBieSBzaWRlCi0gKiBvciBTV1QuVkVSVElDQUwgICBpZiB0aGUgY29udHJvbHMgaW4gdGhlIFNhc2hGb3JtIGFyZSBsYWlkIG91dCB0b3AgdG8gYm90dG9tLgotICogCi0gKiBAcmV0dXJuIFNXVC5IT1JJWk9OVEFMIG9yIFNXVC5WRVJUSUNBTAotICovCi1wdWJsaWMgaW50IGdldE9yaWVudGF0aW9uKCkgewotCS8vY2hlY2tXaWRnZXQoKTsKLQlyZXR1cm4gKHNhc2hTdHlsZSAmIFNXVC5WRVJUSUNBTCkgIT0gMCA/IFNXVC5IT1JJWk9OVEFMIDogU1dULlZFUlRJQ0FMOwotfQotcHVibGljIGludCBnZXRTdHlsZSgpIHsKLQlpbnQgc3R5bGUgPSBzdXBlci5nZXRTdHlsZSgpOwotCXN0eWxlIHw9IGdldE9yaWVudGF0aW9uKCkgPT0gU1dULlZFUlRJQ0FMID8gU1dULlZFUlRJQ0FMIDogU1dULkhPUklaT05UQUw7Ci0JaWYgKChzYXNoU3R5bGUgJiBTV1QuU01PT1RIKSAhPSAwKSBzdHlsZSB8PSBTV1QuU01PT1RIOwotCXJldHVybiBzdHlsZTsKLX0KLS8qKgotICogQW5zd2VyIHRoZSBjb250cm9sIHRoYXQgY3VycmVudGx5IGlzIG1heGltaXplZCBpbiB0aGUgU2FzaEZvcm0uICAKLSAqIFRoaXMgdmFsdWUgbWF5IGJlIG51bGwuCi0gKiAKLSAqIEByZXR1cm4gdGhlIGNvbnRyb2wgdGhhdCBjdXJyZW50bHkgaXMgbWF4aW1pemVkIG9yIG51bGwKLSAqLwotcHVibGljIENvbnRyb2wgZ2V0TWF4aW1pemVkQ29udHJvbCgpewotCS8vY2hlY2tXaWRnZXQoKTsKLQlyZXR1cm4gdGhpcy5tYXhDb250cm9sOwotfQotLyoqCi0gKiBBbnN3ZXIgdGhlIHJlbGF0aXZlIHdlaWdodCBvZiBlYWNoIGNoaWxkIGluIHRoZSBTYXNoRm9ybS4gIFRoZSB3ZWlnaHQgcmVwcmVzZW50cyB0aGUKLSAqIHBlcmNlbnQgb2YgdGhlIHRvdGFsIHdpZHRoIChpZiBTYXNoRm9ybSBoYXMgSG9yaXpvbnRhbCBvcmllbnRhdGlvbikgb3IgCi0gKiB0b3RhbCBoZWlnaHQgKGlmIFNhc2hGb3JtIGhhcyBWZXJ0aWNhbCBvcmllbnRhdGlvbikgZWFjaCBjb250cm9sIG9jY3VwaWVzLgotICogVGhlIHdlaWdodHMgYXJlIHJldHVybmVkIGluIG9yZGVyIG9mIHRoZSBjcmVhdGlvbiBvZiB0aGUgd2lkZ2V0cyAod2VpZ2h0WzBdCi0gKiBjb3JyZXNwb25kcyB0byB0aGUgd2VpZ2h0IG9mIHRoZSBmaXJzdCBjaGlsZCBjcmVhdGVkKS4KLSAqIAotICogQHJldHVybiB0aGUgcmVsYXRpdmUgd2VpZ2h0IG9mIGVhY2ggY2hpbGQKLSAqIAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi0KLXB1YmxpYyBpbnRbXSBnZXRXZWlnaHRzKCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JQ29udHJvbFtdIGNBcnJheSA9IGdldENvbnRyb2xzKGZhbHNlKTsKLQlpbnRbXSByYXRpb3MgPSBuZXcgaW50W2NBcnJheS5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCU9iamVjdCBkYXRhID0gY0FycmF5W2ldLmdldExheW91dERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSB7Ci0JCQlyYXRpb3NbaV0gPSAoaW50KSgoKFNhc2hGb3JtRGF0YSlkYXRhKS53ZWlnaHQgKiAxMDAwID4+IDE2KTsKLQkJfSBlbHNlIHsKLQkJCXJhdGlvc1tpXSA9IDIwMDsKLQkJfQotCX0KLQlyZXR1cm4gcmF0aW9zOwotfQotQ29udHJvbFtdIGdldENvbnRyb2xzKGJvb2xlYW4gb25seVZpc2libGUpIHsKLQlDb250cm9sW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCUNvbnRyb2xbXSByZXN1bHQgPSBuZXcgQ29udHJvbFswXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIFNhc2gpIGNvbnRpbnVlOwotCQlpZiAob25seVZpc2libGUgJiYgIWNoaWxkcmVuW2ldLmdldFZpc2libGUoKSkgY29udGludWU7Ci0KLQkJQ29udHJvbFtdIG5ld1Jlc3VsdCA9IG5ldyBDb250cm9sW3Jlc3VsdC5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIG5ld1Jlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7Ci0JCW5ld1Jlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IGNoaWxkcmVuW2ldOwotCQlyZXN1bHQgPSBuZXdSZXN1bHQ7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci12b2lkIG9uRHJhZ1Nhc2goRXZlbnQgZXZlbnQpIHsKLQlpZiAoIWVuYWJsZVNhc2gpCi0JCXJldHVybjsKLQkKLQlTYXNoIHNhc2ggPSAoU2FzaClldmVudC53aWRnZXQ7Ci0JaW50IHNhc2hJbmRleCA9IC0xOwotCWZvciAoaW50IGk9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKHNhc2hlc1tpXSA9PSBzYXNoKSB7Ci0JCQlzYXNoSW5kZXggPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKHNhc2hJbmRleCA9PSAtMSkgcmV0dXJuOwotCQotCUNvbnRyb2wgYzEgPSBjb250cm9sc1tzYXNoSW5kZXhdOwotCUNvbnRyb2wgYzIgPSBjb250cm9sc1tzYXNoSW5kZXggKyAxXTsKLQlSZWN0YW5nbGUgYjEgPSBjMS5nZXRCb3VuZHMoKTsKLQlSZWN0YW5nbGUgYjIgPSBjMi5nZXRCb3VuZHMoKTsKLQkKLQlSZWN0YW5nbGUgc2FzaEJvdW5kcyA9IHNhc2guZ2V0Qm91bmRzKCk7Ci0JUmVjdGFuZ2xlIGFyZWEgPSBnZXRDbGllbnRBcmVhKCk7Ci0JYm9vbGVhbiBjb3JyZWN0aW9uID0gZmFsc2U7Ci0JaWYgKGdldE9yaWVudGF0aW9uKCkgPT0gU1dULkhPUklaT05UQUwpIHsKLQkJY29ycmVjdGlvbiA9IGIxLndpZHRoIDwgRFJBR19NSU5JTVVNIHx8IGIyLndpZHRoIDwgRFJBR19NSU5JTVVNOwotCQlpbnQgdG90YWxXaWR0aCA9IGIyLnggKyBiMi53aWR0aCAtIGIxLng7IAotCQlpbnQgc2hpZnQgPSBldmVudC54IC0gc2FzaEJvdW5kcy54OwotCQliMS53aWR0aCArPSBzaGlmdDsKLQkJYjIueCArPSBzaGlmdDsKLQkJYjIud2lkdGggLT0gc2hpZnQ7Ci0JCWlmIChiMS53aWR0aCA8IERSQUdfTUlOSU1VTSkgewotCQkJYjEud2lkdGggPSBEUkFHX01JTklNVU07Ci0JCQliMi54ID0gYjEueCArIGIxLndpZHRoICsgc2FzaEJvdW5kcy53aWR0aDsKLQkJCWIyLndpZHRoID0gdG90YWxXaWR0aCAtIGIyLng7Ci0JCQlldmVudC54ID0gYjEueCArIGIxLndpZHRoOwotCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQl9Ci0JCWlmIChiMi53aWR0aCA8IERSQUdfTUlOSU1VTSkgewotCQkJYjEud2lkdGggPSB0b3RhbFdpZHRoIC0gRFJBR19NSU5JTVVNIC0gc2FzaEJvdW5kcy53aWR0aDsKLQkJCWIyLnggPSBiMS54ICsgYjEud2lkdGggKyBzYXNoQm91bmRzLndpZHRoOwotCQkJYjIud2lkdGggPSBEUkFHX01JTklNVU07Ci0JCQlldmVudC54ID0gYjEueCArIGIxLndpZHRoOwotCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQl9Ci0JCU9iamVjdCBkYXRhMSA9IGMxLmdldExheW91dERhdGEoKTsKLQkJaWYgKGRhdGExID09IG51bGwgfHwgIShkYXRhMSBpbnN0YW5jZW9mIFNhc2hGb3JtRGF0YSkpIHsKLQkJCWRhdGExID0gbmV3IFNhc2hGb3JtRGF0YSgpOwotCQkJYzEuc2V0TGF5b3V0RGF0YShkYXRhMSk7Ci0JCX0KLQkJT2JqZWN0IGRhdGEyID0gYzIuZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZGF0YTIgPT0gbnVsbCB8fCAhKGRhdGEyIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSkgewotCQkJZGF0YTIgPSBuZXcgU2FzaEZvcm1EYXRhKCk7Ci0JCQljMi5zZXRMYXlvdXREYXRhKGRhdGEyKTsKLQkJfQotCQkoKFNhc2hGb3JtRGF0YSlkYXRhMSkud2VpZ2h0ID0gKCgobG9uZyliMS53aWR0aCA8PCAxNikgKyBhcmVhLndpZHRoIC0gMSkgLyBhcmVhLndpZHRoOwotCQkoKFNhc2hGb3JtRGF0YSlkYXRhMikud2VpZ2h0ID0gKCgobG9uZyliMi53aWR0aCA8PCAxNikgKyBhcmVhLndpZHRoIC0gMSkgLyBhcmVhLndpZHRoOwotCX0gZWxzZSB7Ci0JCWNvcnJlY3Rpb24gPSBiMS5oZWlnaHQgPCBEUkFHX01JTklNVU0gfHwgYjIuaGVpZ2h0IDwgRFJBR19NSU5JTVVNOwotCQlpbnQgdG90YWxIZWlnaHQgPSBiMi55ICsgYjIuaGVpZ2h0IC0gYjEueTsKLQkJaW50IHNoaWZ0ID0gZXZlbnQueSAtIHNhc2hCb3VuZHMueTsKLQkJYjEuaGVpZ2h0ICs9IHNoaWZ0OwotCQliMi55ICs9IHNoaWZ0OwotCQliMi5oZWlnaHQgLT0gc2hpZnQ7Ci0JCWlmIChiMS5oZWlnaHQgPCBEUkFHX01JTklNVU0pIHsKLQkJCWIxLmhlaWdodCA9IERSQUdfTUlOSU1VTTsKLQkJCWIyLnkgPSBiMS55ICsgYjEuaGVpZ2h0ICsgc2FzaEJvdW5kcy5oZWlnaHQ7Ci0JCQliMi5oZWlnaHQgPSB0b3RhbEhlaWdodCAtIGIyLnk7Ci0JCQlldmVudC55ID0gYjEueSArIGIxLmhlaWdodDsKLQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJfQotCQlpZiAoYjIuaGVpZ2h0IDwgRFJBR19NSU5JTVVNKSB7Ci0JCQliMS5oZWlnaHQgPSB0b3RhbEhlaWdodCAtIERSQUdfTUlOSU1VTSAtIHNhc2hCb3VuZHMuaGVpZ2h0OwotCQkJYjIueSA9IGIxLnkgKyBiMS5oZWlnaHQgKyBzYXNoQm91bmRzLmhlaWdodDsKLQkJCWIyLmhlaWdodCA9IERSQUdfTUlOSU1VTTsKLQkJCWV2ZW50LnkgPSBiMS55ICsgYjEuaGVpZ2h0OwotCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQl9Ci0JCU9iamVjdCBkYXRhMSA9IGMxLmdldExheW91dERhdGEoKTsKLQkJaWYgKGRhdGExID09IG51bGwgfHwgIShkYXRhMSBpbnN0YW5jZW9mIFNhc2hGb3JtRGF0YSkpIHsKLQkJCWRhdGExID0gbmV3IFNhc2hGb3JtRGF0YSgpOwotCQkJYzEuc2V0TGF5b3V0RGF0YShkYXRhMSk7Ci0JCX0KLQkJT2JqZWN0IGRhdGEyID0gYzIuZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZGF0YTIgPT0gbnVsbCB8fCAhKGRhdGEyIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSkgewotCQkJZGF0YTIgPSBuZXcgU2FzaEZvcm1EYXRhKCk7Ci0JCQljMi5zZXRMYXlvdXREYXRhKGRhdGEyKTsKLQkJfQotCQkvLygoU2FzaEZvcm1EYXRhKWRhdGExKS53ZWlnaHQgPSAoKChsb25nKWIxLmhlaWdodCA8PCAxNikgKyBhcmVhLmhlaWdodCAtIDEpIC8gYXJlYS5oZWlnaHQ7Ci0JCS8vKChTYXNoRm9ybURhdGEpZGF0YTIpLndlaWdodCA9ICgoKGxvbmcpYjIuaGVpZ2h0IDw8IDE2KSArIGFyZWEuaGVpZ2h0IC0gMSkgLyBhcmVhLmhlaWdodDsKLQkJKChTYXNoRm9ybURhdGEpZGF0YTEpLndlaWdodCA9ICgoMjAwIDw8IDE2KSArIDk5OSkgLyAxMDAwICogYjEuaGVpZ2h0IC8gYjIuaGVpZ2h0OwotCQkoKFNhc2hGb3JtRGF0YSlkYXRhMikud2VpZ2h0ID0gKCgyMDAgPDwgMTYpICsgOTk5KSAvIDEwMDA7Ci0JfQotCWlmIChjb3JyZWN0aW9uIHx8IChldmVudC5kb2l0ICYmIGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykpIHsKLQkJYzEuc2V0Qm91bmRzKGIxKTsKLQkJc2FzaC5zZXRCb3VuZHMoZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCWMyLnNldEJvdW5kcyhiMik7Ci0JfQotfQotLyoqCi0gKiBJZiBvcmllbnRhdGlvbiBpcyBTV1QuSE9SSVpPTlRBTCwgbGF5IHRoZSBjb250cm9scyBpbiB0aGUgU2FzaEZvcm0gCi0gKiBvdXQgc2lkZSBieSBzaWRlLiAgSWYgb3JpZW50YXRpb24gaXMgU1dULlZFUlRJQ0FMLCBsYXkgdGhlIAotICogY29udHJvbHMgaW4gdGhlIFNhc2hGb3JtIG91dCB0b3AgdG8gYm90dG9tLgotICogCi0gKiBAcGFyYW0gb3JpZW50YXRpb24gU1dULkhPUklaT05UQUwgb3IgU1dULlZFUlRJQ0FMCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgdmFsdWUgb2Ygb3JpZW50YXRpb24gaXMgbm90IFNXVC5IT1JJWk9OVEFMIG9yIFNXVC5WRVJUSUNBTAotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0T3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uKSB7Ci0JY2hlY2tXaWRnZXQoKTsKLQlpZiAoZ2V0T3JpZW50YXRpb24oKSA9PSBvcmllbnRhdGlvbikgcmV0dXJuOwotCWlmIChvcmllbnRhdGlvbiAhPSBTV1QuSE9SSVpPTlRBTCAmJiBvcmllbnRhdGlvbiAhPSBTV1QuVkVSVElDQUwpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl9Ci0Jc2FzaFN0eWxlICY9IH4oU1dULkhPUklaT05UQUwgfCBTV1QuVkVSVElDQUwpOwotCXNhc2hTdHlsZSB8PSBvcmllbnRhdGlvbiA9PSBTV1QuVkVSVElDQUwgPyBTV1QuSE9SSVpPTlRBTCA6IFNXVC5WRVJUSUNBTDsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNhc2hlcy5sZW5ndGg7IGkrKykgewotCQlzYXNoZXNbaV0uZGlzcG9zZSgpOwotCQlzYXNoZXNbaV0gPSBuZXcgU2FzaCh0aGlzLCBzYXNoU3R5bGUpOwotCQlzYXNoZXNbaV0uc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLQkJc2FzaGVzW2ldLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0JCXNhc2hlc1tpXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzYXNoTGlzdGVuZXIpOwotCX0KLQlsYXlvdXQoZmFsc2UpOwotfQotcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZCAoQ29sb3IgY29sb3IpIHsKLQlzdXBlci5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQliYWNrZ3JvdW5kID0gY29sb3I7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspIHsKLQkJc2FzaGVzW2ldLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0JfQotfQotcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZCAoQ29sb3IgY29sb3IpIHsKLQlzdXBlci5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlmb3JlZ3JvdW5kID0gY29sb3I7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspIHsKLQkJc2FzaGVzW2ldLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0JfQotfQotLyoqCi0gKiBTZXRzIHRoZSBsYXlvdXQgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlciB0byBiZQotICogdGhlIGFyZ3VtZW50IHdoaWNoIG1heSBiZSBudWxsLgotICogPHA+Ci0gKiBOb3RlOiBObyBMYXlvdXQgY2FuIGJlIHNldCBvbiB0aGlzIENvbnRyb2wgYmVjYXVzZSBpdCBhbHJlYWR5Ci0gKiBtYW5hZ2VzIHRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiBpdHMgY2hpbGRyZW4uCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIGxheW91dCB0aGUgcmVjZWl2ZXIncyBuZXcgbGF5b3V0IG9yIG51bGwKLSAqCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldExheW91dCAoTGF5b3V0IGxheW91dCkgewotCWNoZWNrV2lkZ2V0KCk7Ci0JcmV0dXJuOwotfQotLyoqCi0gKiBTcGVjaWZ5IHRoZSBjb250cm9sIHRoYXQgc2hvdWxkIHRha2UgdXAgdGhlIGVudGlyZSBjbGllbnQgYXJlYSBvZiB0aGUgU2FzaEZvcm0uICAKLSAqIElmIG9uZSBjb250cm9sIGhhcyBiZWVuIG1heGltaXplZCwgYW5kIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGEgZGlmZmVyZW50IGNvbnRyb2wsIAotICogdGhlIHByZXZpb3VzIGNvbnRyb2wgd2lsbCBiZSBtaW5pbWl6ZWQgYW5kIHRoZSBuZXcgY29udHJvbCB3aWxsIGJlIG1heGltaXplZC4KLSAqIElmIHRoZSB2YWx1ZSBvZiBjb250cm9sIGlzIG51bGwsIHRoZSBTYXNoRm9ybSB3aWxsIG1pbmltaXplIGFsbCBjb250cm9scyBhbmQgcmV0dXJuIHRvCi0gKiB0aGUgZGVmYXVsdCBsYXlvdXQgd2hlcmUgYWxsIGNvbnRyb2xzIGFyZSBsYWlkIG91dCBzZXBhcmF0ZWQgYnkgc2FzaGVzLgotICogCi0gKiBAcGFyYW0gY29udHJvbCB0aGUgY29udHJvbCB0byBiZSBtYXhpbWl6ZWQgb3IgbnVsbAotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldE1heGltaXplZENvbnRyb2woQ29udHJvbCBjb250cm9sKXsKLQljaGVja1dpZGdldCgpOwotCWlmIChjb250cm9sID09IG51bGwpIHsKLQkJaWYgKG1heENvbnRyb2wgIT0gbnVsbCkgewotCQkJdGhpcy5tYXhDb250cm9sID0gbnVsbDsKLQkJCWxheW91dChmYWxzZSk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgc2FzaGVzLmxlbmd0aDsgaSsrKXsKLQkJCQlzYXNoZXNbaV0uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCQotCWZvciAoaW50IGk9IDA7IGkgPCBzYXNoZXMubGVuZ3RoOyBpKyspewotCQlzYXNoZXNbaV0uc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCW1heENvbnRyb2wgPSBjb250cm9sOwotCWxheW91dChmYWxzZSk7Ci19Ci0KLS8qKgotICogU3BlY2lmeSB0aGUgcmVsYXRpdmUgd2VpZ2h0IG9mIGVhY2ggY2hpbGQgaW4gdGhlIFNhc2hGb3JtLiAgVGhpcyB3aWxsIGRldGVybWluZQotICogd2hhdCBwZXJjZW50IG9mIHRoZSB0b3RhbCB3aWR0aCAoaWYgU2FzaEZvcm0gaGFzIEhvcml6b250YWwgb3JpZW50YXRpb24pIG9yIAotICogdG90YWwgaGVpZ2h0IChpZiBTYXNoRm9ybSBoYXMgVmVydGljYWwgb3JpZW50YXRpb24pIGVhY2ggY29udHJvbCB3aWxsIG9jY3VweS4KLSAqIFRoZSB3ZWlnaHRzIG11c3QgYmUgcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGVyZSBtdXN0IGJlIGFuIGVudHJ5IGZvciBlYWNoCi0gKiBub24tc2FzaCBjaGlsZCBvZiB0aGUgU2FzaEZvcm0uCi0gKiAKLSAqIEBwYXJhbSB3ZWlnaHRzIHRoZSByZWxhdGl2ZSB3ZWlnaHQgb2YgZWFjaCBjaGlsZAotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHdlaWdodHMgdmFsdWUgaXMgbnVsbCBvciBvZiBpbmNvcnJlY3QgbGVuZ3RoIChtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4pPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFdlaWdodHMoaW50W10gd2VpZ2h0cykgewotCWNoZWNrV2lkZ2V0KCk7Ci0JQ29udHJvbFtdIGNBcnJheSA9IGdldENvbnRyb2xzKGZhbHNlKTsKLQlpZiAod2VpZ2h0cyA9PSBudWxsIHx8IHdlaWdodHMubGVuZ3RoICE9IGNBcnJheS5sZW5ndGgpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQl9Ci0JCi0JaWYgKHdlaWdodHMgPT0gbnVsbCkKLQkJcmV0dXJuOwotCQotCWludCB0b3RhbCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWlnaHRzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmICh3ZWlnaHRzW2ldIDwgMCkgewotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQkJfQotCQl0b3RhbCArPSB3ZWlnaHRzW2ldOwotCX0KLQlpZiAodG90YWwgPT0gMCkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNBcnJheS5sZW5ndGg7IGkrKykgewotCQlPYmplY3QgZGF0YSA9IGNBcnJheVtpXS5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwgfHwgIShkYXRhIGluc3RhbmNlb2YgU2FzaEZvcm1EYXRhKSkgewotCQkJZGF0YSA9IG5ldyBTYXNoRm9ybURhdGEoKTsKLQkJCWNBcnJheVtpXS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0JCSgoU2FzaEZvcm1EYXRhKWRhdGEpLndlaWdodCA9ICgoKGxvbmcpd2VpZ2h0c1tpXSA8PCAxNikgKyB0b3RhbCAtIDEpIC8gdG90YWw7Ci0JfQotCi0JbGF5b3V0KGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgc2V0U2ltcGxlTGF5b3V0KGJvb2xlYW4gYikgewotCUNvbnRyb2xbXSBjQXJyYXkgPSBnZXRDb250cm9scyhmYWxzZSk7Ci0JaWYgKGNBcnJheSA9PSBudWxsIHx8IGNBcnJheS5sZW5ndGggIT0gMikKLQkJcmV0dXJuOwotCWVuYWJsZVNhc2ggPSBiOwotCVNhc2hGb3JtTGF5b3V0IGxheW91dCA9IChTYXNoRm9ybUxheW91dCkgZ2V0TGF5b3V0KCk7Ci0JbGF5b3V0LnNpbXBsZSA9ICFlbmFibGVTYXNoOwotCQotCWlmIChlbmFibGVTYXNoKQotCQlyZXNpemUgPSB0cnVlOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybURhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiYTIzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm1EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuY3VzdG9tOwotCi1jbGFzcyBTYXNoRm9ybURhdGEgewotCi0JbG9uZyB3ZWlnaHQ7Ci0KLVN0cmluZyBnZXROYW1lICgpIHsKLQlTdHJpbmcgc3RyaW5nID0gZ2V0Q2xhc3MgKCkuZ2V0TmFtZSAoKTsKLQlpbnQgaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YgKCcuJyk7Ci0JaWYgKGluZGV4ID09IC0xKSByZXR1cm4gc3RyaW5nOwotCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nIChpbmRleCArIDEsIHN0cmluZy5sZW5ndGggKCkpOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlCi0gKiBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjZWl2ZXIuCi0gKgotICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXZlbnQKLSAqLwotcHVibGljIFN0cmluZyB0b1N0cmluZyAoKSB7Ci0JcmV0dXJuIGdldE5hbWUoKSsiIHt3ZWlnaHQ9Iit3ZWlnaHQrIn0iOyAvLyROT04tTkxTLTIkCi19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9jdXN0b20vU2FzaEZvcm1MYXlvdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzUwMzIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL2N1c3RvbS9TYXNoRm9ybUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5jdXN0b207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGxheW91dCBmb3IgU2FzaEZvcm0KLSAqIAotICogQHNlZSBTYXNoRm9ybQotICovCi1jbGFzcyBTYXNoRm9ybUxheW91dCBleHRlbmRzIExheW91dCB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2ltcGxlOwotCi1wcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCVNhc2hGb3JtIHNhc2hGb3JtID0gKFNhc2hGb3JtKWNvbXBvc2l0ZTsKLQlDb250cm9sW10gY0FycmF5ID0gc2FzaEZvcm0uZ2V0Q29udHJvbHModHJ1ZSk7Ci0JaW50IHdpZHRoID0gMDsKLQlpbnQgaGVpZ2h0ID0gMDsKLQlpZiAoY0FycmF5Lmxlbmd0aCA9PSAwKSB7Ci0JCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkgd2lkdGggPSB3SGludDsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKSBoZWlnaHQgPSBoSGludDsKLQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKLQl9Ci0JLy8gZGV0ZXJtaW5lIGNvbnRyb2wgc2l6ZXMKLQlib29sZWFuIHZlcnRpY2FsID0gc2FzaEZvcm0uZ2V0T3JpZW50YXRpb24oKSA9PSBTV1QuVkVSVElDQUw7Ci0JaW50IG1heEluZGV4ID0gMDsKLQlpbnQgbWF4VmFsdWUgPSAwOwotCVBvaW50W10gc2l6ZXMgPSBuZXcgUG9pbnRbY0FycmF5Lmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJaWYgKHZlcnRpY2FsKSB7Ci0JCQlzaXplc1tpXSA9IGNBcnJheVtpXS5jb21wdXRlU2l6ZSh3SGludCwgU1dULkRFRkFVTFQsIGZsdXNoQ2FjaGUpOwotCQkJaWYgKHNpemVzW2ldLnkgPiBtYXhWYWx1ZSkgewotCQkJCW1heEluZGV4ID0gaTsKLQkJCQltYXhWYWx1ZSA9IHNpemVzW2ldLnk7Ci0JCQl9Ci0JCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBzaXplc1tpXS54KTsKLQkJfSBlbHNlIHsKLQkJCXNpemVzW2ldID0gY0FycmF5W2ldLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQlpZiAoc2l6ZXNbaV0ueCA+IG1heFZhbHVlKSB7Ci0JCQkJbWF4SW5kZXggPSBpOwotCQkJCW1heFZhbHVlID0gc2l6ZXNbaV0ueDsKLQkJCX0KLQkJCWhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgc2l6ZXNbaV0ueSk7Ci0JCX0KLQl9Ci0JLy8gZ2V0IHRoZSByYXRpb3MKLQlsb25nW10gcmF0aW9zID0gbmV3IGxvbmdbY0FycmF5Lmxlbmd0aF07Ci0JbG9uZyB0b3RhbCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJT2JqZWN0IGRhdGEgPSBjQXJyYXlbaV0uZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEgaW5zdGFuY2VvZiBTYXNoRm9ybURhdGEpIHsKLQkJCXJhdGlvc1tpXSA9ICgoU2FzaEZvcm1EYXRhKWRhdGEpLndlaWdodDsKLQkJfSBlbHNlIHsKLQkJCWRhdGEgPSBuZXcgU2FzaEZvcm1EYXRhKCk7Ci0JCQljQXJyYXlbaV0uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCSgoU2FzaEZvcm1EYXRhKWRhdGEpLndlaWdodCA9IHJhdGlvc1tpXSA9ICgoMjAwIDw8IDE2KSArIDk5OSkgLyAxMDAwOwotCQkJCi0JCX0KLQkJdG90YWwgKz0gcmF0aW9zW2ldOwotCX0KLQlpZiAocmF0aW9zW21heEluZGV4XSA+IDApIHsKLQkJaW50IHNhc2h3aWR0aCA9IHNhc2hGb3JtLnNhc2hlcy5sZW5ndGggPiAwID8gc2FzaEZvcm0uU0FTSF9XSURUSCArIHNhc2hGb3JtLnNhc2hlcyBbMF0uZ2V0Qm9yZGVyV2lkdGgoKSAqIDIgOiBzYXNoRm9ybS5TQVNIX1dJRFRIOwotCQlpZiAodmVydGljYWwpIHsKLQkJCWhlaWdodCArPSAoaW50KSh0b3RhbCAqIG1heFZhbHVlIC8gcmF0aW9zW21heEluZGV4XSkgKyAoY0FycmF5Lmxlbmd0aCAtIDEpICogc2FzaHdpZHRoOwotCQl9IGVsc2UgewotCQkJd2lkdGggKz0gKGludCkodG90YWwgKiBtYXhWYWx1ZSAvIHJhdGlvc1ttYXhJbmRleF0pICsgKGNBcnJheS5sZW5ndGggLSAxKSAqIHNhc2h3aWR0aDsKLQkJfQotCX0KLQl3aWR0aCArPSBzYXNoRm9ybS5nZXRCb3JkZXJXaWR0aCgpKjI7Ci0JaGVpZ2h0ICs9IHNhc2hGb3JtLmdldEJvcmRlcldpZHRoKCkqMjsKLQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHdpZHRoID0gd0hpbnQ7Ci0JaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKSBoZWlnaHQgPSBoSGludDsKLQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBoZWlnaHQpOwotfQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaENhY2hlKENvbnRyb2wgY29udHJvbCkgewotCXJldHVybiB0cnVlOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JU2FzaEZvcm0gc2FzaEZvcm0gPSAoU2FzaEZvcm0pY29tcG9zaXRlOwotCVJlY3RhbmdsZSBhcmVhID0gc2FzaEZvcm0uZ2V0Q2xpZW50QXJlYSgpOwotCWlmIChhcmVhLndpZHRoIDw9IDEgfHwgYXJlYS5oZWlnaHQgPD0gMSkgcmV0dXJuOwotCQotCUNvbnRyb2xbXSBuZXdDb250cm9scyA9IHNhc2hGb3JtLmdldENvbnRyb2xzKHRydWUpOwotCWlmIChzYXNoRm9ybS5jb250cm9scy5sZW5ndGggPT0gMCAmJiBuZXdDb250cm9scy5sZW5ndGggPT0gMCkKLQkJcmV0dXJuOwotCXNhc2hGb3JtLmNvbnRyb2xzID0gbmV3Q29udHJvbHM7Ci0JCi0JQ29udHJvbFtdIGNvbnRyb2xzID0gc2FzaEZvcm0uY29udHJvbHM7Ci0JCi0JaWYgKHNhc2hGb3JtLm1heENvbnRyb2wgIT0gbnVsbCAmJiAhc2FzaEZvcm0ubWF4Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKXsKLQkJCWlmIChjb250cm9sc1tpXSAhPSBzYXNoRm9ybS5tYXhDb250cm9sKSB7Ci0JCQkJY29udHJvbHNbaV0uc2V0Qm91bmRzKC0yMDAsIC0yMDAsIDAsIDApOwotCQkJfSBlbHNlIHsKLQkJCQljb250cm9sc1tpXS5zZXRCb3VuZHMoYXJlYSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQkKLQkvLyBzaW1wbGUgbGF5b3V0Ci0JaWYgKHNpbXBsZSkgewotCQkvLyBoaWRlIHNhc2hlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNhc2hGb3JtLnNhc2hlcy5sZW5ndGg7IGkrKykgewotCQkJc2FzaEZvcm0uc2FzaGVzW2ldLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc2FzaEZvcm0uc2FzaGVzW2ldLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JCQotCQlQb2ludCBwID0gY29udHJvbHNbMF0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQkJY29udHJvbHNbMF0uc2V0Qm91bmRzKDAsIDAsIGFyZWEud2lkdGgsIHAueSk7Ci0JCWNvbnRyb2xzWzFdLnNldEJvdW5kcygwLCBwLnkgKyAyLCBhcmVhLndpZHRoLCBhcmVhLmhlaWdodCAtIHAueSAtIDIpOwotCQkKLQkJcmV0dXJuOwotCX0KLQkKLQkvLyBrZWVwIGp1c3QgdGhlIHJpZ2h0IG51bWJlciBvZiBzYXNoZXMKLQlpZiAoc2FzaEZvcm0uc2FzaGVzLmxlbmd0aCA8IGNvbnRyb2xzLmxlbmd0aCAtIDEpIHsKLQkJU2FzaFtdIG5ld1Nhc2hlcyA9IG5ldyBTYXNoW2NvbnRyb2xzLmxlbmd0aCAtIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHNhc2hGb3JtLnNhc2hlcywgMCwgbmV3U2FzaGVzLCAwLCBzYXNoRm9ybS5zYXNoZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IHNhc2hGb3JtLnNhc2hlcy5sZW5ndGg7IGkgPCBuZXdTYXNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCW5ld1Nhc2hlc1tpXSA9IG5ldyBTYXNoKHNhc2hGb3JtLCBzYXNoRm9ybS5zYXNoU3R5bGUpOwotCQkJbmV3U2FzaGVzW2ldLnNldEJhY2tncm91bmQoc2FzaEZvcm0uYmFja2dyb3VuZCk7Ci0JCQluZXdTYXNoZXNbaV0uc2V0Rm9yZWdyb3VuZChzYXNoRm9ybS5mb3JlZ3JvdW5kKTsKLQkJCW5ld1Nhc2hlc1tpXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzYXNoRm9ybS5zYXNoTGlzdGVuZXIpOwotCQl9Ci0JCXNhc2hGb3JtLnNhc2hlcyA9IG5ld1Nhc2hlczsKLQl9Ci0JaWYgKHNhc2hGb3JtLnNhc2hlcy5sZW5ndGggPiBjb250cm9scy5sZW5ndGggLSAxKSB7Ci0JCWlmIChjb250cm9scy5sZW5ndGggPT0gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzYXNoRm9ybS5zYXNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzYXNoRm9ybS5zYXNoZXNbaV0uZGlzcG9zZSgpOwotCQkJfQotCQkJc2FzaEZvcm0uc2FzaGVzID0gbmV3IFNhc2hbMF07Ci0JCX0gZWxzZSB7Ci0JCQlTYXNoW10gbmV3U2FzaGVzID0gbmV3IFNhc2hbY29udHJvbHMubGVuZ3RoIC0gMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNhc2hGb3JtLnNhc2hlcywgMCwgbmV3U2FzaGVzLCAwLCBuZXdTYXNoZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSBjb250cm9scy5sZW5ndGggLSAxOyBpIDwgc2FzaEZvcm0uc2FzaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2FzaEZvcm0uc2FzaGVzW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXNhc2hGb3JtLnNhc2hlcyA9IG5ld1Nhc2hlczsKLQkJfQotCX0KLQlpZiAoY29udHJvbHMubGVuZ3RoID09IDApIHJldHVybjsKLQlTYXNoW10gc2FzaGVzID0gc2FzaEZvcm0uc2FzaGVzOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgc2FzaEZvcm0uc2FzaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCXNhc2hlc1tpXS5zZXRFbmFibGVkKHRydWUpOwotCQlzYXNoZXNbaV0uc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0JCi0JaWYgKHNhc2hGb3JtLnJlc2l6ZSkgewotCQlDb250cm9sIGMxID0gY29udHJvbHNbMF07Ci0JCUNvbnRyb2wgYzIgPSBjb250cm9sc1sxXTsKLQkJCi0JCWludCBoMSA9IGFyZWEuaGVpZ2h0IC8gMzsKLQkJaW50IGgyID0gYXJlYS5oZWlnaHQgLSBoMSAtIHNhc2hlc1swXS5nZXRCb3VuZHMoKS5oZWlnaHQ7Ci0JCQotCQlPYmplY3QgZGF0YTEgPSBjMS5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChkYXRhMSA9PSBudWxsIHx8ICEoZGF0YTEgaW5zdGFuY2VvZiBTYXNoRm9ybURhdGEpKSB7Ci0JCQlkYXRhMSA9IG5ldyBTYXNoRm9ybURhdGEoKTsKLQkJCWMxLnNldExheW91dERhdGEoZGF0YTEpOwotCQl9Ci0JCU9iamVjdCBkYXRhMiA9IGMyLmdldExheW91dERhdGEoKTsKLQkJaWYgKGRhdGEyID09IG51bGwgfHwgIShkYXRhMiBpbnN0YW5jZW9mIFNhc2hGb3JtRGF0YSkpIHsKLQkJCWRhdGEyID0gbmV3IFNhc2hGb3JtRGF0YSgpOwotCQkJYzIuc2V0TGF5b3V0RGF0YShkYXRhMik7Ci0JCX0KLQkJKChTYXNoRm9ybURhdGEpZGF0YTEpLndlaWdodCA9ICgoMjAwIDw8IDE2KSArIDk5OSkgLyAxMDAwICogaDEgLyBoMjsKLQkJKChTYXNoRm9ybURhdGEpZGF0YTIpLndlaWdodCA9ICgoMjAwIDw8IDE2KSArIDk5OSkgLyAxMDAwOwotCQlzYXNoRm9ybS5yZXNpemUgPSBmYWxzZTsKLQl9Ci0JCi0JLy8gZ2V0IHRoZSByYXRpb3MKLQlsb25nW10gcmF0aW9zID0gbmV3IGxvbmdbY29udHJvbHMubGVuZ3RoXTsKLQlsb25nIHRvdGFsID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCU9iamVjdCBkYXRhID0gY29udHJvbHNbaV0uZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEgaW5zdGFuY2VvZiBTYXNoRm9ybURhdGEpIHsKLQkJCXJhdGlvc1tpXSA9ICgoU2FzaEZvcm1EYXRhKWRhdGEpLndlaWdodDsKLQkJfSBlbHNlIHsKLQkJCWRhdGEgPSBuZXcgU2FzaEZvcm1EYXRhKCk7Ci0JCQljb250cm9sc1tpXS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJKChTYXNoRm9ybURhdGEpZGF0YSkud2VpZ2h0ID0gcmF0aW9zW2ldID0gKCgyMDAgPDwgMTYpICsgOTk5KSAvIDEwMDA7Ci0JCX0KLQkJdG90YWwgKz0gcmF0aW9zW2ldOwotCX0KLQkKLQlpbnQgc2FzaHdpZHRoID0gc2FzaGVzLmxlbmd0aCA+IDAgPyBzYXNoRm9ybS5TQVNIX1dJRFRIICsgc2FzaGVzIFswXS5nZXRCb3JkZXJXaWR0aCgpICogMiA6IHNhc2hGb3JtLlNBU0hfV0lEVEg7Ci0JaWYgKHNhc2hGb3JtLmdldE9yaWVudGF0aW9uKCkgPT0gU1dULkhPUklaT05UQUwpIHsKLQkJaW50IHdpZHRoID0gKGludCkocmF0aW9zWzBdICogKGFyZWEud2lkdGggLSBzYXNoZXMubGVuZ3RoICogc2FzaHdpZHRoKSAvIHRvdGFsKTsKLQkJaW50IHggPSBhcmVhLng7Ci0JCWNvbnRyb2xzWzBdLnNldEJvdW5kcyh4LCBhcmVhLnksIHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCXggKz0gd2lkdGg7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgY29udHJvbHMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlzYXNoZXNbaSAtIDFdLnNldEJvdW5kcyh4LCBhcmVhLnksIHNhc2h3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJeCArPSBzYXNod2lkdGg7Ci0JCQl3aWR0aCA9IChpbnQpKHJhdGlvc1tpXSAqIChhcmVhLndpZHRoIC0gc2FzaGVzLmxlbmd0aCAqIHNhc2h3aWR0aCkgLyB0b3RhbCk7Ci0JCQljb250cm9sc1tpXS5zZXRCb3VuZHMoeCwgYXJlYS55LCB3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJeCArPSB3aWR0aDsKLQkJfQotCQlpZiAoY29udHJvbHMubGVuZ3RoID4gMSkgewotCQkJc2FzaGVzW3Nhc2hlcy5sZW5ndGggLSAxXS5zZXRCb3VuZHMoeCwgYXJlYS55LCBzYXNod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCXggKz0gc2FzaHdpZHRoOwotCQkJd2lkdGggPSBhcmVhLndpZHRoIC0geDsKLQkJCWNvbnRyb2xzW2NvbnRyb2xzLmxlbmd0aCAtIDFdLnNldEJvdW5kcyh4LCBhcmVhLnksIHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCX0KLQl9IGVsc2UgewotCQlpbnQgaGVpZ2h0ID0gKGludCkocmF0aW9zWzBdICogKGFyZWEuaGVpZ2h0IC0gc2FzaGVzLmxlbmd0aCAqIHNhc2h3aWR0aCkgLyB0b3RhbCk7Ci0JCWludCB5ID0gYXJlYS55OwotCQljb250cm9sc1swXS5zZXRCb3VuZHMoYXJlYS54LCB5LCBhcmVhLndpZHRoLCBoZWlnaHQpOwotCQl5ICs9IGhlaWdodDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBjb250cm9scy5sZW5ndGggLSAxOyBpKyspIHsKLQkJCXNhc2hlc1tpIC0gMV0uc2V0Qm91bmRzKGFyZWEueCwgeSwgYXJlYS53aWR0aCwgc2FzaHdpZHRoKTsKLQkJCXkgKz0gc2FzaHdpZHRoOwotCQkJaGVpZ2h0ID0gKGludCkocmF0aW9zW2ldICogKGFyZWEuaGVpZ2h0IC0gc2FzaGVzLmxlbmd0aCAqIHNhc2h3aWR0aCkgLyB0b3RhbCk7Ci0JCQljb250cm9sc1tpXS5zZXRCb3VuZHMoYXJlYS54LCB5LCBhcmVhLndpZHRoLCBoZWlnaHQpOwotCQkJeSArPSBoZWlnaHQ7Ci0JCX0KLQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA+IDEpIHsKLQkJCXNhc2hlc1tzYXNoZXMubGVuZ3RoIC0gMV0uc2V0Qm91bmRzKGFyZWEueCwgeSwgYXJlYS53aWR0aCwgc2FzaHdpZHRoKTsKLQkJCXkgKz0gc2FzaHdpZHRoOwotCQkJaGVpZ2h0ID0gYXJlYS5oZWlnaHQgLSB5OwotCQkJY29udHJvbHNbY29udHJvbHMubGVuZ3RoIC0gMV0uc2V0Qm91bmRzKGFyZWEueCwgeSwgYXJlYS53aWR0aCwgaGVpZ2h0KTsKLQkJfQotCX0KLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Db250ZW50Vmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Db250ZW50Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTAwYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotLyoqCi0gKiBFZGl0YWJsZSB2aWV3ZXIgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcy4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5jb250ZW50Vmlld2VyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogVGhlIHN1YmNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLCB3aGljaCB3aWxsIGJlIHVzZWQKLSAqIGF1dG9tYXRpY2FsbHkgdG8gaW5zdGFudGlhdGUgdGhlIHZpZXdlciB3aGVuIHJlcXVpcmVkLgotICogT25jZSBpbnN0YW50aWF0ZWQsIHtAbGluayAjaW5pdChDb21wb3NpdGUpfSBpcyBjYWxsZWQgdG8gY3JlYXRlCi0gKiB0aGUgdmlld2VyJ3MgY29udHJvbHMuIFRoZW4ge0BsaW5rICNzZXRDb250ZW50KGJ5dGVbXSl9IGlzIGNhbGxlZCwKLSAqIG9uZSBvciBtb3JlIHRpbWVzLCB0byBjYXVzZSB0aGUgdmlld2VyIHRvIGRpc3BsYXkgcGFydGljdWxhcgotICogY29udGVudC4gRmluYWxseSwgd2hlbiB0aGUgdmlld2VyIGlzIG5vIGxvbmdlciBuZWVkZWQsIHtAbGluayAjZGlzcG9zZSgpfQotICogaXMgY2FsbGVkIHRvIGZyZWUgdXAgYW55IHJlc291cmNlcyB0aWVkIHVwIGJ5IHRoZSB2aWV3ZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFtpc3N1ZTogSXQncyB1bmNsZWFyIGhvdyB0aGVzZSBjb250ZW50IHZpZXdlcnMgYXJlIHVzZWQuCi0gKiBJcyBpdCBqdXN0IHRoYXQgdGhlIFVJIHByb3ZpZGVzIGEgbGlzdCBvZiBhdmFpbGFibGUKLSAqIHZpZXdzIGZvciB0aGUgdXNlciB0byBtYWtlIGEgbWFudWFsIHNlbGVjdGlvbiBmcm9tLCByZWdhcmRsZXNzCi0gKiBvZiB0aGUgYWN0dWFsIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UgdHJhZmZpYz9dCi0gKiA8L3A+Ci0gKiBbaXNzdWU6IENTIC0gSWYgYSBDb250ZW50Vmlld2VyIGlzIGVkaXRhYmxlLCBkb2VzIHRoYXQgbWVhbiB3ZSBjYW4gZWRpdCB0aGUgCi0gKiBieXRlcyBvZiB0aGUgbWVzc2FnZSBhbmQgcmVzZW5kIGl0IGFjcm9zcyB0aGUgd2lyZT8gIEhvdyBpcyBhbiBlZGl0YWJsZSBDb250ZW50Vmlld2VyCi0gKiBoYW5kbGVkIGRpZmZlcmVudGx5IGJ5IHRoZSBmcmFtZXdvcms/IFBlcmhhcHMgYW4gZXhhbXBsZSBvZiB3aGF0IGFuIGVkaXRlYWJsZSB2aWV3ZXIgd291bGQgZG8uIF0KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRWaWV3ZXIgewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGVudCB2aWV3ZXIgaW5zdGFuY2UuCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRWaWV3ZXIoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9scyBmb3IgdGhpcyB2aWV3ZXIgYXMgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGNvbXBvc2l0ZS4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudCB0aGF0IHRoZSB2aWV3ZXIgc2hvdWxkIGRpc3BsYXkuCi0JICogVGhlIHBhcmFtZXRlciBtYXkgYmUgbnVsbCBpZiBubyBjb250ZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgaXMgZm9yIGRpc3BsYXlpbmcgcmVxdWVzdC1yZXBvbnNlIG1lc3NhZ2VzLAotCSAqIHdoeSBub3QgcGFzcyBhbiBSZXF1ZXN0PyBUaGUgcHJvYmxlbSBhcyBpdCBzdGFuZHMgbm93IGlzIHRoYXQKLQkgKiBpdCBpcyB1bmNsZWFyIGZyb20gc3BlY3MgaG93IGNvbnRlbnQgdmlld2VycyByZWxhdGUgdG8gYW55dGhpbmcKLQkgKiBlbHNlIGhhdmluZyB0byBkbyB3aXRoIHRoZSBtb25pdG9yLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGIgdGhlIGNvbnRlbnQgdG8gZGlzcGxheSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiBkaXNwbGF5IG5vdGhpbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKTsKLQotCS8qKgotCSAqIEdldCB0aGUgY29udGVudCBmcm9tIHRoZSB2aWV3ZXIuIFRoaXMgaXMgdXN1YWxseSBvbmx5IGludGVyZXN0aW5nIGlmIHRoZQotCSAqIGNvbnRlbnQgaGFzIGNoYW5nZWQuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGFuZAotCSAqIHJldHVybnMgbnVsbC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZnJvbSB0aGUgdmlld2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGlzIHZpZXdlciBhbmQgYW55IHVuZGVybHlpbmcgcmVzb3VyY2VzIHN1Y2ggYXMgYSBjb21wb3NpdGUuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIHVzZXIgc3dpdGNoZXMgdG8gdXNlIGFub3RoZXIKLQkgKiB2aWV3ZXIgb3IgdGhlIG1vbml0b3IgdmlldyBpcyBjbG9zZWQuIFRoZSBwYXJlbnQgY29tcG9zaXRlIHNob3VsZCBub3QKLQkgKiBiZSBkaXNwb3NlZCBzaW5jZSBpdCBtYXkgYmUgdXNlZCB0byBkaXNwbGF5IGFub3RoZXIgdmlld2VyLiAKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBzcGVjaWFsaXplZCBjbGVhbnVwLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhlIGN1cnJlbnQgdmlld2VyIGlzIGVkaXRhYmxlLCB0aGF0IGlzLCB0aGUgdXNlciBpcyBhYmxlIHRvCi0JICogZWRpdCB0aGUgY29udGVudC4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWxsb3dzIGluc3RhbmNlcwotCSAqIHRvIGJlIG1hZGUgZWRpdGFibGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0cnVlIHRoZSBjb250ZW50IGNhbiBiZSBlZGl0ZWQsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmlld2VyIGlzIGVkaXRhYmxlLCB0aGF0IGlzLCB0aGUgdXNlciBpcyBhYmxlIHRvCi0JICogZWRpdCB0aGUgY29udGVudC4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWxsb3dzIGluc3RhbmNlcwotCSAqIHRvIGJlIG1hZGUgZWRpdGFibGUuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHJ1ZSB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Nb25pdG9yVUlDb3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Nb25pdG9yVUlDb3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWE0NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTW9uaXRvclVJQ29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotLyoqCi0gKiBNYWluIGNsYXNzIGZvciBhY2Nlc3MgdG8gdGhlIG1vbml0b3IgVUkuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBzdGF0aWMgbWVtYmVycy4gSXQgaXMgbm90IGludGVuZGVkCi0gKiB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1vbml0b3JVSUNvcmUgewotCS8qKgotCSAqIENhbm5vdCBjcmVhdGUgTW9uaXRvclVJQ29yZSAtIHVzZSBzdGF0aWMgbWV0aG9kcy4KLQkgKi8KLQlwcml2YXRlIE1vbml0b3JVSUNvcmUoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHJlcXVlc3RzIGN1cnJlbnRseSBiZWluZyBkaXNwbGF5ZWQgaW4gdGhlIFRDUC9JUAotCSAqIG1vbml0b3Igdmlldy4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVxdWVzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlcXVlc3RbXSBnZXRSZXF1ZXN0cygpIHsKLQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlcXVlc3RzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjhiNmMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+VENQL0lQIG1vbml0b3IgVUk8L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgQ29udGVudFZpZXdlciBjbGFzcyBpcyBwcm92aWRlZCB0bwotaW1wbGVtZW50IHRoZSB2aWV3ZXJzIGV4dGVuc2lvbiBwb2ludCB0aGF0IGFsbG93cyBleHRlcm5hbCBwbHVnaW5zIHRvIHByb3ZpZGUKLWEgdmlldyBmb3Igdmlld2luZyByZXF1ZXN0IGFuZCByZXNwb25zZSBkYXRhIGNvbnRlbnQgaW4gdGhlIG1vbml0b3Igdmlldy4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDFhMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci08aGVhZD4KLQk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KLQk8bWV0YQotCQluYW1lPSJyb290IgotCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxhYnN0cmFjdD5UQ1AvSVAgbW9uaXRvciBVSTwvYWJzdHJhY3Q+Ci0KLTxwPlRoZSBDb250ZW50Vmlld2VyIGNsYXNzIGlzIHByb3ZpZGVkIHRvCi1pbXBsZW1lbnQgdGhlIHZpZXdlcnMgZXh0ZW5zaW9uIHBvaW50IHRoYXQgYWxsb3dzIGV4dGVybmFsIHBsdWdpbnMgdG8gcHJvdmlkZQotYSB2aWV3IGZvciB2aWV3aW5nIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGRhdGEgY29udGVudCBpbiB0aGUgbW9uaXRvciB2aWV3LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9GaWx0ZXJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvRmlsdGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGQ4M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9GaWx0ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JQ29udGVudEZpbHRlcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBWaWV3ZXJNYW5hZ2VyIHZtOwotCXByb3RlY3RlZCBJQ29udGVudEZpbHRlciBmaWx0ZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZDsKLQotCXB1YmxpYyBGaWx0ZXJBY3Rpb24oVmlld2VyTWFuYWdlciB2bSwgSUNvbnRlbnRGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyKGZpbHRlci5nZXROYW1lKCksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKLQkJdGhpcy52bSA9IHZtOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoIWlzQ2hlY2tlZCgpKQotCQkJdm0ucmVtb3ZlRmlsdGVyKGZpbHRlcik7Ci0JCWVsc2UKLQkJCXZtLmFkZEZpbHRlcihmaWx0ZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L01vZGlmeU1lc3NhZ2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9kaWZ5TWVzc2FnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWYwZjU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9kaWZ5TWVzc2FnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBNb2RpZnkgdGhlIHNlbGVjdGVkIG1lc3NhZ2UuIENyZWF0ZXMgYSBuZXcgcmVzZW5kcmVxdWVzdCBhbmQgYWRkcyBpdAotICogdG8gdGhlIHRyZWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZnlNZXNzYWdlQWN0aW9uIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZXsKLQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7Ci0JCQkJUmVxdWVzdCByZXEgPSAoUmVxdWVzdCkgZWxlbWVudDsKLQkJCQlSZXNlbmRIVFRQUmVxdWVzdCBuZXdSZXEgPSBNb25pdG9yTWFuYWdlci5jcmVhdGVSZXNlbmRSZXF1ZXN0KHJlcSk7Ci0JCQkJTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRSZXNlbmRSZXF1ZXN0KHJlcSwgbmV3UmVxKTsKLQkJCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBNb25pdG9yVmlldy52aWV3LnRyZWVWaWV3ZXI7Ci0JCQkJdHJlZVZpZXdlci5hZGQocmVxLCBuZXdSZXEpOwotCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld1JlcSksIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24yKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDVlYjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKLS8qKgotICogQ29udGVudCBwcm92aWRlciBmb3IgdGhlIG1vbml0b3Igc2VydmVyIHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gInJvb3QiOwotCi0JLyoqCi0JICogUHJveHlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4KLQkgKiA8cD4KLQkgKiBbSXNzdWU6IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHRha2UgYSBWaWV3ZXIsCi0JICogcmVuYW1lZCBhbmQgcmVwdXJwb3NlZCB0byBkaXNjb25uZWN0IGEgY29udGVudCBwcm92aWRlciBmcm9tCi0JICogYSB2aWV3ZXIuIFRoaXMgaXMgb3ZlciBhbmQgYWJvdmUgd2hhdCBpbnB1dENoYW5nZWQgZG9lcywKLQkgKiB3aGljaCBpcyBkaXNjb25uZWN0aW5nIGEgY29udGVudCBwcm92aWRlciBmcm9tIHRoZSB2aWV3ZXIncwotCSAqIGlucHV0IChidXQgbm90IHRoZSB2aWV3ZXIgaXRzZWxmKS4KLQkgKiBdCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBtZXRob2QgYW5kIAotCSAqIDxjb2RlPklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzPC9jb2RlPiBpcwotCSAqIHRoYXQgPGNvZGU+Z2V0RWxlbWVudHM8L2NvZGU+IGlzIGNhbGxlZCB0byBvYnRhaW4gdGhlIAotCSAqIHRyZWUgdmlld2VyJ3Mgcm9vdCBlbGVtZW50cywgd2hlcmVhcyA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gaXMgdXNlZAotCSAqIHRvIG9idGFpbiB0aGUgY2hpbGRyZW4gb2YgYSBnaXZlbiBub2RlIGluIHRoZSB0cmVlCi0JICogKGluY2x1ZGluZyBhIHJvb3QpLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbSXNzdWU6IERvbid0IGtub3cgd2hhdCBhYm92ZSBpcyB0cnlpbmcgdG8gc2F5LgotCSAqICBTZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMuCi0JICogXQotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBjaGlsZCBlbGVtZW50cyAKLQkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5PYmplY3Q8L2NvZGU+KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgZWxlbWVudDsKLQkJCUxpc3Q8UmVxdWVzdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVxdWVzdD4oKTsKLQkJCVJlcXVlc3RbXSByZXF1ZXN0cyA9IE1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlcXVlc3RzKCk7Ci0JCQlpZiAocmVxdWVzdHMgIT0gbnVsbCkgewotCQkJCWZvciAoUmVxdWVzdCByZXEgOiByZXF1ZXN0cykgewotCQkJCQlpZiAoKHJlcS5nZXRMb2NhbFBvcnQoKSA9PSBpbi5pbnRWYWx1ZSgpKQotCQkJCQkJCSYmICEocmVxIGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QpKQotCQkJCQkJbGlzdC5hZGQocmVxKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlcXVlc3QpIHsKLQkJCVJlcXVlc3QgcmVxID0gKFJlcXVlc3QpIGVsZW1lbnQ7Ci0JCQlSZXNlbmRIVFRQUmVxdWVzdFtdIHJyID0gTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNlbmRSZXF1ZXN0cyhyZXEpOwotCQkJTGlzdDxSZXF1ZXN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSZXF1ZXN0PigpOwotCQkJaWYgKHJyICE9IG51bGwpIHsKLQkJCQlmb3IgKFJlc2VuZEhUVFBSZXF1ZXN0IHIgOiBycikKLQkJCQkJbGlzdC5hZGQocik7Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIGJlbG9uZ2luZyB0byB0aGUKLQkgKiBnaXZlbiBlbGVtZW50LiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwKLQkgKiBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKFJPT1QuZXF1YWxzKGVsZW1lbnQpKSB7Ci0JCQlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0JCQlSZXF1ZXN0W10gcmVxdWVzdHMgPSBNb25pdG9yVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXF1ZXN0cygpOwotCQkJaWYgKHJlcXVlc3RzICE9IG51bGwpIHsKLQkJCQlmb3IgKFJlcXVlc3QgcmVxIDogIHJlcXVlc3RzKSB7Ci0JCQkJCUludGVnZXIgaW4gPSBuZXcgSW50ZWdlcihyZXEuZ2V0TG9jYWxQb3J0KCkpOwotCQkJCQlpZiAoIWxpc3QuY29udGFpbnMoaW4pKQotCQkJCQkJbGlzdC5hZGQoaW4pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiAKLQkgKiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcmVudCBjYW4ndCBiZSBjb21wdXRlZC4gCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlZ2VyKQotCQkJCXJldHVybiBST09UOwotCQkJUmVxdWVzdCBjYWxsID0gKFJlcXVlc3QpIGVsZW1lbnQ7Ci0JCQlpZiAoY2FsbCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0KSB7Ci0JCQkJUmVzZW5kSFRUUFJlcXVlc3QgY2FsbFJlc2VuZCA9IChSZXNlbmRIVFRQUmVxdWVzdCkgY2FsbDsKLQkJCQlSZXF1ZXN0IHBhcmVudCA9IGNhbGxSZXNlbmQuZ2V0T3JpZ2luYWxSZXF1ZXN0KCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGNhbGwuZ2V0TG9jYWxQb3J0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBlbGVtZW50IGhhcyBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVnZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KQotCQkJcmV0dXJuIE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzZW5kUmVxdWVzdHMoKFJlcXVlc3QpIGVsZW1lbnQpLmxlbmd0aCA+IDA7IAotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogTm90aWZpZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIHRoYXQgdGhlIGdpdmVuIHZpZXdlcidzIGlucHV0Ci0JICogaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBkaWZmZXJlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L01vbml0b3JWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L01vbml0b3JWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzg4NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuSUNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklSZXF1ZXN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLio7Ci0vKioKLSAqIFZpZXcgb2YgVENQL0lQIGFjdGl2aXR5LgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JcHJvdGVjdGVkIFRyZWUgdHJlZTsKLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCXByb3RlY3RlZCBNb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgVmlld2VyTWFuYWdlciB2bTsKLQlwcm90ZWN0ZWQgTGlzdCByZXF1ZXN0Vmlld2VyczsKLQlwcm90ZWN0ZWQgTGlzdCByZXNwb25zZVZpZXdlcnM7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUQgPSAib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudmlldyI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WSUVXRVIgPSAib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5ieXRlIjsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGh0dHBIZWFkZXJBY3Rpb247Ci0JcHJvdGVjdGVkIElBY3Rpb24gcHJlZmVyZW5jZUFjdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIE1vbml0b3JWaWV3IHZpZXc7Ci0JCi0JcHJvdGVjdGVkIFJlcXVlc3QgY3VycmVudFJlcXVlc3QgPSBudWxsOwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBudWxsOwotCi0JLyoqCi0JICogTW9uaXRvclZpZXcgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvclZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JCXZpZXcgPSB0aGlzOwotCQkKLQkJLy8gdHJ5IHNwZWNpZmllZCBmb3JtYXQsIGFuZCBmYWxsIGJhY2sgdG8gc3RhbmRhcmQgZm9ybWF0Ci0JCXRyeSB7Ci0JCQlmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChNZXNzYWdlcy52aWV3RGF0ZUZvcm1hdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiaDptbS5zLlMgYSIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZG9SZXF1ZXN0QWRkZWQoZmluYWwgUmVxdWVzdCBycikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghKHJyIGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QpKSB7Ci0JCQkJICB0cmVlVmlld2VyLnJlZnJlc2goTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCQkJICBpZiAoIU1vbml0b3JVSVBsdWdpbi5nZXRQaW5WaWV3UHJlZmVyZW5jZSgpKQotCQkJCQkgIHRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJyKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1JlcXVlc3RDaGFuZ2VkKGZpbmFsIFJlcXVlc3QgcnIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodHJlZVZpZXdlciA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCQotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaChycik7Ci0JCQkJaWYgKCFzZWwuaXNFbXB0eSgpKQotCQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhcigpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihudWxsKTsKLQkJCQl0cmVlVmlld2VyLnNldElucHV0KE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0aW9uKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAodHJlZVZpZXdlciAhPSBudWxsKQotCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVxdWVzdCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNhc2hGb3JtIHNhc2hGcGFyZW50ID0gbmV3IFNhc2hGb3JtKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDQ7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA0OwotCQlzYXNoRnBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2FzaEZwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2FzaEZwYXJlbnQsIENvbnRleHRJZHMuVklFVyk7Ci0JCQotCQkvLyBjcmVhdGUgdHJlZSBwYW5lbAotCQlDb21wb3NpdGUgdHJlZVBhbmVsID0gbmV3IENvbXBvc2l0ZShzYXNoRnBhcmVudCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQl0cmVlUGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTEwOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdHJlZVBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCXRyZWUgPSBuZXcgVHJlZSh0cmVlUGFuZWwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkvL2RhdGEud2lkdGhIaW50ID0gMTIwOwotCQl0cmVlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0cmVlLCBDb250ZXh0SWRzLlZJRVdfVFJFRSk7Ci0JCi0JCUNvbXBvc2l0ZSBkZXRhaWxzUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHRyZWVQYW5lbCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlkZXRhaWxzUGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMjAwOwotCQlkZXRhaWxzUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkZXRhaWxzUGFuZWwsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3VGltZSwgIiIpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJZmluYWwgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKGRldGFpbHNQYW5lbCwgU1dULk5PTkUpOwotCQlsYWJlbDIuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lLCAiIikpOwotCQlsYWJlbDIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQotCQlmaW5hbCBMYWJlbCBsYWJlbDMgPSBuZXcgTGFiZWwoZGV0YWlsc1BhbmVsLCBTV1QuTk9ORSk7Ci0JCWxhYmVsMy5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdUeXBlLCAiIikpOwotCQlsYWJlbDMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQotCQkvLyBjcmVhdGUgY2VudGVyIGFuZCByaWdodCBwYW5lbHMKLQkJU2FzaEZvcm0gc2FzaEZjaGlsZCA9IG5ldyBTYXNoRm9ybShzYXNoRnBhcmVudCwgU1dULkhPUklaT05UQUwpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDI7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA0OwotCQlzYXNoRmNoaWxkLnNldExheW91dChsYXlvdXQpOwotCQlzYXNoRnBhcmVudC5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDMwLCA3MCB9KTsKLQkJCi0JCS8vIHJlcXVlc3QgcGFuZWwKLQkJQ29tcG9zaXRlIHJlcXVlc3QgPSBuZXcgQ29tcG9zaXRlKHNhc2hGY2hpbGQsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlyZXF1ZXN0LnNldExheW91dChsYXlvdXQpOwotCQlyZXF1ZXN0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkKLQkJQ29tcG9zaXRlIHJlcXVlc3RIZWFkZXIgPSBuZXcgQ29tcG9zaXRlKHJlcXVlc3QsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMjsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlyZXF1ZXN0SGVhZGVyLnNldExheW91dChsYXlvdXQpOwotCQlyZXF1ZXN0SGVhZGVyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlmaW5hbCBMYWJlbCByZXF1ZXN0TGFiZWwgPSBuZXcgTGFiZWwocmVxdWVzdEhlYWRlciwgU1dULk5PTkUpOwotCQlyZXF1ZXN0TGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVxdWVzdCwgIiIpKTsKLQkJcmVxdWVzdExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJZmluYWwgQ29tYm8gcmVxdWVzdFZpZXdlckNvbWJvID0gbmV3IENvbWJvKHJlcXVlc3RIZWFkZXIsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gMjsKLQkJcmVxdWVzdFZpZXdlckNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlmaW5hbCBMYWJlbCByZXF1ZXN0U2l6ZUxhYmVsID0gbmV3IExhYmVsKHJlcXVlc3RIZWFkZXIsIFNXVC5OT05FKTsKLQkJcmVxdWVzdFNpemVMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTaXplLCAiIikpOwotCQlyZXF1ZXN0U2l6ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJLy8gcmVzcG9uc2UgcGFuZWwKLQkJQ29tcG9zaXRlIHJlc3BvbnNlID0gbmV3IENvbXBvc2l0ZShzYXNoRmNoaWxkLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAzOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcmVzcG9uc2Uuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXJlc3BvbnNlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUNvbXBvc2l0ZSByZXNwb25zZUhlYWRlciA9IG5ldyBDb21wb3NpdGUocmVzcG9uc2UsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMjsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlyZXNwb25zZUhlYWRlci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmVzcG9uc2VIZWFkZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWZpbmFsIExhYmVsIHJlc3BvbnNlTGFiZWwgPSBuZXcgTGFiZWwocmVzcG9uc2VIZWFkZXIsIFNXVC5OT05FKTsKLQkJcmVzcG9uc2VMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXNwb25zZSwgIiIpKTsKLQkJcmVzcG9uc2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCWZpbmFsIENvbWJvIHJlc3BvbnNlVmlld2VyQ29tYm8gPSBuZXcgQ29tYm8ocmVzcG9uc2VIZWFkZXIsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gMjsKLQkJcmVzcG9uc2VWaWV3ZXJDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZmluYWwgTGFiZWwgcmVzcG9uc2VTaXplTGFiZWwgPSBuZXcgTGFiZWwocmVzcG9uc2VIZWFkZXIsIFNXVC5OT05FKTsKLQkJcmVzcG9uc2VTaXplTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZSwgIiIpKTsKLQkJcmVzcG9uc2VTaXplTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQkvLyB2aWV3ZXIgbWFuYWdlcgotCQl2bSA9IG5ldyBWaWV3ZXJNYW5hZ2VyKHJlcXVlc3QsIHJlc3BvbnNlKTsKLQkJcmVxdWVzdFZpZXdlcnMgPSB2bS5nZXRSZXF1ZXN0Vmlld2VycygpOwotCQlyZXNwb25zZVZpZXdlcnMgPSB2bS5nZXRSZXNwb25zZVZpZXdlcnMoKTsKLQkJCi0JCS8vIHNldCB1cCB0aGUgdmlld2VyIGNvbWJvIGJveGVzCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVxdWVzdFZpZXdlcnMuaXRlcmF0b3IoKTsKLQkJaW50IGN0ciA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlyZXF1ZXN0Vmlld2VyQ29tYm8uYWRkKHZpZXdlci5nZXRMYWJlbCgpLCBjdHIpOwotCQkJaWYgKHZpZXdlci5nZXRJZCgpLmVxdWFscyhERUZBVUxUX1ZJRVdFUikpIHsKLQkJCQlyZXF1ZXN0Vmlld2VyQ29tYm8uc2VsZWN0KGN0cik7IAotCQkJCXZtLnNldFJlcXVlc3RWaWV3ZXIodmlld2VyKTsKLQkJCX0KLQkJCWN0cisrOwotCQl9Ci0JCXJlcXVlc3RWaWV3ZXJDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIHJlcXVlc3RWaWV3ZXJzLmdldChyZXF1ZXN0Vmlld2VyQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJaWYgKGN1cnJlbnRSZXF1ZXN0ICE9IG51bGwgJiYgdmlld2VyICE9IG51bGwpCi0JCQkJCWN1cnJlbnRSZXF1ZXN0LnNldFByb3BlcnR5KCJyZXF1ZXN0LXZpZXdlciIsIHZpZXdlci5nZXRJZCgpKTsKLQkJCQl2bS5zZXRSZXF1ZXN0Vmlld2VyKHZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0pOwotCQlyZXF1ZXN0SGVhZGVyLmxheW91dCh0cnVlKTsKLQkJCi0JCWl0ZXJhdG9yID0gcmVzcG9uc2VWaWV3ZXJzLml0ZXJhdG9yKCk7Ci0JCWN0ciA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlyZXNwb25zZVZpZXdlckNvbWJvLmFkZCh2aWV3ZXIuZ2V0TGFiZWwoKSwgY3RyKTsKLQkJCWlmICh2aWV3ZXIuZ2V0SWQoKS5lcXVhbHMoREVGQVVMVF9WSUVXRVIpKSB7Ci0JCQkJcmVzcG9uc2VWaWV3ZXJDb21iby5zZWxlY3QoY3RyKTsgCi0JCQkJdm0uc2V0UmVzcG9uc2VWaWV3ZXIodmlld2VyKTsKLQkJCX0KLQkJCWN0cisrOwotCQl9Ci0JCXJlc3BvbnNlVmlld2VyQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSByZXNwb25zZVZpZXdlcnMuZ2V0KHJlc3BvbnNlVmlld2VyQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJaWYgKGN1cnJlbnRSZXF1ZXN0ICE9IG51bGwgJiYgdmlld2VyICE9IG51bGwpCi0JCQkJCWN1cnJlbnRSZXF1ZXN0LnNldFByb3BlcnR5KCJyZXNwb25zZS12aWV3ZXIiLCB2aWV3ZXIuZ2V0SWQoKSk7Ci0JCQkJdm0uc2V0UmVzcG9uc2VWaWV3ZXIodmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfSk7Ci0JCXJlc3BvbnNlSGVhZGVyLmxheW91dCh0cnVlKTsKLQotCQkvLyBzZWxlY3Rpb24gbGlzdGVuZXIKLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQljdXJyZW50UmVxdWVzdCA9IG51bGw7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJY3VycmVudFNlbGVjdGlvbiA9IHNlbDsKLQkJCQkJT2JqZWN0IG9iaiA9IHNlbC5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlcXVlc3QpCi0JCQkJCQljdXJyZW50UmVxdWVzdCA9IChSZXF1ZXN0KSBvYmo7Ci0JCQkJfQotCQotCQkJCWlmIChjdXJyZW50UmVxdWVzdCAhPSBudWxsKSB7Ci0JCQkJCWxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1RpbWUsIGZvcm1hdC5mb3JtYXQoY3VycmVudFJlcXVlc3QuZ2V0RGF0ZSgpKSkpOwotCQotCQkJCQlpZiAoY3VycmVudFJlcXVlc3QuZ2V0UmVzcG9uc2VUaW1lKCkgPT0gLTEpCi0JCQkJCQlsYWJlbDIuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lLCAiIikpOwotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyB0aW1lID0gTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlVGltZUZvcm1hdCwgY3VycmVudFJlcXVlc3QuZ2V0UmVzcG9uc2VUaW1lKCkgKyAiIik7Ci0JCQkJCQlsYWJlbDIuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lLCB0aW1lKSk7Ci0JCQkJCX0KLQkJCQkJbGFiZWwzLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1R5cGUsIGN1cnJlbnRSZXF1ZXN0LmdldFByb3RvY29sKCkpKTsKLQkKLQkJCQkJLy8gcmVxdWVzdCBpbmZvcm1hdGlvbgotCQkJCQlyZXF1ZXN0TGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVxdWVzdCwgImxvY2FsaG9zdDoiICsgY3VycmVudFJlcXVlc3QuZ2V0TG9jYWxQb3J0KCkpKTsKLQkJCQkJcmVxdWVzdFNpemVMYWJlbC5zZXRUZXh0KGdldFNpemVTdHJpbmcoY3VycmVudFJlcXVlc3QuZ2V0UmVxdWVzdChSZXF1ZXN0LkNPTlRFTlQpLCBjdXJyZW50UmVxdWVzdC5nZXRSZXF1ZXN0KFJlcXVlc3QuQUxMKSkpOwotCQotCQkJCQkvLyByZXNwb25zZSBpbmZvcm1hdGlvbgotCQkJCQlyZXNwb25zZUxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlLCBjdXJyZW50UmVxdWVzdC5nZXRSZW1vdGVIb3N0KCkgKyAiOiIgKyBjdXJyZW50UmVxdWVzdC5nZXRSZW1vdGVQb3J0KCkpKTsKLQkJCQkJcmVzcG9uc2VTaXplTGFiZWwuc2V0VGV4dChnZXRTaXplU3RyaW5nKGN1cnJlbnRSZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQ09OVEVOVCksIGN1cnJlbnRSZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQUxMKSkpOwotCQkJCQkKLQkJCQkJdm0uc2V0UmVxdWVzdChjdXJyZW50UmVxdWVzdCk7Ci0JCQkJCQotCQkJCQlWaWV3ZXIgdmlld2VyID0gdm0uZmluZFZpZXdlcigoU3RyaW5nKSBjdXJyZW50UmVxdWVzdC5nZXRQcm9wZXJ0eSgicmVxdWVzdC12aWV3ZXIiKSk7Ci0JCQkJCWlmICh2aWV3ZXIgPT0gbnVsbCkKLQkJCQkJCXZpZXdlciA9IHZtLmZpbmRWaWV3ZXIoREVGQVVMVF9WSUVXRVIpOwotCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJCXZtLnNldFJlcXVlc3RWaWV3ZXIodmlld2VyKTsKLQkJCQkJCXJlcXVlc3RWaWV3ZXJDb21iby5zZWxlY3QocmVxdWVzdFZpZXdlcnMuaW5kZXhPZih2aWV3ZXIpKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJdmlld2VyID0gdm0uZmluZFZpZXdlcigoU3RyaW5nKSBjdXJyZW50UmVxdWVzdC5nZXRQcm9wZXJ0eSgicmVzcG9uc2Utdmlld2VyIikpOwotCQkJCQlpZiAodmlld2VyID09IG51bGwgJiYgY3VycmVudFJlcXVlc3QuZ2V0TmFtZSgpICE9IG51bGwpCi0JCQkJCQl2aWV3ZXIgPSB2bS5nZXREZWZhdWx0Vmlld2VyKGN1cnJlbnRSZXF1ZXN0LmdldE5hbWUoKSk7Ci0JCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQkJdm0uc2V0UmVzcG9uc2VWaWV3ZXIodmlld2VyKTsKLQkJCQkJCXJlc3BvbnNlVmlld2VyQ29tYm8uc2VsZWN0KHJlc3BvbnNlVmlld2Vycy5pbmRleE9mKHZpZXdlcikpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3VGltZSwgIiIpKTsKLQkJCQkJbGFiZWwyLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlVGltZSwgIiIpKTsKLQkJCQkJcmVxdWVzdExhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1JlcXVlc3QsICIiKSk7Ci0JCQkJCXJlcXVlc3RTaXplTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZSwgIiIpKTsKLQkJCQkJcmVzcG9uc2VMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXNwb25zZSwgIiIpKTsKLQkJCQkJcmVzcG9uc2VTaXplTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZSwgIiIpKTsKLQkJCQkJdm0uc2V0UmVxdWVzdChjdXJyZW50UmVxdWVzdCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdHJlZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotCQkKLQkJLy8gY3JlYXRlIGEgbWVudSBtYW5hZ2VyIGZvciBhIGNvbnRleHQgbWVudQotCQlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOwotCQltZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkJCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQkJCW1lbnUuYWRkKHByZWZlcmVuY2VBY3Rpb24pOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdGhlIG1lbnUKLQkJTWVudSBtZW51ID0gbWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUodHJlZVZpZXdlci5nZXRDb250cm9sKCkpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQkKLQkJLy8gcmVnaXN0ZXIgdGhlIG1lbnUgd2l0aCB0aGUgcGxhdGZvcm0KLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWVudU1hbmFnZXIsIHRyZWVWaWV3ZXIpOwotICAgICAgICAKLQkJaW5pdGlhbGl6ZUFjdGlvbnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTaXplU3RyaW5nKGJ5dGVbXSBhLCBieXRlW10gYikgewotCQlTdHJpbmcgYWEgPSAiMCI7Ci0JCVN0cmluZyBiYiA9ICIwIjsKLQkJaWYgKGEgIT0gbnVsbCkKLQkJCWFhID0gYS5sZW5ndGggKyAiIjsKLQkJaWYgKGIgIT0gbnVsbCkKLQkJCWJiID0gYi5sZW5ndGggKyAiIjsKLQkJU3RyaW5nIHNpemUgPSBOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZUZvcm1hdCwgbmV3IE9iamVjdFtdIHsgYWEsIGJifSk7Ci0JCXJldHVybiBOTFMuYmluZChNZXNzYWdlcy52aWV3U2l6ZSwgc2l6ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQl0cmVlVmlld2VyID0gbnVsbDsKLQkJdmlldyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgdG9vbC1iYXIgYW5kIG1lbnUgYWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQWN0aW9ucygpIHsKLQkJZmluYWwgSUFjdGlvbiBwaW5BY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWJvb2xlYW4gcGluID0gTW9uaXRvclVJUGx1Z2luLmdldFBpblZpZXdQcmVmZXJlbmNlKCk7Ci0JCQkJCQlNb25pdG9yVUlQbHVnaW4uc2V0UGluVmlld1ByZWZlcmVuY2UoIXBpbik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJcGluQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCQlwaW5BY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUGluKTsKLQkJcGluQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRUxDTF9QSU4pKTsKLQkJcGluQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLklNR19DTENMX1BJTikpOwotCQlwaW5BY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0RMQ0xfUElOKSk7Ci0JCQotCQkKLQkJZmluYWwgSUFjdGlvbiBzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICh0cmVlVmlld2VyLmdldENvbXBhcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQkJCQkJc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCQkJCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFJlcXVlc3RDb21wYXJhdG9yKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzZXRDaGVja2VkKGZhbHNlKTsKLQkJCQkJCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJc29ydEJ5UmVzcG9uc2VUaW1lQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCQlzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uU29ydEJ5UmVzcG9uc2VUaW1lKTsKLQkJc29ydEJ5UmVzcG9uc2VUaW1lQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRUxDTF9TT1JUX1JFU1BPTlNFX1RJTUUpKTsKLQkJc29ydEJ5UmVzcG9uc2VUaW1lQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLklNR19DTENMX1NPUlRfUkVTUE9OU0VfVElNRSkpOwotCQlzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0RMQ0xfU09SVF9SRVNQT05TRV9USU1FKSk7Ci0JCi0JCUlBY3Rpb24gY2xlYXJBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmNsZWFyUmVxdWVzdHMoKTsKLQkJCQljbGVhcigpOwotCQkJfQotCQl9OwotCQljbGVhckFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25DbGVhclRvb2xUaXApOwotCQljbGVhckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0VMQ0xfQ0xFQVIpKTsKLQkJY2xlYXJBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0NMQ0xfQ0xFQVIpKTsKLQkJY2xlYXJBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0RMQ0xfQ0xFQVIpKTsKLQotCQlodHRwSGVhZGVyQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlib29sZWFuIGIgPSB2bS5nZXREaXNwbGF5SGVhZGVySW5mbygpOwotCQkJCQkJdm0uc2V0RGlzcGxheUhlYWRlckluZm8oIWIpOwotCQkJCQkJc2V0Q2hlY2tlZCghYik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJaHR0cEhlYWRlckFjdGlvbi5zZXRDaGVja2VkKHZtLmdldERpc3BsYXlIZWFkZXJJbmZvKCkpOwotCQlodHRwSGVhZGVyQWN0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uU2hvd0hlYWRlcik7Ci0KLQkJcHJlZmVyZW5jZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2hvd1ByZWZlcmVuY2VQYWdlKCk7Ci0JCQl9Ci0JCX07Ci0JCXByZWZlcmVuY2VBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9wZXJ0aWVzKTsKLQkJCi0JCQotCQlJVG9vbEJhck1hbmFnZXIgdGJtID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJdGJtLmFkZChzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24pOwotCQl0Ym0uYWRkKGNsZWFyQWN0aW9uKTsKLQkJdGJtLmFkZChwaW5BY3Rpb24pOwotCQkKLQkJSUNvbnRlbnRGaWx0ZXJbXSBmaWx0ZXJzID0gTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRGaWx0ZXJzKCk7Ci0JCUlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChodHRwSGVhZGVyQWN0aW9uKTsKLQkJZm9yIChJQ29udGVudEZpbHRlciBjZiA6IGZpbHRlcnMpIHsKLQkJCUZpbHRlckFjdGlvbiBhY3Rpb24gPSBuZXcgRmlsdGVyQWN0aW9uKHZtLCBjZik7Ci0JCQltZW51TWFuYWdlci5hZGQoYWN0aW9uKTsKLQkJfQotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWVudU1hbmFnZXIuYWRkKHByZWZlcmVuY2VBY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQcmVmZXJlbmNlUGFnZSgpIHsKLQkJUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJSVByZWZlcmVuY2VOb2RlIG5vZGUgPSBtYW5hZ2VyLmZpbmQoIm9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUHJlZmVyZW5jZVBhZ2UiKS5maW5kU3ViTm9kZSgib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IucHJlZmVyZW5jZVBhZ2UiKTsKLQkJUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlcjIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJbWFuYWdlcjIuYWRkVG9Sb290KG5vZGUpOwotCQkKLQkJZmluYWwgUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgbWFuYWdlcjIpOwotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlIH07Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0JCQkJCXJlc3VsdFswXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYSByZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oZmluYWwgUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBNb25pdG9yVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKTsKLQkJCQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJCQotCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCi0JCQkJCUlWaWV3UGFydCB2aWV3MiA9IHBhZ2UuZmluZFZpZXcoVklFV19JRCk7Ci0JCQkJCQotCQkJCQlpZiAodmlldzIgIT0gbnVsbCkKLQkJCQkJCXBhZ2UuYnJpbmdUb1RvcCh2aWV3Mik7Ci0JCQkJCWVsc2UKLQkJCQkJCXBhZ2Uuc2hvd1ZpZXcoVklFV19JRCk7Ci0JCQkJCQotCQkJCQlpZiAodmlldyAhPSBudWxsICYmICFNb25pdG9yVUlQbHVnaW4uZ2V0UGluVmlld1ByZWZlcmVuY2UoKSkKLQkJCQkJCXZpZXcuc2V0U2VsZWN0aW9uKHJlcXVlc3QpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG9wZW5pbmcgVENQL0lQIHZpZXciLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAodHJlZSAhPSBudWxsKQotCQkJdHJlZS5zZXRGb2N1cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvUmVxdWVzdENvbXBhcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvUmVxdWVzdENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3YjY4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1JlcXVlc3RDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotCi1wdWJsaWMgY2xhc3MgUmVxdWVzdENvbXBhcmF0b3IgZXh0ZW5kcyBWaWV3ZXJDb21wYXJhdG9yIHsKLQkvKgotCSAqIEBzZWUgVmlld2VyU29ydGVyI2NvbXBhcmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCWlmIChvMSBpbnN0YW5jZW9mIFJlcXVlc3QgJiYgbzIgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7Ci0JCQlSZXF1ZXN0IHIxID0gKFJlcXVlc3QpIG8xOwotCQkJUmVxdWVzdCByMiA9IChSZXF1ZXN0KSBvMjsKLQkJCWlmIChyMS5nZXRSZXNwb25zZVRpbWUoKSA8IHIyLmdldFJlc3BvbnNlVGltZSgpKQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgbzEsIG8yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9SZXNlbmRNZXNzYWdlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1Jlc2VuZE1lc3NhZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMDRkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1Jlc2VuZE1lc3NhZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLlJlc2VuZEhUVFBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKLS8qKgotICogUmVzZW5kcyB0aGUgc2VsZWN0ZWQgcmVxdWVzdCBhbmQgYWRkcyB0aGUgcmVzdWx0IHRvIHRoZSByZXF1ZXN0L3Jlc3BvbnNlIHRyZWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNlbmRNZXNzYWdlQWN0aW9uIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZXsKLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgUmVxdWVzdCkgewotCQkJCVJlcXVlc3QgcmVxID0gKFJlcXVlc3QpIGVsZW1lbnQ7Ci0JCQkJUmVzZW5kSFRUUFJlcXVlc3QgbmV3UmVxID0gTW9uaXRvck1hbmFnZXIuY3JlYXRlUmVzZW5kUmVxdWVzdChyZXEpOwotCQkJCU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkUmVzZW5kUmVxdWVzdChyZXEsIG5ld1JlcSk7Ci0JCQkJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gTW9uaXRvclZpZXcudmlldy50cmVlVmlld2VyOwotCQkJCXRyZWVWaWV3ZXIuYWRkKHJlcSwgbmV3UmVxKTsKLQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdSZXEpLCBmYWxzZSk7Ci0JCQkJbmV3UmVxLnNlbmRSZXF1ZXN0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uMikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvU2VuZE1vZGlmaWVkTWVzc2FnZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9TZW5kTW9kaWZpZWRNZXNzYWdlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMGI0MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9TZW5kTW9kaWZpZWRNZXNzYWdlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkhlYWRlclZpZXdlcjsKLS8qKgotICogU2VuZCBhIG1vZGlmaWVkIG1lc3NhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZW5kTW9kaWZpZWRNZXNzYWdlQWN0aW9uIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZXsKLQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCkgewotCQkJCVJlc2VuZEhUVFBSZXF1ZXN0IHJlcSA9IChSZXNlbmRIVFRQUmVxdWVzdCkgZWxlbWVudDsKLQkJCQlDb250ZW50Vmlld2VyIGN1clZpZXdlciA9IE1vbml0b3JWaWV3LnZpZXcudm0uZ2V0Q3VycmVudFJlcXVlc3RWaWV3ZXIoKTsKLQkJCQlIZWFkZXJWaWV3ZXIgY3VySGVhZGVyVmlld2VyID0gTW9uaXRvclZpZXcudmlldy52bS5nZXRDdXJyZW50UmVxdWVzdEhlYWRlclZpZXdlcigpOwotCQkJCXJlcS5zZXRSZXF1ZXN0KGN1clZpZXdlci5nZXRDb250ZW50KCksIFJlcXVlc3QuQ09OVEVOVCk7Ci0JCQkJCi0JCQkJaWYgKGN1ckhlYWRlclZpZXdlciAhPSBudWxsKQotCQkJCQlyZXEuc2V0UmVxdWVzdChjdXJIZWFkZXJWaWV3ZXIuZ2V0Q29udGVudCgpLCBSZXF1ZXN0LlRSQU5TUE9SVCk7Ci0KLQkJCQlyZXEuc2VuZFJlcXVlc3QoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24yKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9UcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9UcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWMxZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvVHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKLS8qKgotICogQSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIG1vbml0b3Igc2VydmVyIHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBUcmVlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBUcmVlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGlzIGxhYmVsIHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogRGlzcG9zZXMgb2YgdGhpcyBsYWJlbCBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50IGZvciB1c2UKLQkgKiBpbiB0aGUgZ2l2ZW4gdmlld2VyLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlcXVlc3QpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QpIHsKLQkJCQlpZiAoISgoUmVzZW5kSFRUUFJlcXVlc3QpIGVsZW1lbnQpLmhhc0JlZW5TZW50KCkpCi0JCQkJCXJldHVybiBNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2UoTW9uaXRvclVJUGx1Z2luLklNR19SRVNFTkRfUkVRVUVTVF9SRVNQT05TRSk7Ci0JCQl9Ci0JCQlyZXR1cm4gTW9uaXRvclVJUGx1Z2luLmdldEltYWdlKE1vbml0b3JVSVBsdWdpbi5JTUdfUkVRVUVTVF9SRVNQT05TRSk7Ci0JCX0KLQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZShNb25pdG9yVUlQbHVnaW4uSU1HX0hPU1QpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50IGZvciB1c2UKLQkgKiBpbiB0aGUgZ2l2ZW4gdmlld2VyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlcXVlc3QpIHsKLQkJCVJlcXVlc3QgY2FsbCA9IChSZXF1ZXN0KSBlbGVtZW50OwotCQkJcmV0dXJuIGNhbGwuZ2V0TmFtZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gImxvY2FsaG9zdDoiICsgaW4uaW50VmFsdWUoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCAKLQkgKiBieSBhIGNoYW5nZSB0byB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0byB0aGlzIGxhYmVsIHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ4ZjkzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGNvbnRlbnQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIFZpZXdlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlTdHJpbmcgbGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKLQkJaWYgKGxhYmVsID09IG51bGwpCi0JCQlyZXR1cm4gIm4vYSI7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHZpZXdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2aWV3ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGNvdWxkbid0IGJlIGxvYWRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50Vmlld2VyIGNyZWF0ZVZpZXdlcigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoQ29udGVudFZpZXdlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSB2aWV3ZXIiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVxdWVzdFZpZXdlcigpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJyZXF1ZXN0IikgPj0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlVmlld2VyKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInJlc3BvbnNlIikgPj0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkNvbnRlbnRWaWV3ZXJbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9WaWV3ZXJNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5NDQxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLklDb250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnMuQnl0ZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkhlYWRlclZpZXdlcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3ZXJNYW5hZ2VyIHsKLQlwcml2YXRlIGJvb2xlYW4gZGlzcGxheUhlYWRlckluZjsKLQotCXByb3RlY3RlZCBDb250ZW50Vmlld2VyIHJlcVZpZXdlcjsKLQlwcm90ZWN0ZWQgQ29udGVudFZpZXdlciByZXNwVmlld2VyOwotCXByb3RlY3RlZCBWaWV3ZXIgcmVxdWVzdFZpZXdlcjsKLQlwcm90ZWN0ZWQgVmlld2VyIHJlc3BvbnNlVmlld2VyOwotCi0JcHJvdGVjdGVkIEhlYWRlclZpZXdlciByZXFIZWFkZXI7Ci0JcHJvdGVjdGVkIEhlYWRlclZpZXdlciByZXNwSGVhZGVyOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSByZXFDb21wOwotCXByb3RlY3RlZCBDb21wb3NpdGUgcmVzcENvbXA7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxWaWV3ZXI+IHZpZXdlcnM7Ci0KLQlwcm90ZWN0ZWQgUmVxdWVzdCByZXF1ZXN0OwotCi0JcHJvdGVjdGVkIFNhc2hGb3JtIHJlcVNhc2g7Ci0JcHJvdGVjdGVkIFNhc2hGb3JtIHJlc3BTYXNoOwotCi0JcHJvdGVjdGVkIExpc3Q8SUNvbnRlbnRGaWx0ZXI+IGZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PElDb250ZW50RmlsdGVyPigpOwotCi0JcHVibGljIFZpZXdlck1hbmFnZXIoQ29tcG9zaXRlIHJlcVBhcmVudCwgQ29tcG9zaXRlIHJlc3BQYXJlbnQpIHsKLQkJcmVxU2FzaCA9IG5ldyBTYXNoRm9ybShyZXFQYXJlbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcmVxU2FzaC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmVxU2FzaC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCi0JCXJlc3BTYXNoID0gbmV3IFNhc2hGb3JtKHJlc3BQYXJlbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXJlc3BTYXNoLnNldExheW91dChsYXlvdXQpOwotCQlyZXNwU2FzaC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCi0JCXJlcUNvbXAgPSByZXFTYXNoOwotCQlyZXNwQ29tcCA9IHJlc3BTYXNoOwotCQkKLQkJcmVxSGVhZGVyID0gbmV3IEhlYWRlclZpZXdlcihyZXFTYXNoLCBIZWFkZXJWaWV3ZXIuUkVRVUVTVF9IRUFERVIpOwotCQlyZXNwSGVhZGVyID0gbmV3IEhlYWRlclZpZXdlcihyZXNwU2FzaCwgSGVhZGVyVmlld2VyLlJFU1BPTlNFX0hFQURFUik7Ci0JCXJlcVZpZXdlciA9IG5ldyBCeXRlVmlld2VyKCk7Ci0JCXJlcVZpZXdlci5pbml0KHJlcVNhc2gpOwotCQlyZXNwVmlld2VyID0gbmV3IEJ5dGVWaWV3ZXIoKTsKLQkJcmVzcFZpZXdlci5pbml0KHJlc3BTYXNoKTsKLQkJCi0JCXJlcVNhc2guc2V0V2VpZ2h0cyhuZXcgaW50W10geyAxMCwgOTAgfSk7Ci0JCXJlc3BTYXNoLnNldFdlaWdodHMobmV3IGludFtdIHsgMTAsIDkwIH0pOwotCQkKLQkJc2V0RGlzcGxheUhlYWRlckluZm8oTW9uaXRvclVJUGx1Z2luLmdldFNob3dIZWFkZXJQcmVmZXJlbmNlKCkpOwotCQlsb2FkQXZhaWxhYmxlVmlld2VycygpOwotCX0KLQotCXByb3RlY3RlZCBWaWV3ZXIgZ2V0RGVmYXVsdFZpZXdlcihTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmcgbmFtZTIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7IAotCQlpZiAobmFtZTIuZW5kc1dpdGgoIi54bWwiKSkKLQkJCXJldHVybiBmaW5kVmlld2VyKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLnhtbCIpOwotCQllbHNlIGlmIChuYW1lMi5lbmRzV2l0aCgiLmh0bWwiKSkKLQkJCXJldHVybiBmaW5kVmlld2VyKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLmJyb3dzZXIiKTsKLQkJZWxzZSBpZiAobmFtZTIuZW5kc1dpdGgoIi5naWYiKSB8fCBuYW1lMi5lbmRzV2l0aCgiLmpwZyIpIHx8Ci0JCQkJbmFtZTIuZW5kc1dpdGgoIi5qcGVnIikgfHwgbmFtZTIuZW5kc1dpdGgoIi5wbmciKSkKLQkJCXJldHVybiBmaW5kVmlld2VyKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLmltYWdlIik7Ci0JCWVsc2UKLQkJCXJldHVybiBmaW5kVmlld2VyKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLmJ5dGUiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmlld2VyIGZpbmRWaWV3ZXIoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IHZpZXdlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpZC5lcXVhbHModmlld2VyLmdldElkKCkpKQotCQkJCXJldHVybiB2aWV3ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRBdmFpbGFibGVWaWV3ZXJzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lELCAidmlld2VycyIpOwotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJdmlld2VycyA9IG5ldyBBcnJheUxpc3Q8Vmlld2VyPihzaXplKTsKLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgOiBjZikKLQkJCXZpZXdlcnMuYWRkKG5ldyBWaWV3ZXIoY2UpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI3NldERpc3BsYXlIZWFkZXJJbmZvKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheUhlYWRlckluZm8oYm9vbGVhbiBiKSB7Ci0JCWRpc3BsYXlIZWFkZXJJbmYgPSBiOwotCQlyZXFIZWFkZXIuc2V0RGlzcGxheUhlYWRlcihiKTsKLQkJcmVzcEhlYWRlci5zZXREaXNwbGF5SGVhZGVyKGIpOwotCQlyZXFTYXNoLnNldFNpbXBsZUxheW91dChiKTsKLQkJcmVzcFNhc2guc2V0U2ltcGxlTGF5b3V0KGIpOwotCQlyZXFTYXNoLmxheW91dCh0cnVlKTsKLQkJcmVzcFNhc2gubGF5b3V0KHRydWUpOwotCQkKLQkJTW9uaXRvclVJUGx1Z2luLnNldFNob3dIZWFkZXJQcmVmZXJlbmNlKGIpOwotCQlpZiAoYikgewotCQkJcmVxSGVhZGVyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QgJiYgcmVxdWVzdC5nZXRSZXNwb25zZShSZXF1ZXN0LlRSQU5TUE9SVCkgPT0gbnVsbCkgewotCQkJCXJlcUhlYWRlci5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjZ2V0RGlzcGxheUhlYWRlckluZm8oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERpc3BsYXlIZWFkZXJJbmZvKCkgewotCQlyZXR1cm4gZGlzcGxheUhlYWRlckluZjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KFJlcXVlc3QgcnIpIHsKLQkJLy8gbWFpbnRhaW4gdGhlIHN0YXRlIG9mIHRoZSByZXF1ZXN0IGFuZCByZXF1ZXN0IGhlYWRlciBpZiB0aGV5J3ZlIGJlZW4gbW9kaWZpZWQuCi0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QgJiYgcmVxdWVzdC5nZXRSZXNwb25zZShSZXF1ZXN0LkFMTCkgPT0gbnVsbCkgewotCQkJUmVzZW5kSFRUUFJlcXVlc3QgcmVzUmVxdWVzdCA9IChSZXNlbmRIVFRQUmVxdWVzdCkgcmVxdWVzdDsKLQkJCS8vRWRpdGFibGVDb250ZW50Vmlld2VyIGVkaXRWaWV3ZXIgPSAoQ29udGVudFZpZXdlcikgcmVxVmlld2VyOwotCQkJYnl0ZVtdIGNvbnRlbnQgPSByZXFWaWV3ZXIuZ2V0Q29udGVudCgpOwotCQkJYnl0ZVtdIGIgPSByZXNSZXF1ZXN0LmdldFJlcXVlc3QoUmVxdWVzdC5DT05URU5UKTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwgJiYgYiAhPSBudWxsICYmICFNb25pdG9yVUlQbHVnaW4ucGFyc2UoYikuZXF1YWxzKE1vbml0b3JVSVBsdWdpbi5wYXJzZShjb250ZW50KSkpIHsKLQkJCQlyZXNSZXF1ZXN0LnNldFJlcXVlc3QoY29udGVudCwgUmVxdWVzdC5DT05URU5UKTsKLQkJCX0KLQkJCWJ5dGVbXSBoZWFkZXIgPSByZXFIZWFkZXIuZ2V0Q29udGVudCgpOwotCQkJYiA9IHJlc1JlcXVlc3QuZ2V0UmVxdWVzdChSZXF1ZXN0LlRSQU5TUE9SVCk7Ci0JCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgYiAhPSBudWxsICYmICFNb25pdG9yVUlQbHVnaW4ucGFyc2UoYikuZXF1YWxzKE1vbml0b3JVSVBsdWdpbi5wYXJzZShoZWFkZXIpKSkgewotCQkJCXJlc1JlcXVlc3Quc2V0UmVxdWVzdChoZWFkZXIsIFJlcXVlc3QuVFJBTlNQT1JUKTsKLQkJCX0KLQkJfQotCQlyZXFIZWFkZXIuc2V0UmVxdWVzdFJlc3BvbnNlKHJyKTsKLQkJcmVzcEhlYWRlci5zZXRSZXF1ZXN0UmVzcG9uc2UocnIpOwotCQlieXRlW10gYiA9IG51bGw7Ci0JCWlmIChyciAhPSBudWxsKQotCQkJYiA9IGZpbHRlcihyci5nZXRSZXF1ZXN0KFJlcXVlc3QuQ09OVEVOVCkpOwotCQlyZXFWaWV3ZXIuc2V0Q29udGVudChiKTsKLQkJYiA9IG51bGw7Ci0JCWlmIChyciAhPSBudWxsKQotCQkJYiA9IGZpbHRlcihyci5nZXRSZXNwb25zZShSZXF1ZXN0LkNPTlRFTlQpKTsKLQkJcmVzcFZpZXdlci5zZXRDb250ZW50KGIpOwotCQlyZXF1ZXN0ID0gcnI7Ci0JCQotCQkvLyBzZXQgdGhlIGVkaXRvciB0byBlZGl0YWJsZSBpZiB0aGUgcmVxdWVzdCBoYXNuJ3QgYmVlbiBzZW50IGFuZCB0aGUKLQkJLy8gZWRpdG9yIGNhbiBiZSBzZXQgYXMgZWRpdGFibGUKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCAmJiByZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQUxMKSA9PSBudWxsKSB7Ci0JCQlpZiAoZGlzcGxheUhlYWRlckluZikKLQkJCQlyZXFIZWFkZXIuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkKLQkJCXJlcVZpZXdlci5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkaXNwbGF5SGVhZGVySW5mKQotCQkJCXJlcUhlYWRlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQkKLQkJCXJlcVZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoSUNvbnRlbnRGaWx0ZXIgZmlsdGVyKSB7Ci0JCWZpbHRlcnMuYWRkKGZpbHRlcik7Ci0JCXNldFJlcXVlc3QocmVxdWVzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRmlsdGVyKElDb250ZW50RmlsdGVyIGZpbHRlcikgewotCQlmaWx0ZXJzLnJlbW92ZShmaWx0ZXIpOwotCQlzZXRSZXF1ZXN0KHJlcXVlc3QpOwotCX0KLQotCXByb3RlY3RlZCBieXRlW10gZmlsdGVyKGJ5dGVbXSBiKSB7Ci0JCWlmIChiID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmaWx0ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlDb250ZW50RmlsdGVyIGZpbHRlciA9IChJQ29udGVudEZpbHRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQliID0gZmlsdGVyLmZpbHRlcihyZXF1ZXN0LCBmYWxzZSwgYik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdoaWxlIGZpbHRlcmluZyB3aXRoICIgKyBmaWx0ZXIuZ2V0SWQoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGNwaXAubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI2dldFJlcXVlc3RWaWV3ZXJzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXF1ZXN0Vmlld2VycygpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB2aWV3ZXJzLml0ZXJhdG9yKCk7Ci0JCUxpc3Q8Vmlld2VyPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxWaWV3ZXI+KCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodmlld2VyLmlzUmVxdWVzdFZpZXdlcigpKQotCQkJCXRlbXAuYWRkKHZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGNwaXAubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI2dldFJlc3BvbnNlVmlld2VycygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzcG9uc2VWaWV3ZXJzKCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IHZpZXdlcnMuaXRlcmF0b3IoKTsKLQkJTGlzdDxWaWV3ZXI+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PFZpZXdlcj4oKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh2aWV3ZXIuaXNSZXNwb25zZVZpZXdlcigpKQotCQkJCXRlbXAuYWRkKHZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGNwaXAubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI3NldFJlcXVlc3RWaWV3ZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5lcXVhbHMocmVxdWVzdFZpZXdlcikpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBjYWxsIHNldCByZXF1ZXN0IHRvIHNhdmUgYW5kIHJlc2V0IHRoZSByZXF1ZXN0Ci0JCXNldFJlcXVlc3QocmVxdWVzdCk7Ci0JCXJlcVZpZXdlci5kaXNwb3NlKCk7Ci0JCQotCQlyZXF1ZXN0Vmlld2VyID0gdmlld2VyOwotCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQlyZXFWaWV3ZXIgPSB2aWV3ZXIuY3JlYXRlVmlld2VyKCk7Ci0JCWVsc2UKLQkJCXJlcVZpZXdlciA9IG51bGw7Ci0JCWlmIChyZXFWaWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXJlcVZpZXdlci5pbml0KHJlcUNvbXApOwotCQkvL3JlcVZpZXdlci5zZXRSZXF1ZXN0UmVzcG9uc2UocnIpOwotCQlieXRlW10gYiA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLQkJCWIgPSBmaWx0ZXIocmVxdWVzdC5nZXRSZXF1ZXN0KFJlcXVlc3QuQ09OVEVOVCkpOwotCQkJLy8gc2V0IHRoZSBlZGl0b3IgdG8gZWRpdGFibGUgaWYgdGhlIHJlcXVlc3QgaGFzbid0IGJlZW4gc2VudCBhbmQgdGhlCi0JCQkvLyBlZGl0b3IgY2FuIGJlIHNldCBhcyBlZGl0YWJsZQotCQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCAmJiByZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuVFJBTlNQT1JUKSA9PSBudWxsKSB7Ci0JCQkJcmVxVmlld2VyLnNldEVkaXRhYmxlKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXFWaWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJfQotCQl9Ci0JCXJlcVZpZXdlci5zZXRDb250ZW50KGIpOwotCQlyZXFDb21wLmxheW91dCh0cnVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50Y3BpcC5tb25pdG9yLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjc2V0UmVzcG9uc2VWaWV3ZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNwb25zZVZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIuZXF1YWxzKHJlc3BvbnNlVmlld2VyKSkKLQkJCXJldHVybjsKLQkJcmVzcFZpZXdlci5kaXNwb3NlKCk7Ci0JCQotCQlyZXNwb25zZVZpZXdlciA9IHZpZXdlcjsKLQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJcmVzcFZpZXdlciA9IHZpZXdlci5jcmVhdGVWaWV3ZXIoKTsKLQkJZWxzZQotCQkJcmVzcFZpZXdlciA9IG51bGw7Ci0JCWlmIChyZXNwVmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlyZXNwVmlld2VyLmluaXQocmVzcENvbXApOwotCQkvL3Jlc3BWaWV3ZXIuc2V0UmVxdWVzdFJlc3BvbnNlKHJyKTsKLQkJYnl0ZVtdIGIgPSBudWxsOwotCQlpZiAocmVxdWVzdCAhPSBudWxsKQotCQkJYiA9IGZpbHRlcihyZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQ09OVEVOVCkpOwotCQlyZXNwVmlld2VyLnNldENvbnRlbnQoYik7Ci0JCXJlc3BDb21wLmxheW91dCh0cnVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI2dldEN1cnJlbnRSZXF1ZXN0Vmlld2VyKCkKLQkgKi8KLQlwdWJsaWMgQ29udGVudFZpZXdlciBnZXRDdXJyZW50UmVxdWVzdFZpZXdlcigpIHsKLQkJcmV0dXJuIHJlcVZpZXdlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI2dldEN1cnJlbnRSZXF1ZXN0SGVhZGVyVmlld2VyKCkKLQkgKi8KLQlwdWJsaWMgSGVhZGVyVmlld2VyIGdldEN1cnJlbnRSZXF1ZXN0SGVhZGVyVmlld2VyKCkgewotCQlyZXR1cm4gcmVxSGVhZGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jyb3dzZXJWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvQnJvd3NlclZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjdhMzYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvQnJvd3NlclZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyOwotLyoqCi0gKiBBIGJyb3dzZXIgdmlld2VyLgotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlclZpZXdlciBleHRlbmRzIENvbnRlbnRWaWV3ZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBDUiA9ICdccic7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIExGID0gJ1xuJzsKLQotCXByb3RlY3RlZCBCcm93c2VyIGJyb3dzZXI7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGNvbnRlbnQ7Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNpbml0KENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHBhcmVudCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZExpc3RlbmVyKFNXVC5NZW51RGV0ZWN0LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjc2V0Q29udGVudChieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChieXRlW10gYikgewotCQljb250ZW50ID0gYjsKLQkJaWYgKGIgPT0gbnVsbCB8fCBiLmxlbmd0aCA9PSAwKSB7Ci0JCQlicm93c2VyLnNldFRleHQoTWVzc2FnZXMuaHRtbFZpZXdJbnZhbGlkKTsKLQkJfSBlbHNlIHsKLQkJCWIgPSBNb25pdG9yVUlQbHVnaW4udW56aXAoYik7Ci0JCQkKLQkJCWludCB0cmltRnJvbnQgPSAwOwotCQkJaW50IHRyaW1CYWNrID0gMDsKLQkJCWludCBsZW4gPSBiLmxlbmd0aCAtIDE7Ci0JCQl3aGlsZSAodHJpbUZyb250IDwgYi5sZW5ndGggJiYgKGJbdHJpbUZyb250XSA9PSBDUiB8fCBiW3RyaW1Gcm9udF0gPT0gTEYpKQotCQkJCXRyaW1Gcm9udCsrOwotCQkJd2hpbGUgKHRyaW1CYWNrIDwgYi5sZW5ndGggJiYgYi5sZW5ndGggPiAwICYmIChiW2xlbiAtIHRyaW1CYWNrXSA9PSBDUiB8fCBiW2xlbiAtIHRyaW1CYWNrXSA9PSBMRikpCi0JCQkJdHJpbUJhY2srKzsKLQkJCQotCQkJaWYgKHRyaW1Gcm9udCArIHRyaW1CYWNrID4gMCkgewotCQkJCWlmICh0cmltRnJvbnQgKyB0cmltQmFjayA+IGIubGVuZ3RoKSB7Ci0JCQkJCWIgPSBuZXcgYnl0ZVswXTsKLQkJCQl9IGVsc2UgewotCQkJCQlieXRlW10gdGVtcCA9IGI7Ci0JCQkJCWIgPSBuZXcgYnl0ZVt0ZW1wLmxlbmd0aCAtIHRyaW1CYWNrIC0gdHJpbUZyb250XTsKLQkJCQkJZm9yIChpbnQgaSA9IHRyaW1Gcm9udDsgaSA8IHRlbXAubGVuZ3RoIC0gdHJpbUJhY2s7IGkrKykgewotCQkJCQkJYltpIC0gdHJpbUZyb250XSA9IHRlbXBbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlicm93c2VyLnNldFRleHQobmV3IFN0cmluZyhiKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlicm93c2VyLmRpc3Bvc2UoKTsKLQkJYnJvd3NlciA9IG51bGw7Ci0JCWNvbnRlbnQgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvQnl0ZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9CeXRlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODJlN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9CeXRlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7Ci0vKioKLSAqIEEgYmFzaWMgYnl0ZSB2aWV3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBCeXRlVmlld2VyIGV4dGVuZHMgQ29udGVudFZpZXdlciB7Ci0JcHJvdGVjdGVkIFRleHQgdGV4dDsKLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2luaXQoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCURpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCXRleHQuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJdGV4dC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCkpOwotCQl0ZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGV4dCwgQ29udGV4dElkcy5WSUVXX1JFU1BPTlNFKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRFZGl0YWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJdGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRDb250ZW50KCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBieXRlWzBdOwotCQkKLQkJU3RyaW5nIGNvbnRlbnQgPSB0ZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCWlmIChjb250ZW50LmVxdWFscygiIikpCi0JCQlyZXR1cm4gbmV3IGJ5dGVbMF07Ci0JCQotCQkvLyBOZWVkIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGlzIGEgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50Ci0JCS8vIGdldEJ5dGVzKCkgcmVtb3ZlcyB0aGUgbmV3bGluZQotCQlieXRlW10gdHdvTmV3bGluZXMgPSBuZXcgYnl0ZVtdIHsgJ1wwMTUnLCAnXDAxMicgfTsKLQkJYnl0ZVtdIGNvbnRlbnRCeXRlcyA9IGNvbnRlbnQuZ2V0Qnl0ZXMoKTsKLQkJYnl0ZVtdIHJldEJ5dGVzID0gbmV3IGJ5dGVbY29udGVudEJ5dGVzLmxlbmd0aCArIDJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRCeXRlcywgMCwgcmV0Qnl0ZXMsIDAsIGNvbnRlbnRCeXRlcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHR3b05ld2xpbmVzLCAwLCByZXRCeXRlcywgY29udGVudEJ5dGVzLmxlbmd0aCwgMik7Ci0JCXJldHVybiByZXRCeXRlczsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRDb250ZW50KGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKSB7Ci0JCVN0cmluZyBvdXQgPSAiIjsKLQkJaWYgKGIgIT0gbnVsbCkgewotCQkJYiA9IE1vbml0b3JVSVBsdWdpbi51bnppcChiKTsKLQkJCW91dCA9IE1vbml0b3JVSVBsdWdpbi5wYXJzZShiKTsKLQkJfQotCQkKLQkJU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0JCWludCBscyA9IGxpbmVTZXBhcmF0b3IubGVuZ3RoKCk7Ci0JCWlmIChvdXQubGVuZ3RoKCkgPiBscykgewotCQkJd2hpbGUgKG91dC5zdWJzdHJpbmcoMCwgbHMpLmluZGV4T2YobGluZVNlcGFyYXRvcikgPj0gMCkKLQkJCQlvdXQgPSBvdXQuc3Vic3RyaW5nKGxzLCBvdXQubGVuZ3RoKCkpOyAKLQkJfQotCQkKLQkJdGV4dC5zZXRUZXh0KG91dCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGV4dC5kaXNwb3NlKCk7Ci0JCXRleHQgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvSGVhZGVyVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0hlYWRlclZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzRmNGNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvSGVhZGVyVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuY3VzdG9tLk1vbml0b3JTdGFja0xheW91dDsKLS8qKgotICogQW4gdHJhbnNwb3J0IChoZWFkZXIpIHZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIEhlYWRlclZpZXdlciB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzcGxheUhlYWRlcjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgaGVhZGVyQ29tcDsKLQlwcm90ZWN0ZWQgTW9uaXRvclN0YWNrTGF5b3V0IGxheW91dDsKLQotCXByb3RlY3RlZCBMYWJlbCBoZWFkZXJMYWJlbDsKLQlwcm90ZWN0ZWQgVGV4dCBoZWFkZXJUZXh0OwotCXByb3RlY3RlZCBSZXF1ZXN0IHJyOwotCXByb3RlY3RlZCBieXRlIG1zZzsKLQotCXByb3RlY3RlZCBib29sZWFuIGhpZGRlbjsKLQotCS8qKgotCSAqIFJlcXVlc3QgaGVhZGVyIGNvbnN0YW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBSRVFVRVNUX0hFQURFUiA9IDA7Ci0JCi0JLyoqCi0JICogUmVzcG9uc2UgaGVhZGVyIGNvbnN0YW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBSRVNQT05TRV9IRUFERVIgPSAxOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGhlYWRlciB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIEhlYWRlclZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBieXRlIG1lc3NhZ2UpIHsKLQkJZGlzcGxheUhlYWRlciA9IHRydWU7Ci0JCWhpZGRlbiA9IGZhbHNlOwotCQkKLQkJaGVhZGVyQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBNb25pdG9yU3RhY2tMYXlvdXQoKTsKLQkJaGVhZGVyQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWhlYWRlclRleHQgPSBuZXcgVGV4dChoZWFkZXJDb21wLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCURpc3BsYXkgZGlzcGxheSA9IGhlYWRlckNvbXAuZ2V0RGlzcGxheSgpOwotCQloZWFkZXJUZXh0LnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCWhlYWRlclRleHQuc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpKTsKLQkJaGVhZGVyVGV4dC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldFRleHRGb250KCkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGhlYWRlclRleHQsIENvbnRleHRJZHMuVklFV19SRVNQT05TRSk7Ci0JCQotCQloZWFkZXJMYWJlbCA9IG5ldyBMYWJlbChoZWFkZXJDb21wLCBTV1QuTk9ORSk7Ci0JCQotCQlsYXlvdXQudG9wQ29udHJvbCA9IGhlYWRlclRleHQ7Ci0JCQotCQlyciA9IG51bGw7Ci0JCW1zZyA9IG1lc3NhZ2U7Ci0KLQkJc2V0RGlzcGxheUhlYWRlcihmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0UmVzcG9uc2UoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJyID0gcmVxdWVzdDsKLQkJaWYgKCFoaWRkZW4pCi0JCQlnZXRWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5SGVhZGVyKGJvb2xlYW4gYikgewotCQlpZiAoZGlzcGxheUhlYWRlciAhPSBiKSB7Ci0JCQlkaXNwbGF5SGVhZGVyID0gYjsKLQkJCQotCQkJaWYgKGRpc3BsYXlIZWFkZXIpCi0JCQkJbGF5b3V0LnRvcENvbnRyb2wgPSBoZWFkZXJUZXh0OwotCQkJZWxzZQotCQkJCWxheW91dC50b3BDb250cm9sID0gaGVhZGVyTGFiZWw7Ci0JCQkKLQkJCWhlYWRlckNvbXAubGF5b3V0KHRydWUpOwotCQkJZ2V0VmlldygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFZpZXcoKSB7Ci0JCVN0cmluZyBvdXQgPSAiIjsKLQkJaWYgKHJyICE9IG51bGwpIHsKLQkJCWlmIChtc2cgPT0gUkVRVUVTVF9IRUFERVIpIHsKLQkJCQlieXRlW10gYiA9IHJyLmdldFJlcXVlc3QoUmVxdWVzdC5UUkFOU1BPUlQpOwotCQkJCWlmIChiICE9IG51bGwpCi0JCQkJCW91dCA9IE1vbml0b3JVSVBsdWdpbi5wYXJzZShiKTsKLQkJCX0gZWxzZSBpZiAobXNnID09IFJFU1BPTlNFX0hFQURFUikgewotCQkJCWJ5dGVbXSBiID0gcnIuZ2V0UmVzcG9uc2UoUmVxdWVzdC5UUkFOU1BPUlQpOwotCQkJCWlmIChiICE9IG51bGwpCi0JCQkJCW91dCA9IE1vbml0b3JVSVBsdWdpbi5wYXJzZShiKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGRpc3BsYXlIZWFkZXIpCi0JCQloZWFkZXJUZXh0LnNldFRleHQob3V0KTsKLQkJZWxzZSB7Ci0JCQlTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQkJCWludCBpbmRleCA9IG91dC5pbmRleE9mKGxpbmVTZXBhcmF0b3IpOwotCQkJaWYgKGluZGV4ID4gMCkKLQkJCQloZWFkZXJMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLmhlYWRlckxhYmVsLCBvdXQuc3Vic3RyaW5nKDAsIGluZGV4KSkpOwotCQkJZWxzZSAKLQkJCQloZWFkZXJMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLmhlYWRlckxhYmVsLCBvdXQpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UgdGhlIGhlYWRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQloZWFkZXJDb21wLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgd2hldGhlciB0aGUgaGVhZGVyIGNhbiBiZSBlZGl0ZWQuCi0JICogCi0JICogQHBhcmFtIGVkaXRhYmxlIElmIHRydWUgdGhlIGhlYWRlciBjYW4gYmUgZWRpdGVkLCBvdGhlcndpc2UgdGhlIGhlYWRlciBjYW5ub3QgYmUgZWRpdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJaGVhZGVyVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjb250ZW50IGZyb20gdGhlIGhlYWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb250ZW50IGZyb20gdGhlIGhlYWRlci4KLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldENvbnRlbnQoKSB7Ci0JCWlmIChoZWFkZXJUZXh0ID09IG51bGwgfHwgaGVhZGVyVGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVN0cmluZyBoZWFkZXIgPSBoZWFkZXJUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCS8vIE5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGZvbGxvd2luZyA0IGJ5dGVzIGVuZCB0aGUgaGVhZGVyLiBUaGUgZ2V0Qnl0ZXMoKQotCQkvLyBtZXRob2QgcmVtb3ZlcyBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotCQlieXRlW10gdHdvTmV3bGluZXMgPSBuZXcgYnl0ZVtdIHsgJ1wwMTUnLCAnXDAxMicsICdcMDE1JywgJ1wwMTInIH07Ci0JCWJ5dGVbXSBoZWFkZXJCeXRlcyA9IGhlYWRlci5nZXRCeXRlcygpOwotCQlieXRlW10gcmV0Qnl0ZXMgPSBuZXcgYnl0ZVtoZWFkZXJCeXRlcy5sZW5ndGggKyA0XTsKLQkJU3lzdGVtLmFycmF5Y29weShoZWFkZXJCeXRlcywgMCwgcmV0Qnl0ZXMsIDAsIGhlYWRlckJ5dGVzLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkodHdvTmV3bGluZXMsIDAsIHJldEJ5dGVzLCBoZWFkZXJCeXRlcy5sZW5ndGgsIDQpOwotCQlyZXR1cm4gcmV0Qnl0ZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvSW1hZ2VWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvSW1hZ2VWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkNGRiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0ltYWdlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlcjsKLS8qKgotICogQW4gaW1hZ2Ugdmlld2VyLgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VWaWV3ZXIgZXh0ZW5kcyBDb250ZW50Vmlld2VyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgQ1IgPSAnXHInOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBMRiA9ICdcbic7Ci0KLQlwcm90ZWN0ZWQgU2Nyb2xsZWRDb21wb3NpdGUgc2Nyb2xsOwotCXByb3RlY3RlZCBMYWJlbCBtZXNzYWdlTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGNvbnRlbnQ7Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNpbml0KENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2Nyb2xsID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKHNjcm9sbCwgU1dULk5PTkUpOwotCQltZXNzYWdlTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5pbWFnZVZpZXdJbnZhbGlkKTsKLQkJbWVzc2FnZUxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRTaXplKG1lc3NhZ2VMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQkJc2Nyb2xsLnNldENvbnRlbnQobWVzc2FnZUxhYmVsKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRDb250ZW50KGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKSB7Ci0JCWNvbnRlbnQgPSBiOwotCQlpZiAoYiA9PSBudWxsIHx8IGIubGVuZ3RoID09IDApIHsKLQkJCW1lc3NhZ2VMYWJlbC5zZXRJbWFnZShudWxsKTsKLQkJfSBlbHNlIHsKLQkJCWIgPSBNb25pdG9yVUlQbHVnaW4udW56aXAoYik7Ci0JCQkKLQkJCWludCB0cmltRnJvbnQgPSAwOwotCQkJaW50IHRyaW1CYWNrID0gMDsKLQkJCWludCBsZW4gPSBiLmxlbmd0aCAtIDE7Ci0JCQl3aGlsZSAodHJpbUZyb250IDwgYi5sZW5ndGggJiYgYlt0cmltRnJvbnRdID09IENSIHx8IGJbdHJpbUZyb250XSA9PSBMRikKLQkJCQl0cmltRnJvbnQrKzsKLQkJCXdoaWxlICh0cmltQmFjayA8IGIubGVuZ3RoICYmIGJbbGVuIC0gdHJpbUJhY2tdID09IENSIHx8IGJbbGVuIC0gdHJpbUJhY2tdID09IExGKQotCQkJCXRyaW1CYWNrKys7Ci0JCQkKLQkJCWlmICh0cmltRnJvbnQgKyB0cmltQmFjayA+IDApIHsKLQkJCQlpZiAodHJpbUZyb250ICsgdHJpbUJhY2sgPiBiLmxlbmd0aCkgewotCQkJCQliID0gbmV3IGJ5dGVbMF07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnl0ZVtdIHRlbXAgPSBiOwotCQkJCQliID0gbmV3IGJ5dGVbdGVtcC5sZW5ndGggLSB0cmltQmFjayAtIHRyaW1Gcm9udF07Ci0JCQkJCWZvciAoaW50IGkgPSB0cmltRnJvbnQ7IGkgPCB0ZW1wLmxlbmd0aCAtIHRyaW1CYWNrOyBpKyspIHsKLQkJCQkJCWJbaSAtIHRyaW1Gcm9udF0gPSB0ZW1wW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCUltYWdlRGF0YSBpbWdEID0gbmV3IEltYWdlRGF0YShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYikpOwotCQkJCUltYWdlIGltZyA9IG5ldyBJbWFnZShudWxsLCBpbWdEKTsKLQkJCQltZXNzYWdlTGFiZWwuc2V0SW1hZ2UoaW1nKTsKLQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQltZXNzYWdlTGFiZWwuc2V0SW1hZ2UobnVsbCk7Ci0JCQkJbWVzc2FnZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuaW1hZ2VWaWV3SW52YWxpZCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCW1lc3NhZ2VMYWJlbC5zZXRTaXplKG1lc3NhZ2VMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzY3JvbGwuZGlzcG9zZSgpOwotCQlzY3JvbGwgPSBudWxsOwotCQltZXNzYWdlTGFiZWwgPSBudWxsOwotCQljb250ZW50ID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL1hNTFZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9YTUxWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyOWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL1hNTFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgMjAwNS0xMS0yNSBBcnRodXIgUnltYW4sIHJ5bWFuQGNhLmlibS5jb20KLSAqICAgICAtIGZpeGVkIGJ1ZyAxMTgxMDI6IHNldCB4bWxUYWdNaXNzaW5nIGNvcnJlY3RseSBlYWNoIHRpbWUgc2V0Q29udGVudCgpIGlzIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7Ci0gCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLS8qKgotICogWE1MIFZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIFhNTFZpZXdlciBleHRlbmRzIENvbnRlbnRWaWV3ZXIgewotCXByb3RlY3RlZCBDb21wb3NpdGUgdmlld2VyQ29tcDsKLQlwcm90ZWN0ZWQgU3RhY2tMYXlvdXQgbGF5b3V0OwotCXByb3RlY3RlZCBUZXh0IG1lc3NhZ2VUZXh0OwotCXByb3RlY3RlZCBMYWJlbCBtZXNzYWdlTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB4bWxUYWdNaXNzaW5nID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0RW5jb2RpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaXNzaW5nRW5jb2RpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9yaWdpbmFsRW5jb2Rpbmc7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGNvbnRlbnQ7Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRDb250ZW50KGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKSB7Ci0JCWNvbnRlbnQgPSBiOwotCQlTdHJpbmcgb3V0ID0gIiI7CQotCQlpZiAoYiAhPSBudWxsKSB7Ci0JCQliID0gTW9uaXRvclVJUGx1Z2luLnVuemlwKGIpOwotCQkJb3V0ID0gTW9uaXRvclVJUGx1Z2luLnBhcnNlKGIpOwotCQl9Ci0JCQotCQlTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQkJaW50IGxzID0gbGluZVNlcGFyYXRvci5sZW5ndGgoKTsKLQkJaWYgKG91dC5sZW5ndGgoKSA+IGxzKSB7Ci0JCQl3aGlsZSAob3V0LnN1YnN0cmluZygwLCBscykuaW5kZXhPZihsaW5lU2VwYXJhdG9yKSA+PSAwKQotCQkJb3V0ID0gb3V0LnN1YnN0cmluZyhscywgb3V0Lmxlbmd0aCgpKTsKLQkJfQotCQkKLQkJU3RyaW5nIG91dF90ZW1wID0gb3V0LnRvTG93ZXJDYXNlKCk7Ci0JCXhtbFRhZ01pc3NpbmcgPSAhb3V0X3RlbXAuc3RhcnRzV2l0aCgiPD94bWwiKTsKLQkJCi0JCWlmIChvdXQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgZmluYWxNc2cgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlieXRlW10gYjEgPSBjcmVhdGVEb2N1bWVudChvdXQpOwotCQkJCWZpbmFsTXNnID0gbmV3IFN0cmluZyhiMSkudHJpbSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjYXNlOiBlcnJvciBwYXJzaW5nCi0JCQkJbWVzc2FnZVRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJbGF5b3V0LnRvcENvbnRyb2wgPSBtZXNzYWdlTGFiZWw7Ci0JCQkJbWVzc2FnZUxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJbWVzc2FnZUxhYmVsLnNldFRleHQoTWVzc2FnZXMueG1sVmlld0ludmFsaWQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmICh4bWxUYWdNaXNzaW5nICYmIGZpbmFsTXNnLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIj8+IikpIHsKLQkJCQlpbnQgeCA9IGZpbmFsTXNnLmluZGV4T2YoIlxuIikgKyAxOwotCQkJCVN0cmluZyBNc2cgPSBmaW5hbE1zZy5zdWJzdHJpbmcoeCk7Ci0JCQkJZmluYWxNc2cgPSBNc2c7Ci0JCQkJCi0JCQkJbWVzc2FnZVRleHQuc2V0VGV4dChmaW5hbE1zZyk7Ci0JCQl9IGVsc2UgaWYgKHNldEVuY29kaW5nKSB7Ci0JCQkJLy8gY2hhbmdlIGJhY2sgdG8gb3JpZ2luYWwgZW5jb2RpbmcKLQkJCQlpbnQgYmVnaW4gPSBmaW5hbE1zZy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInV0Zi04Iik7IC8vIGxvY2F0aW9uIG9mIG9wZW5pbmcgIgotCQkJCWlmIChiZWdpbiA+PSAwKSB7Ci0JCQkJCWludCBsYXN0ID0gYmVnaW4gKyA1OyAgLy8gbG9jYXRpb24gb2YgY2xvc2luZyAiCi0JCQkJCVN0cmluZyBmaXJzdF9oYWxmID0gZmluYWxNc2cuc3Vic3RyaW5nKDAsYmVnaW4pOwotCQkJCQlTdHJpbmcgc2Vjb25kX2hhbGYgPSBmaW5hbE1zZy5zdWJzdHJpbmcobGFzdCk7Ci0JCQkJCWZpbmFsTXNnID0gZmlyc3RfaGFsZiArIG9yaWdpbmFsRW5jb2RpbmcgKyBzZWNvbmRfaGFsZjsKLQkJCQl9Ci0JCQkJCi0JCQkJbWVzc2FnZVRleHQuc2V0VGV4dChmaW5hbE1zZyk7Ci0JCQl9IGVsc2UgaWYgKG1pc3NpbmdFbmNvZGluZykgewotCQkJCS8vIHJlbW92ZSBlbmNvZGluZyBjb21wbGV0ZWx5Ci0JCQkJaW50IGJlZ2luID0gZmluYWxNc2cudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbmNvZGluZz1cInV0Zi04XCIiKTsgLy9sb2NhdGlvbiBvZiBvcGVuaW5nICIKLQkJCQlpbnQgbGFzdCA9IGJlZ2luICsgMTY7ICAvL2xvY2F0aW9uIG9mIGNsb3NpbmcgIgotCQkJCVN0cmluZyBmaXJzdF9oYWxmID0gZmluYWxNc2cuc3Vic3RyaW5nKDAsYmVnaW4pOwotCQkJCVN0cmluZyBzZWNvbmRfaGFsZiA9IGZpbmFsTXNnLnN1YnN0cmluZyhsYXN0KTsKLQkJCQlmaW5hbE1zZyA9IGZpcnN0X2hhbGYgKyBzZWNvbmRfaGFsZjsKLQkJCQkKLQkJCQltZXNzYWdlVGV4dC5zZXRUZXh0KGZpbmFsTXNnKTsJCi0JCQl9IGVsc2UKLQkJCQltZXNzYWdlVGV4dC5zZXRUZXh0KGZpbmFsTXNnKTsKLQkJfSBlbHNlCi0JCQltZXNzYWdlVGV4dC5zZXRUZXh0KG91dCk7Ci0JCQotCQltZXNzYWdlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWxheW91dC50b3BDb250cm9sID0gbWVzc2FnZVRleHQ7Ci0JCW1lc3NhZ2VUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2dldENvbnRlbnQoKQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjaW5pdChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXZpZXdlckNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXZpZXdlckNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQltZXNzYWdlVGV4dCA9IG5ldyBUZXh0KHZpZXdlckNvbXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJRGlzcGxheSBkaXNwbGF5ID0gdmlld2VyQ29tcC5nZXREaXNwbGF5KCk7Ci0JCW1lc3NhZ2VUZXh0LnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCW1lc3NhZ2VUZXh0LnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7Ci0JCW1lc3NhZ2VUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7Ci0JCW1lc3NhZ2VUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWVzc2FnZVRleHQsIENvbnRleHRJZHMuVklFV19SRVNQT05TRSk7Ci0JCQotCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwodmlld2VyQ29tcCwgU1dULk5PTkUpOwotCQltZXNzYWdlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQotCQlsYXlvdXQudG9wQ29udHJvbCA9IG1lc3NhZ2VUZXh0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAI2NyZWF0ZURvY3VtZW50KFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIGNyZWF0ZURvY3VtZW50KFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7CQotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJdHJ5IHsKLQkJCQlmYWN0b3J5LnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2FsbG93LWphdmEtZW5jb2RpbmdzIiwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCWZhY3Rvcnkuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQkKLQkJCWlmICh4bWxUYWdNaXNzaW5nKSB7Ci0JCQkJc3RyID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIgKyBzdHI7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyBzdHJfdGVtcCA9IHN0ci50b0xvd2VyQ2FzZSgpOwotCQkJCQotCQkJCS8vIGlmIGVuY29kaW5nIHByZXNlbnQsIHRoZW4gc2F2ZSBvcmlnaW5hbCBlbmNvZGluZyBhbmQgY2hhbmdlIHRvIFVURi04Ci0JCQkJaW50IGluZCA9IHN0cl90ZW1wLmluZGV4T2YoImVuY29kaW5nPSIpOwotCQkJCWlmIChpbmQgPj0gMCkgewotCQkJCQlTdHJpbmcgdGVtcDEgPSBzdHIuc3Vic3RyaW5nKGluZCk7Ci0JCQkJCWludCBiZWdpbkluZGV4ID0gdGVtcDEuaW5kZXhPZigiXCIiKSArIDE7Ci0JCQkJCVN0cmluZyB0ZW1wMiA9IHRlbXAxLnN1YnN0cmluZyhiZWdpbkluZGV4KTsKLQkJCQkJaW50IGVuZEluZGV4ID0gdGVtcDIuaW5kZXhPZigiXCIiKTsKLQkJCQkJb3JpZ2luYWxFbmNvZGluZyA9IHRlbXAyLnN1YnN0cmluZygwLCBlbmRJbmRleCk7Ci0JCQkJCWlmICghInV0Zi04Ii5lcXVhbHMob3JpZ2luYWxFbmNvZGluZykpCi0JCQkJCQlzZXRFbmNvZGluZyA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChpbmQgPCAwKSB7IC8vaWYgbm8gZW5jb2RpbmcgYXQgYWxsLHRoZW4gbm8gY2hhbmdlcyB0byBiZSBtYWRlCi0JCQkJCXNldEVuY29kaW5nID0gZmFsc2U7Ci0JCQkJCW1pc3NpbmdFbmNvZGluZyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJYnl0ZVtdIHBhcnNlQXJyYXkgPSBzdHIuZ2V0Qnl0ZXMoKTsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocGFyc2VBcnJheSkpKTsKLQkJCXJldHVybiBnZXRDb250ZW50cyhkb2N1bWVudCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkludmFsaWQgWE1MIik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGdldENvbnRlbnRzKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvdXQpOwotCQlTb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2N1bWVudCk7Ci0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lckZhY3RvcnkgdGYgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCXRyeSB7Ci0JCQkJdGYuc2V0QXR0cmlidXRlKCJpbmRlbnQtbnVtYmVyIiwgbmV3IEludGVnZXIoMikpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCS8vIGlnbm9yZSAtIGZhaWxzIG9uIEpESyAxLjQKLQkJCX0KLQkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdGYubmV3VHJhbnNmb3JtZXIoKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0JCX0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotCQl9Ci0JCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl2aWV3ZXJDb21wLmRpc3Bvc2UoKTsKLQkJdmlld2VyQ29tcCA9IG51bGw7Ci0JCWNvbnRlbnQgPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0ODU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9VENQL0lQIE1vbml0b3IKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1leHRlbnNpb25Qb2ludFZpZXdlcnM9Vmlld2VycwotCi12aWV3VGl0bGU9VENQL0lQIE1vbml0b3IKLWFjdGlvblJlc2VuZD1SZXNlbmQgcmVxdWVzdAotYWN0aW9uTW9kaWZ5PU1vZGlmeSByZXF1ZXN0Ci1hY3Rpb25Nb2RpZnlSZXNlbmQ9U2VuZCBNb2RpZmllZCBSZXF1ZXN0Ci0KLWJ5dGVWaWV3PUJ5dGUKLWltYWdlVmlldz1JbWFnZQoteG1sVmlldz1YTUwKLWJyb3dzZXJWaWV3PVdlYiBCcm93c2VyCi0KLXByZWZlcmVuY2VUaXRsZT1UQ1AvSVAgTW9uaXRvcgotcHJlZmVyZW5jZUtleXdvcmRzPWRlYnVnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODM2MTBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IiVleHRlbnNpb25Qb2ludFZpZXdlcnMiIGlkPSJ2aWV3ZXJzIiBzY2hlbWE9InNjaGVtYS92aWV3ZXJzLmV4c2QiLz4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbFN0YXJ0dXAiPgotICA8c3RhcnR1cAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuU3RhcnR1cCIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4gCi0gIDx2aWV3Ci0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXciCi0gICAgbmFtZT0iJXZpZXdUaXRsZSIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZGVidWcudWkiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuTW9uaXRvclZpZXciCi0gICAgaWNvbj0iaWNvbnMvY3ZpZXcxNi9tb25pdG9yVmlldy5naWYiPgotICA8L3ZpZXc+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgPHBhZ2UKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IucHJlZmVyZW5jZVBhZ2UiCi0gICAgbmFtZT0iJXByZWZlcmVuY2VUaXRsZSIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQcmVmZXJlbmNlUGFnZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5wcmVmZXJlbmNlS2V5d29yZHMiLz4KLSAgPC9wYWdlPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLSAgPGtleXdvcmQKLSAgICBsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3JkcyIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IucHJlZmVyZW5jZUtleXdvcmRzIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkudmlld2VycyI+Ci0gIDx2aWV3ZXIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5ieXRlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkJ5dGVWaWV3ZXIiCi0gICAgdHlwZT0icmVxdWVzdHJlc3BvbnNlIgotICAgIGxhYmVsPSIlYnl0ZVZpZXciLz4KLSAgPHZpZXdlcgotICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLmltYWdlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkltYWdlVmlld2VyIgotICAgIHR5cGU9InJlcXVlc3RyZXNwb25zZSIKLSAgICBsYWJlbD0iJWltYWdlVmlldyIvPgotICA8dmlld2VyCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXdlcnMueG1sIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLlhNTFZpZXdlciIKLSAgICB0eXBlPSJyZXF1ZXN0cmVzcG9uc2UiCi0gICAgbGFiZWw9IiV4bWxWaWV3Ii8+Ci0gIDx2aWV3ZXIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5icm93c2VyIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkJyb3dzZXJWaWV3ZXIiCi0gICAgdHlwZT0icmVxdWVzdHJlc3BvbnNlIgotICAgIGxhYmVsPSIlYnJvd3NlclZpZXciLz4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICA8ZmFjdG9yeQotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5SZXF1ZXN0QWRhcHRlckZhY3RvcnkiCi0gICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0Ij4KLSAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyIi8+Ci0gIDwvZmFjdG9yeT4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdCIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkubW9kaWZ5YWN0aW9uIj4KLSAgICAgICA8ZmlsdGVyIG5hbWU9InJlcXVlc3RzZW50IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvblJlc2VuZCIKLSAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LlJlc2VuZE1lc3NhZ2VBY3Rpb24iCi0gICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5SZXNlbmRNZXNzYWdlQWN0aW9uIgotICAgICAgICAgICAgIGljb249Imljb25zL2VsY2wxNi9yZXNlbmRSZXF1ZXN0LmdpZiI+Ci0gICAgICAgPC9hY3Rpb24+Ci0gICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uTW9kaWZ5IgotICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuTW9kaWZ5TWVzc2FnZUFjdGlvbiIKLSAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3Lk1vZGlmeU1lc3NhZ2VBY3Rpb24iCi0gICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXRvb2wxNi9lZGl0UmVxdWVzdC5naWYiPgotICAgICAgIDwvYWN0aW9uPgotICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0IgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5zZW5kbW9kaWZ5YWN0aW9uIj4KLSAgICAgICA8ZmlsdGVyIG5hbWU9InJlcXVlc3RzZW50IiB2YWx1ZT0iZmFsc2UiLz4gICAgCi0gICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uTW9kaWZ5UmVzZW5kIgotICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuU2VuZE1vZGlmaWVkTWVzc2FnZUFjdGlvbiIKLSAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LlNlbmRNb2RpZmllZE1lc3NhZ2VBY3Rpb24iCi0gICAgICAgICAgICAgaWNvbj0iaWNvbnMvZWxjbDE2L3Jlc2VuZFJlcXVlc3QuZ2lmIj4KLSAgICAgICA8L2FjdGlvbj4KLSAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3NjaGVtYS92aWV3ZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3NjaGVtYS92aWV3ZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNzYzNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9zY2hlbWEvdmlld2Vycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIiBpZD0idmlld2VycyIgbmFtZT0iQ29udGVudCBWaWV3ZXJzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIHZpZXdlciBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIGNvbnRlbnQuIChlLmcuIGEgdmlld2VyIGZvciBhIHBhcnRpY3VsYXIgaW1hZ2UgZm9ybWF0KQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlld2VyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJ2aWV3ZXIiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyJmx0Oy9zYW1wJmd0Oy4gVmlld2VycyBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgY29udGVudCB2aWV3ZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBbaXNzdWU6IHdoYXQgaXMgdGhpcyB1c2VkIGZvcj9dDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjb250ZW50IHZpZXdlciBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIA0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLnZpZXdlcnMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3ZpZXdlcg0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLmJ5dGV2aWV3ZXImcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5CeXRlQ29udGVudFZpZXdlciZxdW90Ow0KLSAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVxdWVzdHJlc3BvbnNlJnF1b3Q7DQotICAgICAgICAgICAgbGFiZWw9JnF1b3Q7JWJ5dGVWaWV3JnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgYWJzdHJhY3QgY2xhc3MgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlciZsdDsvY29kZSZndDsuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMWRhZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic2VydmVyY29yZS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDY4MTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotc2VydmVyY29yZS5qYXIKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZV8zLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTJhMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9kZWJ1Zz10cnVlCi0KLSMgVHJhY2tpbmcgb2Ygc2VydmVyIHJlc291cmNlcwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3Jlc291cmNlcz1mYWxzZQotCi0jIExvYWRpbmcgb2YgZXh0ZW5zaW9uIHBvaW50cwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2V4dGVuc2lvbl9wb2ludD1mYWxzZQotCi0jIFNlcnZlciBsaXN0ZW5lcnMKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9saXN0ZW5lcnM9ZmFsc2UKLQotIyBQZXJmb3JtYW5jZSBvZiBsb2FkaW5nIGFuZCBjYWxsaW5nIGRlbGVnYXRlcwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3BlcmZvcm1hbmNlPWZhbHNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjFlN2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZTQzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgTm92IDEwIDE3OjExOjM1IEhTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyMDg1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0jVGh1IFNlcCAxMyAxNToyNTowNiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoLCoudGVzdHN1aXRlLCouZGVwbG95LCoubG9jYXRpb24sKi5leGVjdXRpb24sKi5kYXRhcG9vbCwqLmFydGlmYWN0LCouaHRtbCwqLnN2Zwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjYzFkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIEZlYiAyMyAyMToxMTo1MiBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE2MGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0NzJlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbCwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmUzMmI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvCi1zb3VyY2UuLiA9IHNlcnZlcmNvcmUvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTY2ODBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1TZXJ2ZXIgQ29yZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLWV4dGVuc2lvblBvaW50U2VydmVyU3RhcnR1cD1TZXJ2ZXIgU3RhcnR1cAotZXh0ZW5zaW9uUG9pbnRNb2R1bGVUeXBlcz1Nb2R1bGUgVHlwZXMKLWV4dGVuc2lvblBvaW50UnVudGltZVR5cGVzPVJ1bnRpbWUgVHlwZXMKLWV4dGVuc2lvblBvaW50UnVudGltZVRhcmdldEhhbmRsZXJzPVJ1bnRpbWUgVGFyZ2V0IEhhbmRsZXJzCi1leHRlbnNpb25Qb2ludFJ1bnRpbWVMb2NhdG9ycz1SdW50aW1lIExvY2F0b3JzCi1leHRlbnNpb25Qb2ludFNlcnZlclR5cGVzPVNlcnZlciBUeXBlcwotZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJMb2NhdG9ycz1TZXJ2ZXIgTG9jYXRvcnMKLWV4dGVuc2lvblBvaW50TW9kdWxlRmFjdG9yaWVzPU1vZHVsZSBGYWN0b3JpZXMKLWV4dGVuc2lvblBvaW50TW9kdWxlQXJ0aWZhY3RBZGFwdGVycz1Nb2R1bGUgQXJ0aWZhY3QgQWRhcHRlcnMKLWV4dGVuc2lvblBvaW50TGF1bmNoYWJsZUFkYXB0ZXJzPUxhdW5jaGFibGUgQWRhcHRlcnMKLWV4dGVuc2lvblBvaW50Q2xpZW50cz1DbGllbnRzCi1leHRlbnNpb25Qb2ludFB1Ymxpc2hUYXNrcz1QdWJsaXNoIFRhc2tzCi1leHRlbnNpb25Qb2ludFB1Ymxpc2hlcnM9UHVibGlzaGVycwotZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJNb25pdG9ycz1TZXJ2ZXIgTW9uaXRvcnMKLWV4dGVuc2lvblBvaW50SW5zdGFsbGFibGVTZXJ2ZXJzPUluc3RhbGxhYmxlIFNlcnZlcnMKLWV4dGVuc2lvblBvaW50SW5zdGFsbGFibGVSdW50aW1lcz1JbnN0YWxsYWJsZSBSdW50aW1lcwotCi1leHRlbnNpb25Qb2ludFJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVycz1SdW50aW1lIEZhY2V0IENvbXBvbmVudCBQcm92aWRlcnMKLQotbW9kdWxlVHlwZVVua25vd249VW5rbm93biBtb2R1bGUKLW1vZHVsZVR5cGVTdGF0aWNXZWJOYW1lPVN0YXRpYyBXZWIgcHJvamVjdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNjkyNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1vZHVsZVR5cGVzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRNb2R1bGVUeXBlcyIgc2NoZW1hPSJzY2hlbWEvbW9kdWxlVHlwZXMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJydW50aW1lVHlwZXMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFJ1bnRpbWVUeXBlcyIgc2NoZW1hPSJzY2hlbWEvcnVudGltZVR5cGVzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0icnVudGltZVRhcmdldEhhbmRsZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRSdW50aW1lVGFyZ2V0SGFuZGxlcnMiIHNjaGVtYT0ic2NoZW1hL3J1bnRpbWVUYXJnZXRIYW5kbGVycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9InJ1bnRpbWVMb2NhdG9ycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50UnVudGltZUxvY2F0b3JzIiBzY2hlbWE9InNjaGVtYS9ydW50aW1lTG9jYXRvcnMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZXJ2ZXJUeXBlcyIgbmFtZT0iJWV4dGVuc2lvblBvaW50U2VydmVyVHlwZXMiIHNjaGVtYT0ic2NoZW1hL3NlcnZlclR5cGVzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VydmVyTG9jYXRvcnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlckxvY2F0b3JzIiBzY2hlbWE9InNjaGVtYS9zZXJ2ZXJMb2NhdG9ycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1vZHVsZUZhY3RvcmllcyIgbmFtZT0iJWV4dGVuc2lvblBvaW50TW9kdWxlRmFjdG9yaWVzIiBzY2hlbWE9InNjaGVtYS9tb2R1bGVGYWN0b3JpZXMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRNb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIiBzY2hlbWE9InNjaGVtYS9tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibGF1bmNoYWJsZUFkYXB0ZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRMYXVuY2hhYmxlQWRhcHRlcnMiIHNjaGVtYT0ic2NoZW1hL2xhdW5jaGFibGVBZGFwdGVycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNsaWVudHMiIG5hbWU9IiVleHRlbnNpb25Qb2ludENsaWVudHMiIHNjaGVtYT0ic2NoZW1hL2NsaWVudHMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwdWJsaXNoVGFza3MiIG5hbWU9IiVleHRlbnNpb25Qb2ludFB1Ymxpc2hUYXNrcyIgc2NoZW1hPSJzY2hlbWEvcHVibGlzaFRhc2tzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0icHVibGlzaGVycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50UHVibGlzaGVycyIgc2NoZW1hPSJzY2hlbWEvcHVibGlzaGVycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImludGVybmFsU2VydmVyTW9uaXRvcnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlck1vbml0b3JzIiBzY2hlbWE9InNjaGVtYS9zZXJ2ZXJNb25pdG9ycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImludGVybmFsU3RhcnR1cCIgbmFtZT0iJWV4dGVuc2lvblBvaW50U2VydmVyU3RhcnR1cCIgc2NoZW1hPSJzY2hlbWEvc3RhcnR1cC5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9Imluc3RhbGxhYmxlU2VydmVycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50SW5zdGFsbGFibGVTZXJ2ZXJzIiBzY2hlbWE9InNjaGVtYS9pbnN0YWxsYWJsZVNlcnZlcnMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbnN0YWxsYWJsZVJ1bnRpbWVzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRJbnN0YWxsYWJsZVJ1bnRpbWVzIiBzY2hlbWE9InNjaGVtYS9pbnN0YWxsYWJsZVJ1bnRpbWVzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0icnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRSdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlcnMiIHNjaGVtYT0ic2NoZW1hL3J1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVycy5leHNkIi8+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZVR5cGVzIj4KLSAgICA8bW9kdWxlVHlwZQotICAgICAgIGlkPSIqIgotICAgICAgIG5hbWU9IiVtb2R1bGVUeXBlVW5rbm93biIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9IndzdC53ZWIiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVTdGF0aWNXZWJOYW1lIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVCcmlkZ2VzIj4KLSAgICA8YnJpZGdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmRlZmF1bHQiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLmZhY2V0cy5SdW50aW1lQnJpZGdlIi8+Ci0gIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2NsaWVudHMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9jbGllbnRzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZWFkZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2NsaWVudHMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJjbGllbnRzIiBuYW1lPSJDbGllbnRzIi8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGxhdW5jaCBhIGNsaWVudCBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgcnVuIG9uIGEgc2VydmVyLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2xpZW50IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJjbGllbnQiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCi0gICAgICAgICA8L2FwcGluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZCAmbHQ7c2FtcCZndDtDbGllbnREZWxlZ2F0ZSZsdDsvc2FtcCZndDsuDQotQ2xpZWludCBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgdG8gbGF1bmNoLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwaW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkNsaWVudERlbGVnYXRlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBpbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBjbGllbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcGluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGNsaWVudA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwaW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBpbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhdW5jaGFibGUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGxhdW5jaGFibGUgb2JqZWN0IHRoYXQgdGhpcyBjbGllbnQgc3VwcG9ydHMNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpb3JpdHkiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgcHJpb3JpdHkgYXRycmlidXRlIHdoaWNoIHNwZWNpZmllcyBhIHJlbGF0aXZlIG9yZGVyaW5nIG9mIGFydGlmYWN0IGFkYXB0ZXJzLiBBZGFwdGVycyB3aXRoIGEgaGlnaGVyIG51bWJlciBhcmUgYWx3YXlzIHVzZWQgZmlyc3QuIFRvIG92ZXJyaWRlIGFub3RoZXIgYWRhcHRlciwgc2ltcGx5IHByb3ZpZGUgYSBoaWdoZXIgcHJpb3JpdHkgdmFsdWUgdGhhdCB0aGUgb3RoZXIgYWRhcHRlci4gVGhlIHByaW9yaXR5IGlzIDAgaWYgbm8gcHJpb3JpdHkgaXMgc3BlY2lmaWVkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkNsaWVudERlbGVnYXRlJmx0Oy9jb2RlJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcGluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjbGllbnQgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuY2xpZW50cyZxdW90OyZndDsNCi0gICAgICAmbHQ7Y2xpZW50DQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUuY2xpZW50cyZxdW90Ow0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JWNsaWVudE5hbWUmcXVvdDsNCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDslY2xpZW50RGVzY3JpcHRpb24mcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlQ2xpZW50JnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLQ0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9pbnN0YWxsYWJsZVJ1bnRpbWVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvaW5zdGFsbGFibGVSdW50aW1lcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDFlOTJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9pbnN0YWxsYWJsZVJ1bnRpbWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9Imluc3RhbGxhYmxlUnVudGltZXMiIG5hbWU9Ikluc3RhbGxhYmxlIFJ1bnRpbWVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gaW5zdGFsbCBuZXcgcnVudGltZXMgKGkuZS4gc2VydmVyIGluc3RhbGxhdGlvbnMpIGZyb20gYSByZW1vdGUgc2VydmVyLgotCi1OZXcgdXNlcnMgc2hvdWxkIHVzZSB0aGUgJmFwb3M7cnVudGltZSZhcG9zOyBlbGVtZW50ICh3aGljaCBhbGxvd3MgeW91IHRvIHBvaW50IHRvIGFueSB6aXAgZmlsZSBvbiBhbnkgc2VydmVyKSBhbmQgbm90IHRoZSBvcmlnaW5hbCAmYXBvcztpbnN0YWxsYWJsZVJ1bnRpbWUmYXBvczsgZWxlbWVudCAod2hpY2ggcmVxdWlyZXMgYSByZW1vdGUgdXBkYXRlIG1hbmFnZXIgc2l0ZSkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imluc3RhbGxhYmxlUnVudGltZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iaW5zdGFsbGFibGVSdW50aW1lIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJpZCIgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmZWF0dXJlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBmZWF0dXJlIGNvbnRhaW5pbmcgdGhlIHJ1bnRpbWUgYnVuZGxlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmVhdHVyZVZlcnNpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHZlcnNpb24gb2YgdGhlIGZlYXR1cmUgY29udGFpbmluZyB0aGUgcnVudGltZSBidW5kbGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmZWF0dXJlU2l0ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgZmVhdHVyZSAodXBkYXRlIG1hbmFnZXIpIHNpdGUgVVJMCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVuZGxlSWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBidW5kbGUgaW4gd2hpY2ggdGhlIHJ1bnRpbWUgemlwIGlzIGluCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVuZGxlVmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgb3B0aW9uYWwgdmVyc2lvbiBvZiB0aGUgYnVuZGxlIGluIHdoaWNoIHRoZSBydW50aW1lIHppcCBpcyBpbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdGgiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgaWYgYnVuZGxlSWQgaXMgc3BlY2lmaWVkIHRoZW4gcmVwcmVzZW50cyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcnVudGltZSB6aXAgaW5zaWRlIHRoZSBidW5kbGUsIG90aGVyd2lzZSBpdCBhc3N1bWVzIGEgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcnVudGltZSBhcmNoaXZlIGluc2lkZSB0aGUgZmVhdHVyZSBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icnVudGltZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4KLSAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXJjaGl2ZVVybCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIFVSTCB0byB0aGUgcnVudGltZSBhcmNoaXZlIGRvd25sb2FkCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXJjaGl2ZVBhdGgiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgcGF0aCB3aXRoaW4gdGhlIGFyY2hpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHJ1bnRpbWUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaWNlbnNlVXJsIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgVVJMIHRvIHRoZSBydW50aW1lIGxpY2Vuc2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygb3BlcmF0aW5nIHN5c3RlbSBkZXNpZ25hdG9ycyBkZWZpbmVkIGJ5IEVjbGlwc2UgKHNlZSBKYXZhZG9jIGZvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm0pLiBJbmRpY2F0ZXMgdGhpcyBpbnN0YWxsYWJsZSBydW50aW1lIHNob3VsZCBvbmx5IGJlIHVzZWQgb24gb25lIG9mIHRoZSBzcGVjaWZpZWQgT1Mgc3lzdGVtcy4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGZlYXR1cmUgY2FuIGJlIGluc3RhbGxlZCBvbiBhbGwgc3lzdGVtcyAocG9ydGFibGUgaW1wbGVtZW50YXRpb24pCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gaW5zdGFsbGFibGUgcnVudGltZSBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIAotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmluc3RhbGxhYmxlUnVudGltZXMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7aW5zdGFsbGFibGVSdW50aW1lCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20ubXlydW50aW1lLmlkJnF1b3Q7Ci0gICAgICAgICAgICBmZWF0dXJlVmVyc2lvbj0mcXVvdDsxLjAuMCZxdW90OwotICAgICAgICAgICAgZmVhdHVyZUlkPSZxdW90O2NvbS5teWZlYXR1cmUmcXVvdDsKLSAgICAgICAgICAgIGZlYXR1cmVTaXRlPSZxdW90O3h5eiZxdW90OwotICAgICAgICAgICAgYnVuZGxlSWQ9JnF1b3Q7Y29tLmlibS5teWJ1bmRsZSZxdW90OwotICAgICAgICAgICAgcGF0aD0mcXVvdDsvemlwcy9teVJ1bnRpbWUuemlwJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0KLVRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyB0aGUgaW5zdGFsbGFibGUgcnVudGltZSBleHRlbnNpb24gcG9pbnQgYnV0IGhhdmluZyB0aGUgcnVudGltZSBhcmNoaXZlIGFzIGEgZGF0YSBhcmNoaXZlIGluIHRoZSBmZWF0dXJlLgotCi0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnN0YWxsYWJsZVJ1bnRpbWVzJnF1b3Q7Jmd0OwotICAgICAgJmx0O2luc3RhbGxhYmxlUnVudGltZQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLm15cnVudGltZS5pZCZxdW90OwotICAgICAgICAgICAgZmVhdHVyZVZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDsKLSAgICAgICAgICAgIGZlYXR1cmVJZD0mcXVvdDtjb20ubXlmZWF0dXJlJnF1b3Q7Ci0gICAgICAgICAgICBmZWF0dXJlU2l0ZT0mcXVvdDt4eXomcXVvdDsKLSAgICAgICAgICAgIHBhdGg9JnF1b3Q7bXlSdW50aW1lLTEuMC56aXAmcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLQotSW4gdGhlIGZlYXR1cmUgbWFuaWZlc3QgYW5kIGRhdGEgZW50cnkgc2hvdWxkIGJlIGVudGVyZWQgZm9yIHRoZSBydW50aW1lIGFyY2hpdmUgYXMgd2VsbCBhcyBhbiBpbnN0YWxsaGFuZGxlci4gVGhlIGRlZmF1bHQgaW5zdGFsbCBoYW5kbGVyIGNhbiBiZSB1c2VkIHdoaWNoIHdpbGwgaW5zdGFsbCB0aGUgZGF0YSBhcmNoaXZlIGluc2lkZSB0aGUgZmVhdHVyZS4KLQotJmx0O2RhdGEKLSAgICBpZD0mcXVvdDtteVJ1bnRpbWUtMS4wLnppcCZxdW90OwotICAgIGRvd25sb2FkLXNpemU9JnF1b3Q7MCZxdW90OwotICAgIGluc3RhbGwtc2l6ZT0mcXVvdDswJnF1b3Q7LyZndDsKLQotJmx0O2luc3RhbGwtaGFuZGxlciBoYW5kbGVyPSZxdW90O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkRlZmF1bHRJbnN0YWxsSGFuZGxlciZxdW90Oy8mZ3Q7Ci0KLUlmIHRoZSBydW50aW1lIGFyY2hpdmUgaXMgbm90IHBhY2thZ2VkIHdpdGhpbiB0aGUgZmVhdHVyZSwgdGhlbiB5b3UgbmVlZCB0byBtYXAgdGhlIGFyY2hpdmUgcGF0aCB0byBhIHJlbGF0aXZlIG9yIGFic29sdXRlIHVybCB0byB0aGUgc2l0ZS54bWwKLQotJmx0O2FyY2hpdmUgcGF0aD0mcXVvdDtmZWF0dXJlcy9jb20ubXlmZWF0dXJlXzEuMC4wL215UnVudGltZS0xLjAuemlwJnF1b3Q7IHVybD0mcXVvdDsuLi8uLi8xLjAvbXlSdW50aW1lLTEuMC56aXAmcXVvdDsvJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2luc3RhbGxhYmxlU2VydmVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2luc3RhbGxhYmxlU2VydmVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UyNzA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9pbnN0YWxsYWJsZVNlcnZlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9Imluc3RhbGxhYmxlU2VydmVycyIgbmFtZT0iSW5zdGFsbGFibGUgU2VydmVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGluc3RhbGwgbmV3IHNlcnZlciBhZGFwdGVycyBmcm9tIHJlbW90ZSB1cGRhdGUgbWFuYWdlciBzaXRlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW5zdGFsbGFibGVTZXJ2ZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJpbnN0YWxsYWJsZVNlcnZlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgcnVudGltZSB0eXBlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiIGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcnVudGltZSB0eXBlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiIGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZW5kb3IiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgdmVuZG9yIG5hbWUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGRlcHJlY2F0ZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmVhdHVyZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgZmVhdHVyZSBjb250YWluaW5nIHRoZSBzZXJ2ZXIgYWRhcHRlciBidW5kbGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmZWF0dXJlVmVyc2lvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSBjb250YWluaW5nIHRoZSBzZXJ2ZXIgYWRhcHRlciBidW5kbGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmZWF0dXJlU2l0ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgZmVhdHVyZSAodXBkYXRlIG1hbmFnZXIpIHNpdGUgVVJMCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gaW5zdGFsbGFibGUgc2VydmVyIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW5zdGFsbGFibGVTZXJ2ZXJzJnF1b3Q7Jmd0OwotICAgICAgJmx0O2luc3RhbGxhYmxlU2VydmVyCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20ubXlzZXJ2ZXIuaWQmcXVvdDsKLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7TXkgcnVudGltZSBuYW1lJnF1b3Q7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDtNeSBydW50aW1lIGRlc2NyaXB0aW9uJnF1b3Q7Ci0gICAgICAgICAgICB2ZW5kb3I9JnF1b3Q7eHl6JnF1b3Q7Ci0gICAgICAgICAgICB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OwotICAgICAgICAgICAgZmVhdHVyZVZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDsKLSAgICAgICAgICAgIGZlYXR1cmVJZD0mcXVvdDtjb20ubXlmZWF0dXJlJnF1b3Q7Ci0gICAgICAgICAgICBmZWF0dXJlU2l0ZT0mcXVvdDt4eXomcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbGF1bmNoYWJsZUFkYXB0ZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbGF1bmNoYWJsZUFkYXB0ZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MzQzYWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2xhdW5jaGFibGVBZGFwdGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9ImxhdW5jaGFibGVBZGFwdGVycyIgbmFtZT0iTGF1bmNoYWJsZSBBZGFwdGVycyIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSBmb3IgYSBzZXJ2ZXIgdG8gc3VwcG9ydCB0aGUgUnVuIG9uIFNlcnZlciBzY2VuYXJpby4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxhdW5jaGFibGVBZGFwdGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJsYXVuY2hhYmxlQWRhcHRlciI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcGluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4NCi0gICAgICAgICA8L2FwcGluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi1MYXVuY2hhYmxlIGFkYXB0ZXIgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwaW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcGluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHNlcnZlciB0eXBlIGlkcy4gTWF5IGluY2x1ZGUgd2lsZGNhcmRzICgqKSBhdCB0aGUgZW5kIG9mIGFuIGlkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5IiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIHByaW9yaXR5IGF0cnJpYnV0ZSB3aGljaCBzcGVjaWZpZXMgYSByZWxhdGl2ZSBvcmRlcmluZyBvZiBsYXVuY2hhYmxlIGFkYXB0ZXJzLiBBZGFwdGVycyB3aXRoIGEgaGlnaGVyIG51bWJlciBhcmUgYWx3YXlzIHVzZWQgZmlyc3QuIFRvIG92ZXJyaWRlIGFub3RoZXIgYWRhcHRlciwgc2ltcGx5IHByb3ZpZGUgYSBoaWdoZXIgcHJpb3JpdHkgdmFsdWUgdGhhdCB0aGUgb3RoZXIgYWRhcHRlci4gVGhlIHByaW9yaXR5IGlzIDAgaWYgbm8gcHJpb3JpdHkgaXMgc3BlY2lmaWVkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcGluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBsYXVuY2hhYmxlIGFkYXB0ZXIgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtsYXVuY2hhYmxlQWRhcHRlcg0KLSAgICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUubGF1bmNoYWJsZUFkYXB0ZXImcXVvdDsNCi0gICAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlJnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSZsdDsvY29kZSZndDsgYW5kIGNvbnRhaW5zIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotDQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcGluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL21vZHVsZUFydGlmYWN0QWRhcHRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MjdhNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL21vZHVsZUFydGlmYWN0QWRhcHRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJtb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIiBuYW1lPSJNb2R1bGUgQXJ0aWZhY3QgQWRhcHRlcnMiLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy9zY2hlbWEvZXhwcmVzc2lvbkxhbmd1YWdlLmV4c2QiLz4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4NCi0gICAgICAgICA8L2FwcGluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtb2R1bGVBcnRpZmFjdEFkYXB0ZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZHVsZUFydGlmYWN0QWRhcHRlciI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcGluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4NCi0gICAgICAgICA8L2FwcGluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcGluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmlvcml0eSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBwcmlvcml0eSBhdHJyaWJ1dGUgd2hpY2ggc3BlY2lmaWVzIGEgcmVsYXRpdmUgb3JkZXJpbmcgb2YgYXJ0aWZhY3QgYWRhcHRlcnMuIEFkYXB0ZXJzIHdpdGggYSBoaWdoZXIgbnVtYmVyIGFyZSBhbHdheXMgdXNlZCBmaXJzdC4gVG8gb3ZlcnJpZGUgYW5vdGhlciBhZGFwdGVyLCBzaW1wbHkgcHJvdmlkZSBhIGhpZ2hlciBwcmlvcml0eSB2YWx1ZSB0aGF0IHRoZSBvdGhlciBhZGFwdGVyLiBUaGUgcHJpb3JpdHkgaXMgMCBpZiBubyBwcmlvcml0eSBpcyBzcGVjaWZpZWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIG1vZHVsZSBvYmplY3QgYWRhcHRlciBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0NCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBpbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9tb2R1bGVGYWN0b3JpZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9tb2R1bGVGYWN0b3JpZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlNzc5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlRmFjdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9Im1vZHVsZUZhY3RvcmllcyIgbmFtZT0iTW9kdWxlIEZhY3RvcmllcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBmYWN0b3J5IGZvciBtb2R1bGVzIHRoYXQgY2FuIGJlIHVzZWQgYnkgc2VydmVycy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vZHVsZUZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZHVsZUZhY3RvcnkiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibW9kdWxlVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7TW9kdWxlRmFjdG9yeURlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi1Nb2R1bGUgZmFjdG9yeSBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVGYWN0b3J5RGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvamVjdHMiIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRydWUgaWYgdGhpcyBmYWN0b3J5IG1heSByZXR1cm4gcHJvamVjdHMgd2l0aGluIHRoZSB3b3Jrc3BhY2UsIGFuZCBmYWxzZSBvdGhlcndpc2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3JkZXIiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gaW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgb3JkZXIgdGhhdCB0aGUgbW9kdWxlIGZhY3RvcnkgaXMgcHJvY2Vzc2VkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJtb2R1bGVUeXBlIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSB0eXBlIGlkcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9ucyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSB2ZXJzaW9ucw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgbW9kdWxlIGZhY3RvcnkgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlRmFjdG9yaWVzJnF1b3Q7Jmd0Ow0KLSAgICZsdDttb2R1bGVGYWN0b3J5DQotICAgICAgcHJvamVjdHM9JnF1b3Q7dHJ1ZSZxdW90Ow0KLSAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLk15V2ViRmFjdG9yeSZxdW90Ow0KLSAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC5zdGF0aWMud2ViJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDttb2R1bGVUeXBlDQotICAgICAgICAgdmVyc2lvbnM9JnF1b3Q7MS4wJnF1b3Q7DQotICAgICAgICAgdHlwZXM9JnF1b3Q7d3N0LndlYiZxdW90OyZndDsNCi0gICAgICAmbHQ7L21vZHVsZVR5cGUmZ3Q7DQotICAgJmx0Oy9tb2R1bGVGYWN0b3J5Jmd0Ow0KLSZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVGYWN0b3J5RGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlVHlwZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9tb2R1bGVUeXBlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTI4MzQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9tb2R1bGVUeXBlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJtb2R1bGVUeXBlcyIgbmFtZT0iTW9kdWxlIFR5cGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIG5ldyBtb2R1bGUgdHlwZS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vZHVsZVR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZHVsZVR5cGUiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kdWxlIHR5cGUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgbW9kdWxlIHR5cGUgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlVHlwZXMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O21vZHVsZVR5cGUNCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZSZxdW90Ow0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JW1vZHVsZVR5cGVOYW1lJnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7JW1vZHVsZVR5cGVEZXNjcmlwdGlvbiZxdW90Oy8mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3B1Ymxpc2hUYXNrcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3B1Ymxpc2hUYXNrcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTA5MWNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9wdWJsaXNoVGFza3MuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9InB1Ymxpc2hUYXNrcyIgbmFtZT0iUHVibGlzaCBUYXNrcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYSB0YXNrIHRoYXQgaXMgcnVuIHdoaWxlIHB1Ymxpc2hpbmcgdG8gYSBzZXJ2ZXIuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InB1Ymxpc2hUYXNrIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHVibGlzaFRhc2siPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hUYXNrRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7LgotUHVibGlzaCB0YXNrIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoVGFza0RlbGVnYXRlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHNlcnZlciB0eXBlIGlkcyB0aGF0IHRoaXMgdGFzayBtYXkgYXBwbHkgdG8uIFVzZWQgZm9yIG1lbW9yeSAmYW1wOyBwZXJmb3JtYW5jZSByZWFzb25zCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBwdWJsaXNoIHRhc2sgZXh0ZW5zaW9uIHBvaW50OgotCi0mbHQ7cHJlJmd0OwotCi0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoVGFza0RlbGVnYXRlJmx0Oy9jb2RlJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcHVibGlzaGVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3B1Ymxpc2hlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNjODZkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcHVibGlzaGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJwdWJsaXNoZXJzIiBuYW1lPSJQdWJsaXNoZXJzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIHRhc2sgdGhhdCBpcyBydW4gd2hpbGUgcHVibGlzaGluZyB0byBhIHNlcnZlci4KLQotJmx0O2ImZ3Q7UHJvdmlzaW9uYWwgQVBJOiZsdDsvYiZndDsKLVRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InB1Ymxpc2hlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InB1Ymxpc2hlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzZXJ2ZXIgdHlwZSBpZHMgdGhhdCB0aGlzIHRhc2sgbWF5IGFwcGx5IHRvLiBVc2VkIGZvciBtZW1vcnkgJmFtcDsgcGVyZm9ybWFuY2UgcmVhc29ucwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgcHVibGlzaGVyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHB1Ymxpc2hlcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4KLVB1Ymxpc2ggaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hlckRlbGVnYXRlOiIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9yZGVyIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG9yZGVyIHRoYXQgdGhlIHB1Ymxpc2hlciBpcyBwcm9jZXNzZWQuIGlmIHRoZSB2YWx1ZSBpcyBsZXNzIHRoYW4gMCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBiZWZvcmUgY2FsbGluZyB0aGUgc2VydmVyIGJlaGF2aW91ciBkZWxlZ2F0ZSZhcG9zO3MgcHVibGlzaGluZyBtZXRob2RzLCBhbmQgbWF5IG1vZGlmeSB0aGUgd29ya3NwYWNlLiBpZiB0aGUgdmFsdWUgaXMgbW9yZSB0aGFuIDAsIGl0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBzZXJ2ZXIgYmVoYXZpb3VyIGRlbGVnYXRlJmFwb3M7cyBwdWJsaXNoaW5nIG1ldGhvZHMgYW5kIG1heSBub3QgbW9kaWZ5IHRoZSB3b3Jrc3BhY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHB1Ymxpc2hlciBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0KLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaGVyRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NWQ0ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiBpZD0icnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJzIiBuYW1lPSJSdW50aW1lIEZhY2V0IENvbXBvbmVudCBQcm92aWRlcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIGV4cGVyaW1lbnRhbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGRvd25zdHJlYW0gY29tcG9uZW50cy4KLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBuZXcgcnVudGltZSBjb21wb25lbnRzIHRvIGFuIGV4aXN0aW5nIGZhY2V0IHJ1bnRpbWUuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bnRpbWVDb21wb25lbnRQcm92aWRlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWVDb21wb25lbnRQcm92aWRlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lVHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHJ1bnRpbWUgdHlwZSBpZHMgdGhhdCB0aGlzIHByb3ZpZGVyIG1heSBzdXBwb3J0LiBVc2VkIGZvciBtZW1vcnkgJmFtcDsgcGVyZm9ybWFuY2UgcmVhc29ucwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4KLVJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAyLjAuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBydW50aW1lIGNvbXBvbmVudCBwcm92aWRlciBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0gICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVycyZxdW90OyZndDsKLSAgICAgJmx0O3J1bnRpbWVDb21wb25lbnRQcm92aWRlcgotICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lQ29tcG9uZW50UHJvdmlkZXImcXVvdDsKLSAgICAgICAgcnVudGltZVR5cGVJZHM9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZSwgY29tLmV4YW1wbGUyLiomcXVvdDsKLSAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVJ1bnRpbWVDb21wb25lbnRQcm92aWRlciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtiJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5SdW50aW1lRmFjZXRDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlJmx0Oy9iJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVMb2NhdG9ycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVMb2NhdG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2FkMTdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lTG9jYXRvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiBpZD0icnVudGltZUxvY2F0b3JzIiBuYW1lPSJSdW50aW1lIExvY2F0b3JzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gbG9jYXRlIG5ldyBydW50aW1lcyBvbiB0aGUgbG9jYWwgbWFjaGluZS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bnRpbWVMb2NhdG9yIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lTG9jYXRvciI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iaWQiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtSdW50aW1lTG9jYXRvckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi1SdW50aW1lIGxvY2F0b3IgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVMb2NhdG9yRGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHJ1bnRpbWUgdHlwZSBpZHMuIE1heSBpbmNsdWRlIHdpbGRjYXJkcyAoKikgYXQgdGhlIGVuZCBvZiBhbiBpZA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcnVudGltZSBsb2NhdG9yIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVMb2NhdG9ycyZxdW90OyZndDsNCi0gICAgICAmbHQ7cnVudGltZUxvY2F0b3INCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5sb2NhdG9yJnF1b3Q7DQotICAgICAgICAgICAgbmFtZT0mcXVvdDslcnVudGltZUxvY2F0b3JOYW1lJnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7JXJ1bnRpbWVMb2NhdG9yRGVzY3JpcHRpb24mcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlUnVudGltZUxvY2F0b3ImcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lTG9jYXRvckRlbGVnYXRlJmx0Oy9jb2RlJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVUYXJnZXRIYW5kbGVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVUYXJnZXRIYW5kbGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODhmYTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lVGFyZ2V0SGFuZGxlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiBpZD0icnVudGltZVR5cGVzIiBuYW1lPSJSdW50aW1lIFR5cGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIG5ldyBydW50aW1lIHRhcmdldCBoYW5kbGVyLiBSdW50aW1lIHRhcmdldCBoYW5kbGVycyBhcmUgY2FsbGVkIHdoZW5ldmVyIGEgcnVudGltZSB0YXJnZXQgaXMgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIGEgcHJvamVjdC4gVGhleSBjYW4gYmUgdXNlZCB0byBzd2l0Y2ggSmF2YSBjbGFzc3BhdGhzLCBzZXR1cCBkZWZhdWx0IHJlc291cmNlcywgZXRjLg0KLQ0KLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGFzIHdlbGwgYXMgdGhlIGNsYXNzZXMgcmVxdWlyZWQgdG8gaW1wbGVtZW50IGl0IGFyZSBkZXByZWNhdGVkIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgZmFjZXRzIGluIFdUUCAxLjAuIElmIHlvdSB3ZXJlIHVzaW5nIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGZvciBjbGFzc3BhdGggdGhlbiB5b3UgY2FuIHVzZSB0aGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMgZXh0ZW5zaW9uIHBvaW50IGluc3RlYWQuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lVGFyZ2V0SGFuZGxlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icnVudGltZVRhcmdldEhhbmRsZXIiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiIGRlcHJlY2F0ZWQ9InRydWUiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lVHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHJ1bnRpbWUgdHlwZSBpZHMgdGhhdCB0aGlzIGhhbmRsZXIgbWF5IHN1cHBvcnQuIFVzZWQgZm9yIG1lbW9yeSAmYW1wOyBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O1J1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7Lg0KLVJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXIgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3JkZXIiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gaW50ZWdlciBvcmRlciB1c2VkIHRvIHNvcnQgaGFuZGxlcnMgcmVsYXRpdmUgdG8gZWFjaCBvdGhlcg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgcnVudGltZSB0YXJnZXQgaGFuZGxlciBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIA0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVGFyZ2V0SGFuZGxlcnMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3J1bnRpbWVUYXJnZXRIYW5kbGVyDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZVRhcmdldEhhbmRsZXImcXVvdDsNCi0gICAgICAgICAgICBydW50aW1lVHlwZUlkcz0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lLCBjb20uZXhhbXBsZTIuKiZxdW90Ow0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVSdW50aW1lVGFyZ2V0SGFuZGxlciZxdW90Oy8mZ3Q7DQotICAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlJmx0Oy9jb2RlJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVUeXBlcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVUeXBlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjk2ZjFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lVHlwZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiBpZD0icnVudGltZVR5cGVzIiBuYW1lPSJSdW50aW1lIFR5cGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIG5ldyBydW50aW1lIHR5cGUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lVHlwZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icnVudGltZVR5cGUiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibW9kdWxlVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHJ1bnRpbWUgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBydW50aW1lIHR5cGUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZW5kb3IiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgdmVuZG9yIG5hbWUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSB2ZXJzaW9uIG51bWJlcg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZW5kb3JJZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBpZCB1c2VkIHRvIGlkZW50aWZ5IHRoZSB2ZW5kb3INCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7UnVudGltZURlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi1SdW50aW1lIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4gRGVsZWdhdGVzIG11c3QgYWxzbyBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWNldFJ1bnRpbWVDb21wb25lbnQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY2V0UnVudGltZVZlcnNpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJtb2R1bGVUeXBlIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSBtb2R1bGUgdHlwZXMgdGhhdCB0aGlzIHJ1bnRpbWUgc3VwcG9ydHMNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbnMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbW9kdWxlIHZlcnNpb25zIHRoYXQgdGhpcyBydW50aW1lIHN1cHBvcnRzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBydW50aW1lIHR5cGUgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZVR5cGVzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtydW50aW1lVHlwZQ0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUmcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90OyVydW50aW1lVHlwZU5hbWUmcXVvdDsNCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDslcnVudGltZVR5cGVEZXNjcmlwdGlvbiZxdW90Ow0KLSAgICAgICAgICAgIHZlbmRvcj0mcXVvdDslcnVudGltZVR5cGVWZW5kb3ImcXVvdDsNCi0gICAgICAgICAgICB2ZXJzaW9uPSZxdW90OzEuMCZxdW90Ow0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVSdW50aW1lRGVsZWdhdGUmcXVvdDsmZ3Q7DQotICAgICAgICAgJmx0O21vZHVsZVR5cGUNCi0gICAgICAgICAgICAgICB0eXBlcz0mcXVvdDtqMmVlLndlYiZxdW90Ow0KLSAgICAgICAgICAgICAgIHZlcnNpb25zPSZxdW90OzEuMiwgMS4zLCAxLjQmcXVvdDsvJmd0Ow0KLSAgICAgICZsdDsvcnVudGltZVR5cGUmZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZSZsdDsvY29kZSZndDsgYW5kIGNvbnRhaW5zIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zZXJ2ZXJMb2NhdG9ycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlckxvY2F0b3JzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZGIxY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlckxvY2F0b3JzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJzZXJ2ZXJMb2NhdG9ycyIgbmFtZT0iU2VydmVyIExvY2F0b3JzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gbG9jYXRlIG5ldyBzZXJ2ZXJzIG9uIHRoZSBsb2NhbCBvciByZW1vdGUgbWFjaGluZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlcnZlckxvY2F0b3IiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZXJ2ZXJMb2NhdG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O1NlcnZlckxvY2F0b3JEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuCi1TZXJ2ZXIgbG9jYXRvciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VwcG9ydHNSZW1vdGVIb3N0cyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0cnVlIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgcmVtb3RlIHNlcnZlciBzdXBwb3J0LCBhbmQgZmFsc2UgaWYgb25seSBsb2NhbCBzZXJ2ZXJzIGFyZSBzdXBwb3J0ZWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc2VydmVyIHR5cGUgaWRzLiBNYXkgaW5jbHVkZSB3aWxkY2FyZHMgKCopIGF0IHRoZSBlbmQgb2YgYW4gaWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHNlcnZlciBsb2NhdG9yIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyTG9jYXRvcnMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7c2VydmVyTG9jYXRvcgotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUubG9jYXRvciZxdW90OwotICAgICAgICAgICAgbmFtZT0mcXVvdDslc2VydmVyTG9jYXRvck5hbWUmcXVvdDsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90OyVzZXJ2ZXJMb2NhdG9yRGVzY3JpcHRpb24mcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVTZXJ2ZXJMb2NhdG9yJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSAmbHQ7YiZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VydmVyTG9jYXRvckRlbGVnYXRlJmx0Oy9iJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zZXJ2ZXJNb25pdG9ycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlck1vbml0b3JzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOTMwYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlck1vbml0b3JzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9ImludGVybmFsU2VydmVyTW9uaXRvciIgbmFtZT0iU2VydmVyIE1vbml0b3IiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIGEgbmV3IG1vbml0b3IgZm9yIHNlcnZlcnMuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtb25pdG9yIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJtb25pdG9yIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBtb25pdG9yDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcyBtb25pdG9yDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlck1vbml0b3JEZWxlZ2F0ZSZsdDsvc2FtcCZndDsNCi0NCi1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlck1vbml0b3JEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgc2VydmVyIG1vbml0b3IgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotDQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyTW9uaXRvckRlbGVnYXRlJmx0Oy9jb2RlJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2VydmVyVHlwZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zZXJ2ZXJUeXBlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmZmNjViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zZXJ2ZXJUeXBlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJzZXJ2ZXJUeXBlcyIgbmFtZT0iU2VydmVyIFR5cGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBhIG5ldyBzZXJ2ZXIgdHlwZS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlcnZlclR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InNlcnZlclR5cGUiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImlkIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNlcnZlciB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgc2VydmVyIHR5cGUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHNlcnZlciB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi1TZXJ2ZXIgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLiBEZWxlZ2F0ZXMgbXVzdCBhbHNvIGhhdmUgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3INCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiZWhhdmlvdXJDbGFzcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7Lg0KLVNlcnZlciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuIERlbGVnYXRlcyBtdXN0IGFsc28gaGF2ZSBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvcg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imhhc0NvbmZpZ3VyYXRpb24iIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRydWUgaWYgdGhpcyBzZXJ2ZXIgaGFzIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGVzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWVUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdGhlIHJ1bnRpbWUgdHlwZSBpZCB0aGF0IHRoaXMgc2VydmVyIHR5cGUgY29ycmVzcG9uZHMgdG8NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGF1bmNoQ29uZmlnSWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGlkIGZvciB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdGhhdCBpcyBhYmxlIHRvIHN0YXJ0IHRoaXMgc2VydmVyDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN1cHBvcnRzUmVtb3RlSG9zdHMiIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRydWUgaWYgdGhpcyBzZXJ2ZXIgdHlwZSBjYW4gd29yayB3aXRoIHJlbW90ZSBob3N0IG5hbWVzLCBmYWxzZSBpZiB0aGlzIHNlcnZlciB0eXBlIGNhbiBvbmx5IHdvcmsgb24gbG9jYWxob3N0LiBpZiB1bnNwZWNpZmllZCwgZmFsc2UgaXMgYXNzdW1lZA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lIiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0cnVlIGlmIHRoaXMgc2VydmVyIHJlcXVpcmVzIGEgcnVudGltZSwgYW5kIGZhbHNlIG90aGVyd2lzZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYXVuY2hNb2RlcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSBsYXVuY2ggbW9kZXMgdGhhdCB0aGlzIHNlcnZlciBzdXBwb3J0cw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsU3RhdGUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdGhlIGludGlhbCBzdGF0ZSBvZiB0aGUgc2VydmVyLCBlaXRoZXIgJnF1b3Q7c3RhcnRlZCZxdW90Oywgb3IgJnF1b3Q7c3RvcHBlZCZxdW90Oy4gaWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIHNlcnZlciBzdGF0ZSB3aWxsIGJlICZxdW90O3Vua25vd24mcXVvdDsNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhcnRUaW1lb3V0IiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSB0aW1lb3V0IHZhbHVlIChpbiBtcykgdGhhdCB0aGUgdG9vbCB3aWxsIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gYmUgc3RhcnRlZC4gVGhlIGRlZmF1bHQgaXMgMiBtaW51dGVzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0b3BUaW1lb3V0IiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSB0aW1lb3V0IHZhbHVlIChpbiBtcykgdGhhdCB0aGUgdG9vbCB3aWxsIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gYmUgc3RvcHBlZC4gVGhlIGRlZmF1bHQgaXMgMiBtaW51dGVzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0YXJ0QmVmb3JlUHVibGlzaCIgdHlwZT0iYm9vbGVhbiI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZSAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O2ZhbHNlJnF1b3Q7IHRvIHNwZWNpZnkgd2hldGhlciB0aGUgc2VydmVyIG5lZWRzIHRvIGJlIHN0YXJ0ZWQgZm9yIHB1Ymxpc2hpbmcgdG8gb2NjdXIuIElmICZxdW90O3RydWUmcXVvdDssIHRoZSBzZXJ2ZXIgd2lsbCBiZSBzdGFydGVkIG9uIGV2ZXJ5IGNhbGwgdG8gcHVibGlzaCgpIGJlZm9yZSBleGVjdXRpbmcgdGhlIHB1Ymxpc2ggY29kZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgc2VydmVyIHR5cGUgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyVHlwZXMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3NlcnZlclR5cGUNCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5zZXJ2ZXJUeXBlJnF1b3Q7DQotICAgICAgICAgICAgbmFtZT0mcXVvdDslc2VydmVyVHlwZU5hbWUmcXVvdDsNCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDslc2VydmVyVHlwZURlc2NyaXB0aW9uJnF1b3Q7DQotICAgICAgICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0mcXVvdDt0cnVlJnF1b3Q7DQotICAgICAgICAgICAgcnVudGltZT0mcXVvdDt0cnVlJnF1b3Q7DQotICAgICAgICAgICAgaW5pdGlhbFN0YXRlPSZxdW90O3N0b3BwZWQmcXVvdDsNCi0gICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSZxdW90O3RydWUmcXVvdDsNCi0gICAgICAgICAgICBsYXVuY2hDb25maWdJZD0mcXVvdDtjb20uZXhhbXBsZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSZxdW90Ow0KLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWQ9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZSZxdW90Ow0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVTZXJ2ZXJEZWxlZ2F0ZSZxdW90Ow0KLSAgICAgICAgICAgIGJlaGF2aW91ckNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSZxdW90Oy8mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIGFic3RyYWN0IGNsYXNzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZSZsdDsvY29kZSZndDsgYW5kIGhhcyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0NCi1WYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2JlaGF2aW91ckNsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgYWJzdHJhY3QgY2xhc3MgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlJmx0Oy9jb2RlJmd0OyBhbmQgaGFzIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zdGFydHVwLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc3RhcnR1cC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWI2OWY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zdGFydHVwLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9ImludGVybmFsU3RhcnR1cCIgbmFtZT0iU3RhcnR1cCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBpbnZva2UgY29kZSBkdXJpbmcgdGhlIHNlcnZlciBjb3JlIHBsdWdpbiBzdGFydHVwLiBVc2Ugc3BhcmluZ2x5Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3RhcnR1cCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ic3RhcnR1cCI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU3RhcnR1cCZsdDsvc2FtcCZndDsuDQotDQotVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU3RhcnR1cCIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgc3RhcnR1cCBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIA0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zdGFydHVwJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtzdGFydHVwDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUuc3RhcnR1cCZxdW90Ow0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVTdGFydHVwJnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVN0YXJ0dXAmbHQ7L2NvZGUmZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzIwOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSU1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLS8qKgotICogQSBtb2R1bGUgaXMgYSB1bml0IG9mICJjb250ZW50IiB0aGF0IGNhbiBiZSBwdWJsaXNoZWQgdG8gYQotICogc2VydmVyLgotICogPHA+Ci0gKiBBbGwgbW9kdWxlcyBoYXZlIGEgbW9kdWxlIHR5cGUsIHdoaWNoIGlzIGZpeGVkIGZvciB0aGUKLSAqIGxpZmV0aW1lIG9mIHRoZSBtb2R1bGUuIFRoZSBzZXQgb2YgbW9kdWxlIHR5cGVzIChvcgotICogImtpbmRzIikgaXMgb3Blbi1lbmRlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogQWxsIG1vZHVsZXMgYXJlIGNyZWF0ZWQgYnkgbW9kdWxlIGZhY3RvcmllcyB1c2luZyB0aGUgbW9kdWxlRmFjdG9yaWVzCi0gKiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBjb250ZW50IG9mIGEgbW9kdWxlIGlzIGEgY29sbGVjdGlvbiBvZiBmaWxlIGFuZCBmb2xkZXIKLSAqIHJlc291cmNlcyBpbiB0aGUgd29ya3NwYWNlLgotICogPC9wPgotICogPHA+Ci0gKiBJbiBwcmluY2lwbGUsIGEgbW9kdWxlIGV4aXN0cyBpbmRlcGVuZGVudCBvZiBhbnkKLSAqIHBhcnRpY3VsYXIgc2VydmVyLiBUaGUgc2FtZSBtb2R1bGUgaW5zdGFuY2UgY2FuIGJlIGFzc29jaWF0ZWQKLSAqIHdpdGggbXVsdGlwbGUgc2VydmVyIGluc3RhbmNlcyBhdCB0aGUgc2FtZSB0aW1lLiBUaGF0IGlzCi0gKiB3aHkgeW91IGNhbm5vdCBhc2sgdGhlIG1vZHVsZSB3aGljaCBzZXJ2ZXIgaXQncyBhc3NvY2lhdGVkCi0gKiB3aXRoLgotICogPC9wPgotICogPHA+Ci0gKiBBIG1vZHVsZSBpcyBlcXVhbCB0byBhbm90aGVyIG1vZHVsZSB3aGVuZXZlciB0aGUgdHdvIGlkcyBhcmUgZXF1YWwgYW5kIHRoZQotICogKG9wdGlvbmFsKSBwcm9qZWN0IGF0dHJpYnV0ZSBpcyBlcXVhbC4KLSAqIDwvcD4KLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGUgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIG1vZHVsZS4KLQkgKiBFYWNoIG1vZHVsZSBoYXMgYSBkaXN0aW5jdCBpZCwgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGlzCi0JICogbW9kdWxlIGZyb20gYWxsIG90aGVyIG1vZHVsZXMgaW4gdGhlIHdvcmtzcGFjZSAoYW5kCi0JICogd2l0aGluIGEgc2VydmVyKS4gSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkKLQkgKiBhcyBrZXlzOyB0aGV5IGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgbW9kdWxlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG5hbWUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVR5cGUgZ2V0TW9kdWxlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2JlbmNoIHByb2plY3QgdGhhdCB0aGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4sCi0JICogb3IgbnVsbCBpZiB0aGUgbW9kdWxlIGlzIG91dHNpZGUgb2YgdGhlIHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcHJvamVjdAotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2R1bGUgaXMgYW4gZXh0ZXJuYWwgKG5vbi13b3Jrc3BhY2UpIG1vZHVsZSwKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSBpcyBhbiBleHRlcm5hbCBtb2R1bGUsCi0JICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gb2JqZWN0IHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcwotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIG5vIHN1Y2ggb2JqZWN0IGNhbiBiZSBmb3VuZCwgb3IgaWYgdGhlIGRlbGVnYXRlIGlzIG5vdAotCSAqIGxvYWRlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBjaGVjayB0aGUgZGVsZWdhdGUgY2xhc3NlcyBmb3IgYWRhcHRpbmcKLQkgKiB1bmxlc3MgdGhleSBhcmUgYWxyZWFkeSBsb2FkZWQuIE5vIHBsdWdpbiBsb2FkaW5nIHdpbGwgb2NjdXIKLQkgKiB3aGVuIGNhbGxpbmcgdGhpcyBtZXRob2QuIEl0IGlzIHN1aXRhYmxlIGZvciBwb3B1cCBtZW51cyBhbmQKLQkgKiBvdGhlciBVSSBhcnRpZmFjdHMgd2hlcmUgcGVyZm9ybWFuY2UgaXMgYSBjb25jZXJuLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIGNsYXNzIHRvIGxvb2sgdXAKLQkgKiBAcmV0dXJuIGEgb2JqZWN0IGNhc3RhYmxlIHRvIHRoZSBnaXZlbiBjbGFzcywgCi0JICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgZG9lcyBub3QKLQkgKiAgICBoYXZlIGFuIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBjbGFzcwotCSAqIEBzZWUgSUFkYXB0YWJsZSNnZXRBZGFwdGVyKENsYXNzKQotCSAqIEBzZWUgI2xvYWRBZGFwdGVyKENsYXNzLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gb2JqZWN0IHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcwotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBvbmx5IGlmCi0JICogbm8gc3VjaCBvYmplY3QgY2FuIGJlIGZvdW5kIGFmdGVyIGxvYWRpbmcgYW5kIGluaXRpYWxpemluZwotCSAqIGRlbGVnYXRlcy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGZvcmNlIGEgbG9hZCBhbmQgaW5pdGlhbGl6YXRpb24gb2YgYWxsIGRlbGVnYXRlCi0JICogY2xhc3NlcyBhbmQgY2hlY2sgdGhlbSBmb3IgYWRhcHRpbmcuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGFkYXB0ZXIgdGhlIGFkYXB0ZXIgY2xhc3MgdG8gbG9vayB1cAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgb2JqZWN0IGNhc3RhYmxlIHRvIHRoZSBnaXZlbiBjbGFzcywgCi0JICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgZG9lcyBub3QKLQkgKiAgICBoYXZlIGFuIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBjbGFzcwotCSAqIEBzZWUgI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkQWRhcHRlcihDbGFzcyBhZGFwdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lNb2R1bGVBcnRpZmFjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSU1vZHVsZUFydGlmYWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTEzOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSU1vZHVsZUFydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLS8qKgotICogQSBtb2R1bGUgYXJ0aWZhY3QgaXMgYSByZXNvdXJjZSB3aXRoaW4gYSBtb2R1bGUsIHdoaWNoIGNhbiBiZSBsYXVuY2hlZAotICogb24gdGhlIHNlcnZlci4gRXhhbXBsZXMgb2YgbW9kdWxlIGFydGlmYWN0cyBhcmUgc2VydmxldHMsIEhUTUwgcGFnZXMsCi0gKiBvciBFSkIgYmVhbnMuCi0gKiA8cD4KLSAqIE9iamVjdHMgdGhhdCBwcm92aWRlIGFuIGFkYXB0ZXIgb2YgdGhpcyB0eXBlIHdpbGwgYmUgY29uc2lkZXJlZCBieSB0aGUKLSAqIGNvbnRleHR1YWwgUnVuIG9uIFNlcnZlciBsYXVuY2ggc3VwcG9ydC4gCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZUFydGlmYWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgdGhhdCB0aGlzIGFydGlmYWN0IGlzIGEgcGFydCBvZi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgdGhhdCB0aGlzIGFydGlmYWN0IGlzIGNvbnRhaW5lZCBpbgotCSAqLwotCXB1YmxpYyBJTW9kdWxlIGdldE1vZHVsZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lNb2R1bGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JTW9kdWxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODgwMGI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lNb2R1bGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLS8qKgotICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiBhIG1vZHVsZS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlVHlwZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHR5cGUgaWQuCi0JICogPHA+Ci0JICogVGhlIG1vZHVsZSB0eXBlIGlkIGlzIGEgIi4iIHNlcGFyYXRlZCBzdHJpbmcgdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhlCi0JICogdHlwZSBvZiBtb2R1bGUuIExpa2UgYSBqYXZhIHBhY2thZ2UgbmFtZSwgaXQgc2hvdWxkIHNjb3BlIHRoZSB0eXBlIGZyb20KLQkgKiBtb3N0IGdlbmVyYWwgdG8gc3BlY2lmaWMuIEZvciBpbnN0YW5jZSwgImpzdC53ZWIiLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgdHlwZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgbW9kdWxlIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgbmFtZSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIG1vZHVsZSB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIChzcGVjaWZpY2F0aW9uIGxldmVsKSBvZiB0aGlzIG1vZHVsZSB0eXBlLAotCSAqIGUuZy4gIjEuMCIgb3IgIjEuMy4yYSIuCi0JICogPHA+Ci0JICogVGhlIHZlcnNpb24gd2lsbCBub3JtYWxseSBiZSBhIHNlcmllcyBvZiBudW1iZXJzIHNlcGFyYXRlZCBieQotCSAqICIuIiwgYnV0IGl0IGNvdWxkIGJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbW9kdWxlLgotCSAqIEZvciBtb2R1bGUgdHlwZXMgd2hlcmUgYSB2ZXJzaW9uIGRvZXMgbm90IG1ha2Ugc2Vuc2UgKGUuZy4KLQkgKiBhIHN0YXRpYyBXZWIgbW9kdWxlKSwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSB0eXBlLCBvcgotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHZlcnNpb24gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVByb2plY3RQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUHJvamVjdFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkYmVlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUHJvamVjdFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBob2xkcyBpbmZvcm1hdGlvbiBvbiB0aGUgcHJvcGVydGllcyBvZiBhIGdpdmVuIHByb2plY3QuCi0gKgotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogCi0gKiBAZGVwcmVjYXRlZCBQcm9qZWN0IGZhY2V0IHN1cHBvcnQgc2hvdWxkIG5vdyBiZSB1c2VkIGluc3RlYWQgb2YgdGhpcyBBUEkuIEBzZWUKLSAqICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdCNnZXRSdW50aW1lKCkKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvamVjdFByb3BlcnRpZXMgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgcnVudGltZSB0YXJnZXQgZm9yIHRoaXMgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJ1bnRpbWUgdGFyZ2V0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBoYXMKLQkgKiAgICBubyBydW50aW1lIHRhcmdldAotCSAqIEBkZXByZWNhdGVkIFByb2plY3QgZmFjZXQgc3VwcG9ydCBzaG91bGQgbm93IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGlzIEFQSS4gQHNlZQotCSAqICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdCNnZXRSdW50aW1lKCkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0UnVudGltZVRhcmdldCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lQdWJsaXNoTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lQdWJsaXNoTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1MTRmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUHVibGlzaExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0vKioKLSAqIEEgcHVibGlzaCBsaXN0ZW5lciBpcyB1c2VkIHRvIGxpc3RlbiBmb3IgcHVibGlzaGluZyBldmVudHMgZnJvbSBhIHNlcnZlci4KLSAqIFRoZSBldmVudHMgYXJlIHR5cGljYWxseSByZWNlaXZlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotICogCi0gKiBwdWJsaXNoU3RhcnRlZCgpIC0gVGhlIHB1Ymxpc2ggb3BlcmF0aW9uIGlzIHN0YXJ0aW5nCi0gKiAgIHB1Ymxpc2hNb2R1bGVTdGFydGVkKCkgLSBUaGlzIHNlY3Rpb24gaXMgZmlyZWQgZm9yIGVhY2ggbW9kdWxlIGluIHRoZSBzZXJ2ZXIKLSAqICAgcHVibGlzaE1vZHVsZUZpbmlzaGVkKCkgLSBUaGlzIG1vZHVsZSBpcyBmaW5pc2hlZCBwdWJsaXNoaW5nCi0gKiAgIHB1Ymxpc2hNb2R1bGVTdGFydGVkKCkgLSBUaGUgbmV4dCBtb2R1bGUgaXMgcHVibGlzaGluZwotICogICAuLi4KLSAqIHB1Ymxpc2hGaW5pc2hlZCgpIC0gVGhlIHB1Ymxpc2ggb3BlcmF0aW9uIGlzIGZpbmlzaGVkCi0gKiA8cD4KLSAqIFB1Ymxpc2ggbGlzdGVuZXJzIGFyZSBhZGRlZCB0byBhIHNlcnZlciB2aWEgSVNlcnZlci5hZGRQdWJsaXNoTGlzdGVuZXIoKS4KLSAqIDwvcD4KLSAqIEBzZWUgSVNlcnZlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQdWJsaXNoTGlzdGVuZXIgewotCS8qKgotCSAqIEZpcmVkIHRvIG5vdGlmeSB0aGF0IHB1Ymxpc2hpbmcgaGFzIGJlZ3VuLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRoYXQgcHVibGlzaGluZyBzdGFydGVkIG9uCi0JICovCi0JcHVibGljIHZvaWQgcHVibGlzaFN0YXJ0ZWQoSVNlcnZlciBzZXJ2ZXIpOwotCi0JLyoqCi0JICogUHVibGlzaGluZyBoYXMgZmluaXNoZWQuIFJldHVybnMgdGhlIG92ZXJhbGwgc3RhdHVzLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRoYXQgcHVibGlzaGluZyBmaW5pc2hlZCBvbgotCSAqIEBwYXJhbSBzdGF0dXMgaW5kaWNhdGluZyB3aGF0IChpZiBhbnl0aGluZykgd2VudCB3cm9uZwotCSAqLwotCXB1YmxpYyB2b2lkIHB1Ymxpc2hGaW5pc2hlZChJU2VydmVyIHNlcnZlciwgSVN0YXR1cyBzdGF0dXMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTg3YzhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLS8qKgotICogUmVwcmVzZW50cyBhIHJ1bnRpbWUgaW5zdGFuY2UuIEV2ZXJ5IHJ1bnRpbWUgaXMgYW4gaW5zdGFuY2Ugb2YgYQotICogcGFydGljdWxhciwgZml4ZWQgcnVudGltZSB0eXBlLgotICogPHA+Ci0gKiBTZXJ2ZXJzIGhhdmUgYSBydW50aW1lLiBUaGUgc2VydmVyIHJ1bnRpbWUgY29ycmVzcG9uZHMgdG8gdGhlCi0gKiBpbnN0YWxsZWQgY29kZSBiYXNlIGZvciB0aGUgc2VydmVyLiBUaGUgbWFpbiByb2xlIHBsYXllZCBieSB0aGUgc2VydmVyCi0gKiBydW50aW1lIGlzIGluIGlkZW50aWZ5aW5nIGNvZGUgbGlicmFyaWVzIHRvIGNvbXBpbGUgb3IgYnVpbGQgYWdhaW5zdC4KLSAqIEluIHRoZSBjYXNlIG9mIGxvY2FsIHNlcnZlcnMsIHRoZSBzZXJ2ZXIgcnVudGltZSBtYXkgcGxheSBhIHNlY29uZGFyeSByb2xlCi0gKiBvZiBiZWluZyB1c2VkIHRvIGxhdW5jaCB0aGUgc2VydmVyIGZvciB0ZXN0aW5nLiBIYXZpbmcgdGhlIHNlcnZlciBydW50aW1lcwotICogaWRlbnRpZmllZCBhcyBhbiBlbnRpdHkgc2VwYXJhdGUgZnJvbSB0aGUgc2VydmVyIGl0c2VsZiBmYWNpbGl0YXRlcyBzaGFyaW5nCi0gKiBzZXJ2ZXIgcnVudGltZXMgYmV0d2VlbiBzZXZlcmFsIHNlcnZlcnMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIElSdW50aW1lIGltcGxlbWVudHMgSUFkYXB0YWJsZSB0byBhbGxvdyB1c2VycyB0byBvYnRhaW4gYSBydW50aW1lLXR5cGUtc3BlY2lmaWMKLSAqIGNsYXNzLiBCeSBjYXN0aW5nIHRoZSBydW50aW1lIGV4dGVuc2lvbiB0byB0aGUgdHlwZSBwcmVzY3JpYmVkIGluIHRoZSBBUEkKLSAqIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgcGFydGljdWxhciBydW50aW1lIHR5cGUsIHRoZSBjbGllbnQgY2FuIGFjY2VzcwotICogcnVudGltZS10eXBlLXNwZWNpZmljIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuIGdldEFkYXB0ZXIoKSBtYXkgaW52b2x2ZSBwbHVnaW4KLSAqIGxvYWRpbmcsIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHBvcHVwIG1lbnVzLCBldGMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBzZXJ2ZXIgZnJhbWV3b3JrIG1haW50YWlucyBhIGdsb2JhbCBsaXN0IG9mIGFsbCBrbm93biBydW50aW1lIGluc3RhbmNlcwotICogKHtAbGluayBTZXJ2ZXJDb3JlI2dldFJ1bnRpbWVzKCl9KS4KLSAqIDwvcD4KLSAqIDxwPgotICogQWxsIHJ1bnRpbWVzIGhhdmUgYSB1bmlxdWUgaWQuIFR3byBydW50aW1lcyAob3IgbW9yZSBsaWtlbHkgYSBydW50aW1lIGFuZCBpdCdzCi0gKiB3b3JraW5nIGNvcHkpIHdpdGggdGhlIHNhbWUgaWQgYXJlIGVxdWFsLCBhbmQgdHdvIHJ1bnRpbWVzIHdpdGggZGlmZmVyZW50IGlkcwotICogYXJlIG5ldmVyIGVxdWFsLgotICogPC9wPgotICogPHA+Ci0gKiBUd28gcnVudGltZXMgYXJlIGlkZW50aWNhbCBpZiBhbmQgb25seSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgaWQuCi0gKiA8L3A+Ci0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKiAKLSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBydW50aW1lLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG5hbWUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBydW50aW1lIGluc3RhbmNlLgotCSAqIEVhY2ggcnVudGltZSAob2YgYSBnaXZlbiB0eXBlKSBoYXMgYSBkaXN0aW5jdCBpZCwgZml4ZWQgZm9yCi0JICogaXRzIGxpZmV0aW1lLiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOwotCSAqIHRoZXkgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogPHA+Ci0JICogRm9yIHRoZSBpZCBvZiB0aGUgcnVudGltZSB0eXBlLCB1c2Uge0BsaW5rIElSdW50aW1lVHlwZSNnZXRJZCgpfQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgcGVyc2lzdGVudCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJ1bnRpbWUuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbnkgZXJyb3IgcmVjZWl2ZWQgd2hpbGUgZGVsZXRpbmcgdGhlIHJ1bnRpbWUKLQkgKiAgICBvciBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYSB3b3JraW5nIGNvcHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHJ1bnRpbWUgaXMgbWFya2VkIHJlYWQgb25seS4KLQkgKiBXaGVuIGEgcnVudGltZSBpcyByZWFkIG9ubHksIHdvcmtpbmcgY29waWVzIGNhbiBiZSBjcmVhdGVkIGJ1dAotCSAqIHRoZXkgY2Fubm90IGJlIHNhdmVkLgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJ1bnRpbWUgaXMgbWFya2VkIGFzIHJlYWQgb25seSwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgd29ya2luZyBjb3B5LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBydW50aW1lIGlzIGEgd29ya2luZyBjb3B5Ci0JICogICAgKGNhbiBiZSBjYXN0IHRvIElSdW50aW1lV29ya2luZ0NvcHkpLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgYW4gb2JqZWN0IHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcwotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIG5vIHN1Y2ggb2JqZWN0IGNhbiBiZSBmb3VuZCwgb3IgaWYgdGhlIGRlbGVnYXRlIGlzIG5vdAotCSAqIGxvYWRlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBjaGVjayB0aGUgZGVsZWdhdGUgY2xhc3NlcyBmb3IgYWRhcHRpbmcKLQkgKiB1bmxlc3MgdGhleSBhcmUgYWxyZWFkeSBsb2FkZWQuIE5vIHBsdWdpbiBsb2FkaW5nIHdpbGwgb2NjdXIKLQkgKiB3aGVuIGNhbGxpbmcgdGhpcyBtZXRob2QuIEl0IGlzIHN1aXRhYmxlIGZvciBwb3B1cCBtZW51cyBhbmQKLQkgKiBvdGhlciBVSSBhcnRpZmFjdHMgd2hlcmUgcGVyZm9ybWFuY2UgaXMgYSBjb25jZXJuLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIGNsYXNzIHRvIGxvb2sgdXAKLQkgKiBAcmV0dXJuIGEgb2JqZWN0IGNhc3RhYmxlIHRvIHRoZSBnaXZlbiBjbGFzcywgCi0JICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgZG9lcyBub3QKLQkgKiAgICBoYXZlIGFuIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBjbGFzcwotCSAqIEBzZWUgSUFkYXB0YWJsZSNnZXRBZGFwdGVyKENsYXNzKQotCSAqIEBzZWUgI2xvYWRBZGFwdGVyKENsYXNzLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIG9iamVjdCB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gb25seSBpZgotCSAqIG5vIHN1Y2ggb2JqZWN0IGNhbiBiZSBmb3VuZCBhZnRlciBsb2FkaW5nIGFuZCBpbml0aWFsaXppbmcKLQkgKiBkZWxlZ2F0ZXMuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCBmb3JjZSBhIGxvYWQgYW5kIGluaXRpYWxpemF0aW9uIG9mIGFsbCBkZWxlZ2F0ZQotCSAqIGNsYXNzZXMgYW5kIGNoZWNrIHRoZW0gZm9yIGFkYXB0aW5nLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIGNsYXNzIHRvIGxvb2sgdXAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIG9iamVjdCBjYXN0YWJsZSB0byB0aGUgZ2l2ZW4gY2xhc3MsIAotCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGRvZXMgbm90Ci0JICogICAgaGF2ZSBhbiBhZGFwdGVyIGZvciB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBAc2VlICNnZXRBZGFwdGVyKENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgbG9hZEFkYXB0ZXIoQ2xhc3MgYWRhcHRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBydW50aW1lIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBJUnVudGltZVR5cGUgZ2V0UnVudGltZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBydW50aW1lIHdvcmtpbmcgY29weSBmb3IgbW9kaWZ5aW5nIHRoaXMgcnVudGltZSBpbnN0YW5jZS4KLQkgKiBJZiB0aGlzIGluc3RhbmNlIGlzIGFscmVhZHkgYSB3b3JraW5nIGNvcHksIGl0IGlzIHJldHVybmVkLgotCSAqIElmIHRoaXMgaW5zdGFuY2UgaXMgbm90IGEgd29ya2luZyBjb3B5LCBhIG5ldyBydW50aW1lIHdvcmtpbmcgY29weQotCSAqIGlzIGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBpZCBhbmQgYXR0cmlidXRlcy4KLQkgKiBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3Igc2F2aW5nIG9yIHJlbGVhc2luZyB0aGUgd29ya2luZyBjb3B5IHdoZW4KLQkgKiB0aGV5IGFyZSBkb25lIHdpdGggaXQuCi0JICogPHA+Ci0JICogVGhlIHJ1bnRpbWUgd29ya2luZyBjb3B5IGlzIHJlbGF0ZWQgdG8gdGhpcyBydW50aW1lIGluc3RhbmNlCi0JICogaW4gdGhlIGZvbGxvd2luZyB3YXlzOgotCSAqIDxwcmU+Ci0JICogdGhpcy5nZXRXb3JraW5nQ29weSgpLmdldElkKCkgPT0gdGhpcy5nZXRJZCgpCi0JICogdGhpcy5nZXRXb3JraW5nQ29weSgpLmdldE9yaWdpbmFsKCkgPT0gdGhpcwotCSAqIDwvcHJlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IElSdW50aW1lV29ya2luZ0NvcHkgZXh0ZW5kcyBJUnVudGltZS4gCi0JICogUnVudGltZS5nZXRXb3JraW5nQ29weSgpIGNyZWF0ZSBhIG5ldyB3b3JraW5nIGNvcHk7Ci0JICogUnVudGltZVdvcmtpbmdDb3B5LmdldFdvcmtpbmdDb3B5KCkgcmV0dXJucyB0aGlzLgotCSAqIFRoaXMgbWF5IGJlIGNvbnZlbmllbnQgaW4gY29kZSB0aGF0IGlzIGlnbm9yYW50IG9mCi0JICogd2hldGhlciB0aGV5IGFyZSBkZWFsaW5nIHdpdGggYSB3b3JraW5nIGNvcHkgb3Igbm90LgotCSAqIEhvd2V2ZXIsIGl0IGlzIGhhcmQgZm9yIGNsaWVudHMgdG8gbWFuYWdlIHdvcmtpbmcgY29waWVzCi0JICogd2l0aCB0aGlzIGRlc2lnbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyB3b3JraW5nIGNvcHkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gdG8gdGhlIHJvb3Qgb2YgdGhlIHJ1bnRpbWUsCi0JICogdHlwaWNhbGx5IHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoaXMgcnVudGltZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcnVudGltZSBpcyBhIHN0dWIgKHVzZWQgZm9yIGNvbXBpbGF0aW9uIG9ubHkpCi0JICogb3IgYSBmdWxsIHJ1bnRpbWUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJ1bnRpbWUgaXMgYSBzdHViLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdHViKCk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhpcyBydW50aW1lIGluc3RhbmNlLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBydW50aW1lCi0JICogaXMgcG9pbnRpbmcgdG8gYSBudWxsIG9yIGludmFsaWQgbG9jYXRpb24gKGUuZy4gbm90IHBvaW50aW5nIHRvIHRoZSBjb3JyZWN0Ci0JICogaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSksIG9yIGlmIHRoZSBydW50aW1lLXR5cGUtc3BlY2lmaWMgcHJvcGVydGllcyBhcmUgbWlzc2luZwotCSAqIG9yIGludmFsaWQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgbm90IG9uIHRoZSB3b3JraW5nIGNvcHkgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gYmUgdmFsaWRhdGVkIGF0Ci0JICogYW55IHRpbWUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGlzCi0JICogICBydW50aW1lIGlzIHZhbGlkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcwotCSAqICAgd3Jvbmcgd2l0aCBpdAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzA2N2M4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotLyoqCi0gKiBMaXN0ZW5lciBpbnRlcmZhY2UgZm9yIGNoYW5nZXMgdG8gcnVudGltZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGZpcmVkIHdoZW5ldmVyIGEgcnVudGltZSBpcyBhZGRlZCwgbW9kaWZpZWQsIG9yIHJlbW92ZWQuCi0gKiBBbGwgZXZlbnRzIGFyZSBmaXJlZCBwb3N0LWNoYW5nZSwgc28gdGhhdCBhbGwgc2VydmVyIHRvb2xzIEFQSSBjYWxsZWQgYXMgYQotICogcmVzdWx0IG9mIHRoZSBldmVudCB3aWxsIHJldHVybiB0aGUgdXBkYXRlZCByZXN1bHRzLiAoZm9yIGV4YW1wbGUsIG9uCi0gKiBydW50aW1lQWRkZWQgdGhlIG5ldyBzZXJ2ZXIgd2lsbCBiZSBpbiB0aGUgZ2xvYmFsIGxpc3Qgb2YgcnVudGltZXMKLSAqICh7QGxpbmsgU2VydmVyQ29yZSNnZXRSdW50aW1lcygpfSksIGFuZCBvbiBydW50aW1lUmVtb3ZlZCB0aGUgcnVudGltZSB3aWxsCi0gKiBub3QgYmUgaW4gdGhlIGxpc3QuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgU2VydmVyQ29yZQotICogQHNlZSBJUnVudGltZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgewotCS8qKgotCSAqIEEgbmV3IHJ1bnRpbWUgaGFzIGJlZW4gY3JlYXRlZC4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBuZXcgcnVudGltZQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bnRpbWVBZGRlZChJUnVudGltZSBydW50aW1lKTsKLQotCS8qKgotCSAqIEFuIGV4aXN0aW5nIHJ1bnRpbWUgaGFzIGJlZW4gdXBkYXRlZCBvciBtb2RpZmllZC4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBtb2RpZmllZCBydW50aW1lCi0JICovCi0JcHVibGljIHZvaWQgcnVudGltZUNoYW5nZWQoSVJ1bnRpbWUgcnVudGltZSk7Ci0KLQkvKioKLQkgKiBBIGV4aXN0aW5nIHJ1bnRpbWUgaGFzIGJlZW4gcmVtb3ZlZC4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lIHRoZSByZW1vdmVkIHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW50aW1lUmVtb3ZlZChJUnVudGltZSBydW50aW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVRhcmdldEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lVGFyZ2V0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTcxMmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lVGFyZ2V0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLS8qKgotICogQSBydW50aW1lIHRhcmdldCBoYW5kbGVyIGlzIHVzZWQgdG8gYXBwbHkgc29tZSBwcm9wZXJ0aWVzIHRvIGEgcHJvamVjdAotICogdGhpcyBpcyBiZWluZyB0YXJnZXRlZCB0byBhIGdpdmVuIHJ1bnRpbWUuIEZvciBpbnN0YW5jZSwgdGhlIGhhbmRsZXIKLSAqIG1pZ2h0IHVwZGF0ZSB0aGUgY2xhc3NwYXRoIG9mIGEgSmF2YSBwcm9qZWN0IHRvIGluY2x1ZGUgdGhlIHJ1bnRpbWUncwotICogY2xhc3NlcywgYWRkIHZhbGlkYXRpb24gZm9yIHRoZSBnaXZlbiBydW50aW1lLCBvciByZXN0cmljdCB0aGUgdHlwZSBvZgotICogcmVzb3VyY2VzIHRoYXQgY2FuIGJlIGNyZWF0ZWQuCi0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIHByb2plY3QgZmFjZXRzIGluc3RlYWQgb2YgcnVudGltZSB0YXJnZXRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVUYXJnZXRIYW5kbGVyIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBydW50aW1lIHRhcmdldCBoYW5kbGVyLgotCSAqIEVhY2gga25vd24gcnVudGltZSB0YXJnZXQgaGFuZGxlciBoYXMgYSBkaXN0aW5jdCBpZC4gCi0JICogSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsgdGhleSBhcmUgbm90Ci0JICogaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXIgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcnVudGltZSB0YXJnZXQgaGFuZGxlciBzdXBwb3J0cwotCSAqIChjYW4gd29yayB3aXRoKSB0aGUgZ2l2ZW4gcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZVR5cGUgYSBydW50aW1lIHR5cGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBoYW5kbGVyIGNhbiBhY2NlcHQgdGhlIGdpdmVuIHJ1bnRpbWUgdHlwZSwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzUnVudGltZVR5cGUoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjZhYmUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLS8qKgotICogUmVwcmVzZW50cyBhIChzZXJ2ZXIpIHJ1bnRpbWUgdHlwZSBmcm9tIHdoaWNoIHJ1bnRpbWUgaW5zdGFuY2VzIGNhbiBiZQotICogY3JlYXRlZC4KLSAqIDxwPgotICogVGhlIHNlcnZlciBjb3JlIGZyYW1ld29yayBzdXBwb3J0cwotICogYW4gb3Blbi1lbmRlZCBzZXQgb2YgcnVudGltZSB0eXBlcywgd2hpY2ggYXJlIGNvbnRyaWJ1dGVkIHZpYQotICogdGhlIDxjb2RlPnJ1bnRpbWVUeXBlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IGluIHRoZSBzZXJ2ZXIgY29yZQotICogcGx1Zy1pbi4gUnVudGltZSB0eXBlIG9iamVjdHMgY2Fycnkgbm8gc3RhdGUgKGFsbCBpbmZvcm1hdGlvbiBpcwotICogcmVhZC1vbmx5IGFuZCBpcyBzdXBwbGllZCBieSB0aGUgc2VydmVyIHJ1bnRpbWUgdHlwZSBkZWNsYXJhdGlvbikuCi0gKiBUaGUgZ2xvYmFsIGxpc3Qgb2Yga25vd24gcnVudGltZSB0eXBlcyBpcyBhdmFpbGFibGUgdmlhCi0gKiB7QGxpbmsgU2VydmVyQ29yZSNnZXRSdW50aW1lVHlwZXMoKX0uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogPHA+Ci0gKiBbaXNzdWU6IFdoYXQgdmFsdWUgZG8gcnVudGltZXMgYWRkPwotICogSXQncyBtYWluIHJvbGUgaXMgZm9yIHNldHRpbmcgdXAgdGhlIEphdmEgYnVpbGQgY2xhc3NwYXRoCi0gKiBmb3IgcHJvamVjdHMgaG9sZGluZyBtb2R1bGVzIHRoYXQgbXVzdCBiZSBKYXZhIGNvbXBpbGVkLgotICogSWYgdGhlIG5vdGlvbiBvZiBtb2R1bGUgaXMgdG8gdHJhbnNjZW5kIHRoZSB2YWdhcmllcyBvZiBwYXJ0aWN1bGFyCi0gKiB0eXBlcyBvZiBzZXJ2ZXIsIGFuZCwgaW5kZWVkLCBiZSBwdWJsaXNoZWQgdG8gbXVsdGlwbGUgc2VydmVycwotICogc2ltdWx0YW5lb3VzbHksIHRoZW4gbWF0dGVycyBvZiBidWlsZCBjbGFzc3BhdGggaGFkIGJldHRlciBub3QKLSAqIGJlIHRpZWQgdG8gdGhlIHBhcnRpY3VsYXIgc2VydmVycyBpbnZvbHZlZC5dCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFR3byBydW50aW1lIHR5cGVzIGFyZSBpZGVudGljYWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGlkLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVUeXBlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIHJ1bnRpbWUgdHlwZS4KLQkgKiBFYWNoIGtub3duIHNlcnZlciBydW50aW1lIHR5cGUgaGFzIGEgZGlzdGluY3QgaWQuIAotCSAqIElkcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IGFzIGtleXM7IHRoZXkgYXJlIG5vdAotCSAqIGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lIHR5cGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIHJ1bnRpbWUgdHlwZS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBuYW1lIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgcnVudGltZSB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBydW50aW1lIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgZGVzY3JpcHRpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgcnVudGltZSB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIHZlbmRvciBuYW1lIGZvciB0aGlzIHJ1bnRpbWUgdHlwZS4gSWYgdGhlCi0JICogcnVudGltZSB0eXBlIGRpZCBub3Qgc3BlY2lmaWMgYSB2ZW5kb3IsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBkZXNjcmlwdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSB2ZW5kb3IgbmFtZSBmb3IgdGhpcyBydW50aW1lIHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlbmRvcigpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIHZlcnNpb24gbmFtZSBmb3IgdGhpcyBydW50aW1lIHR5cGUuIElmIHRoZQotCSAqIHJ1bnRpbWUgdHlwZSBkaWQgbm90IHNwZWNpZmljIGEgdmVuZG9yLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgZGVzY3JpcHRpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgdmVyc2lvbiBuYW1lIGZvciB0aGlzIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBtb2R1bGUgdHlwZXMgdGhhdCB0aGlzIHJ1bnRpbWUgdHlwZSBjYW4gc3VwcG9ydC4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBtb2R1bGUgdHlwZXMge0BsaW5rIElNb2R1bGVUeXBlfQotCSAqLwotCXB1YmxpYyBJTW9kdWxlVHlwZVtdIGdldE1vZHVsZVR5cGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBydW50aW1lIHR5cGUgY2FuIGJlIGluc3RhbnRpYXRlZC4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IEl0J3MgdW5jbGVhciB3aGF0IHRoaXMgbWV0aG9kIGlzIGZvci4KLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gY2hlY2tzIHdoZXRoZXIgdGhlICJjbGFzcyIKLQkgKiBhbmQgIndvcmtpbmdDb3B5Q2xhc3MiIGF0dHJpYnV0ZXMgKGJvdGggb3B0aW9uYWwpIHdlcmUgc3BlY2lmaWVkLgotCSAqIFdoYXQgd291bGQgYmUgdGhlIHBvaW50IG9mIGEgcnVudGltZSB0eXBlIHRoYXQgZGlkbid0Ci0JICogaGF2ZSBib3RoIG9mIHRoZXNlIGF0dHJpYnV0ZXMgYW5kIGNvdWxkIG5vdCBiZSAiY3JlYXRlZCI/XQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBvZiBydW50aW1lIGNhbiBiZQotCSAqICAgIGluc3RhbnRpYXRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBjYW5ub3QKLQkgKiBAc2VlICNjcmVhdGVSdW50aW1lKFN0cmluZywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5DcmVhdGUoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSB3b3JraW5nIGNvcHkgaW5zdGFuY2Ugb2YgdGhpcyBydW50aW1lIHR5cGUuCi0JICogQWZ0ZXIgc2V0dGluZyB2YXJpb3VzIHByb3BlcnRpZXMgb2YgdGhlIHdvcmtpbmcgY29weSwKLQkgKiB0aGUgY2xpZW50IHNob3VsZCBjYWxsIHtAbGluayBJUnVudGltZVdvcmtpbmdDb3B5I3NhdmUoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcil9Ci0JICogdG8gYnJpbmcgdGhlIHJ1bnRpbWUgaW5zdGFuY2UgaW50byBleGlzdGVuY2UuCi0JICogPHA+Ci0JICogRGVmYXVsdCB2YWx1ZXMgYXJlIHNldCBieSBjYWxsaW5nIHRoZSBpbnN0YW5jZSdzIGRlbGVnYXRlLgotCSAqIENsaWVudHMgc2hvdWxkIGFzc3VtZSB0aGF0IHRoZSBsb2NhdGlvbiBhbmQgb3RoZXIgcHJvcGVydGllcyBhcmUKLQkgKiBub3Qgc2V0IGFuZCBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0IGJ5IHRoZSBjbGllbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgaWQgdG8gYXNzaWduIHRvIHRoZSBydW50aW1lIGluc3RhbmNlOyB0aGUgZGVmYXVsdCBuYW1lIGlzCi0JICogICAgdXNlZCBpZiBpZCBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiBlbXB0eSBzdHJpbmcKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIG5ldyBydW50aW1lIHdvcmtpbmcgY29weSB3aXRoIHRoZSBnaXZlbiBpZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoaXMgcnVudGltZQotCSAqICAgIG9yIHNldHRpbmcgaXQncyBkZWZhdWx0IHZhbHVlcwotCSAqLwotCXB1YmxpYyBJUnVudGltZVdvcmtpbmdDb3B5IGNyZWF0ZVJ1bnRpbWUoU3RyaW5nIGlkLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWVXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWVXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmY1NjdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIEEgd29ya2luZyBjb3B5IHJ1bnRpbWUgb2JqZWN0IHVzZWQgZm9yIGZvcm11bGF0aW5nIGNoYW5nZXMKLSAqIHRvIGEgcnVudGltZSBpbnN0YW5jZSAoe0BsaW5rIElSdW50aW1lfSkuIENoYW5nZXMgbWFkZSBvbiBhCi0gKiB3b3JraW5nIGNvcHkgZG8gbm90IG9jY3VyIChhbmQgYXJlIG5vdCBwZXJzaXN0ZWQpIHVudGlsIGEKLSAqIHNhdmUoKSBpcyBwZXJmb3JtZWQuCi0gKiA8cD4KLSAqIElmIHRoZSBjbGllbnQgb2YgdGhpcyB3b3JraW5nIGNvcHkgY2FsbHMgbG9hZEFkYXB0ZXIoKSwgYSBuZXcgaW5zdGFuY2Ugb2YKLSAqIHRoZSBkZWxlZ2F0ZSAoUnVudGltZURlbGVnYXRlKSB3aWxsIGJlIGNyZWF0ZWQgdG8gaGVscCB0aGlzIHdvcmtpbmcgY29weS4KLSAqIFRoaXMgZGVsZWdhdGUgaW5zdGFuY2Ugd2lsbCBiZSB1c2VkIGFzIGxvbmcgYXMgdGhpcyB3b3JraW5nIGNvcHkgZXhpc3RzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBJUnVudGltZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lV29ya2luZ0NvcHkgZXh0ZW5kcyBJUnVudGltZSB7Ci0JLyoqCi0JICogU3RhdHVzIGNvZGUgKHZhbHVlIDEpIHJldHVybmVkIGZyb20gdGhlIHNhdmUoKSBtZXRob2Qgd2hlbiB0aGUgc2F2ZQotCSAqIGZhaWxlZCB3aXRoIGZvcmNlIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4gYmVjYXVzZSB0aGUgcnVudGltZSBoYXMKLQkgKiBiZWVuIG1vZGlmaWVkIGFuZCBzYXZlZCBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2VlICNzYXZlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FWRV9DT05GTElDVCA9IDE7Ci0JCi0JLyoqCi0JICogUHJvcGVydHkgY2hhbmdlIG5hbWUgKHZhbHVlICJuYW1lIikgdXNlZCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBydW50aW1lCi0JICogY2hhbmdlcy4KLQkgKiAKLQkgKiBAc2VlICNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICogQHNlZSAjcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAibmFtZSI7Ci0JCi0JLyoqCi0JICogUHJvcGVydHkgY2hhbmdlIG5hbWUgKHZhbHVlICJsb2NhdGlvbiIpIHVzZWQgd2hlbiB0aGUgbG9jYXRpb24gb2YgdGhlCi0JICogcnVudGltZSBjaGFuZ2VzLgotCSAqIAotCSAqIEBzZWUgI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKiBAc2VlICNyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTE9DQVRJT04gPSAibG9jYXRpb24iOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBydW50aW1lLgotCSAqIDxwPgotCSAqIFRoZSBuYW1lIHNob3VsZCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIGEgZGlzcGxheWFibGUgbmFtZQotCSAqIEBzZWUgSVJ1bnRpbWUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0JCi0JLyoqCi0JICogU2V0cyBvciB1bnNldHMgd2hldGhlciB0aGlzIHJ1bnRpbWUgaXMgbWFya2VkIGFzIHJlYWQgb25seS4KLQkgKiBXaGVuIGEgcnVudGltZSBpcyByZWFkIG9ubHksIHdvcmtpbmcgY29waWVzIGNhbiBiZSBjcmVhdGVkIGJ1dAotCSAqIHRoZXkgY2Fubm90IGJlIHNhdmVkLgotCSAqCi0JICogQHBhcmFtIHJlYWRPbmx5IDxjb2RlPnRydWU8L2NvZGU+IHRvIHNldCB0aGlzIHJ1bnRpbWUgdG8gYmUgbWFya2VkCi0JICogICAgcmVhZCBvbmx5LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVuc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgd29ya2luZyBjb3B5IGhhcyB1bnNhdmVkIGNoYW5nZXMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHdvcmtpbmcgY29weSBoYXMgdW5zYXZlZAotCSAqICAgIGNoYW5nZXMsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpOwotCi0JLyoqCi0JICogQWRkcyBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIHJ1bnRpbWUuCi0JICogPHA+Ci0JICogT25jZSByZWdpc3RlcmVkLCBhIGxpc3RlbmVyIHN0YXJ0cyByZWNlaXZpbmcgbm90aWZpY2F0aW9uIG9mIAotCSAqIHByb3BlcnR5IGNoYW5nZXMgdG8gdGhpcyBydW50aW1lLiBUaGUgbGlzdGVuZXIgY29udGludWVzIHRvIHJlY2VpdmUKLQkgKiBub3RpZmljYXRpb25zIHVudGlsIGl0IGlzIHJlbW92ZWQuCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqIEBzZWUgI3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgcnVudGltZS4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqIEBzZWUgI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBpbnN0YW5jZSB0aGF0IHRoaXMgd29ya2luZyBjb3B5IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqIDxwPgotCSAqIEZvciBhIHJ1bnRpbWUgd29ya2luZyBjb3B5IGNyZWF0ZWQgYnkgYSBjYWxsIHRvCi0JICoge0BsaW5rIElSdW50aW1lI2NyZWF0ZVdvcmtpbmdDb3B5KCl9LAotCSAqIDxjb2RlPnRoaXMuZ2V0T3JpZ2luYWwoKTwvY29kZT4gcmV0dXJucyB0aGUgb3JpZ2luYWwKLQkgKiBydW50aW1lIG9iamVjdC4gRm9yIGEgcnVudGltZSB3b3JraW5nIGNvcHkganVzdCBjcmVhdGVkIGJ5Ci0JICogYSBjYWxsIHRvIHtAbGluayBJUnVudGltZVR5cGUjY3JlYXRlUnVudGltZShTdHJpbmcsIElQcm9ncmVzc01vbml0b3IpfSwKLQkgKiA8Y29kZT50aGlzLmdldE9yaWdpbmFsKCk8L2NvZGU+IHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFzc29jaWF0ZWQgcnVudGltZSBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJUnVudGltZSBnZXRPcmlnaW5hbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gdG8gdGhlIHJvb3Qgb2YgdGhlIHJ1bnRpbWUsCi0JICogdHlwaWNhbGx5IHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiAKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCB0aGUgbG9jYXRpb24gb2YgdGhpcyBydW50aW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHNlZSBJUnVudGltZSNnZXRMb2NhdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSVBhdGggcGF0aCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBydW50aW1lIGlzIGEgc3R1YiAodXNlZCBmb3IgY29tcGlsYXRpb24gb25seSkKLQkgKiBvciBhIGZ1bGwgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3R1YiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJ1bnRpbWUgaXMgYSBzdHViLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3R1Yihib29sZWFuIHN0dWIpOwotCi0JLyoqCi0JICogQ29tbWl0cyB0aGUgY2hhbmdlcyBtYWRlIGluIHRoaXMgd29ya2luZyBjb3B5LiBJZiB0aGVyZSBpcwotCSAqIG5vIGV4dGFudCBydW50aW1lIGluc3RhbmNlIHdpdGggYSBtYXRjaGluZyBpZCBhbmQgcnVudGltZQotCSAqIHR5cGUsIHRoaXMgd2lsbCBjcmVhdGUgYSBydW50aW1lIGluc3RhbmNlIHdpdGggYXR0cmlidXRlcwotCSAqIHRha2VuIGZyb20gdGhpcyB3b3JraW5nIGNvcHksIGFuZCByZXR1cm4gdGhhdCBvYmplY3QuCi0JICogPHA+Ci0JICogSWYgdGhlcmUgYW4gZXhpc3RpbmcgcnVudGltZSBpbnN0YW5jZSB3aXRoIGEgbWF0Y2hpbmcgaWQgYW5kCi0JICogcnVudGltZSB0eXBlLCB0aGlzIHdpbGwgY2hhbmdlIHRoZSBydW50aW1lIGluc3RhbmNlIGFjY29yZGluZ2x5LgotCSAqIFRoZSByZXR1cm5lZCBydW50aW1lIHdpbGwgYmUgdGhlIHNhbWUgcnVudGltZSB0aGlzIGlzIHJldHVybmVkCi0JICogZnJvbSBnZXRPcmlnaW5hbCgpLCBhZnRlciB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gYXBwbGllZC4KLQkgKiBPdGhlcndpc2UsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBydW50aW1lLgotCSAqIDwvcD4KLQkgKiBSdW50aW1lcyBjYW4gYmUgc2F2ZWQgZXZlbiB3aGVuIHRoZXkgaGF2ZSBpbnZhbGlkIHByb3BlcnRpZXMuIEl0Ci0JICogaXMgdGhlIGNsaWVudHMgcmVzcG9uc2liaWxpdHkgdG8gY2FsbCB2YWxpZGF0ZSgpIG9yIGNoZWNrIHRoZQotCSAqIHByb3BlcnRpZXMgYmVmb3JlIHNhdmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2UgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZm9yY2UgdGhlIHNhdmUsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgbmV3IHJ1bnRpbWUgaW5zdGFuY2UKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIHNhdmUgY291bGQgbm90IGJlIGNvbXBsZXRlZAotCSAqIEBzZWUgI1NBVkVfQ09ORkxJQ1QKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWUgc2F2ZShib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxODE3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2VydmVyIGluc3RhbmNlLiBFdmVyeSBzZXJ2ZXIgaXMgYW4gaW5zdGFuY2Ugb2YgYQotICogcGFydGljdWxhciwgZml4ZWQgc2VydmVyIHR5cGUuCi0gKiA8cD4KLSAqIE5vdCBzdXJwcmlzaW5nbHksIHRoZSBub3Rpb24gb2YgPGI+c2VydmVyPC9iPiBpcyBjZW50cmFsIGluIHRoZSB3ZWIgdG9vbHMKLSAqIHNlcnZlciBpbmZyYXN0cnVjdHVyZS4gSW4gdGhpcyBjb250ZXh0LCB1bmRlcnN0YW5kIHRoYXQgYSBzZXJ2ZXIgaXMKLSAqIGEgd2ViIHNlcnZlciBvZiBzb21lIGlsay4gSXQgY291bGQgYmUgYSBzaW1wbGUgd2ViIHNlcnZlciBsYWNraW5nIEphdmEKLSAqIHN1cHBvcnQsIG9yIGFuIEoyRUUgYmFzZWQgc2VydmVyLCBvciBwZXJoYXBzIGV2ZW4gc29tZSBraW5kIG9mIGRhdGFiYXNlCi0gKiBzZXJ2ZXIuIEEgbW9yZSBleGFjdCBkZWZpbml0aW9uIGlzIG5vdCByZXF1aXJlZCBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgQVBJLgotICogRnJvbSBhIHRvb2wtY2VudHJpYyBwb2ludCBvZiB2aWV3LCBhIHNlcnZlcgotICogaXMgc29tZXRoaW5nIHRoYXQgdGhlIGRldmVsb3BlciBpcyB3cml0aW5nICJjb250ZW50IiBmb3IuCi0gKiBUaGUgdW5pdCBvZiBjb250ZW50IGlzIHRlcm1lZCBhIG1vZHVsZS4KLSAqIEluIGEgc2Vuc2UsIHRoZSBzZXJ2ZXIgZXhpc3RzLCBidXQgbGFja3MgdXNlZnVsIGNvbnRlbnQuIFRoZQotICogZGV2ZWxvcG1lbnQgdGFzayBpcyB0byBwcm92aWRlIHRoYXQgY29udGVudC4gVGhlIGNvbnRlbnQgY2FuIGluY2x1ZGUKLSAqIGFueXRoaW5nIGZyb20gc2ltcGxlLCBzdGF0aWMgSFRNTCB3ZWIgcGFnZXMgdG8gY29tcGxleCwgaGlnaGx5IGR5bmFtaWMKLSAqIHdlYiBhcHBsaWNhdGlvbnMuCi0gKiBJbiB0aGUgY291cnNlIG9mIHdyaXRpbmcgYW5kIGRlYnVnZ2luZyB0aGlzIGNvbnRlbnQsCi0gKiB0aGUgZGV2ZWxvcGVyIHdpbGwgd2FudCB0byB0ZXN0IHRoZWlyIGNvbnRlbnQgb24gYSB3ZWIgc2VydmVyLCB0byBzZWUgaG93IGl0Ci0gKiBnZXRzIHNlcnZlZCB1cC4gRm9yIHRoaXMgdGhleSB3aWxsIG5lZWQgdG8gbGF1bmNoIGEgc2VydmVyIHByb2Nlc3MgcnVubmluZyBvbgotICogc29tZSBob3N0IG1hY2hpbmUgKG9mdGVuIHRoZSBsb2NhbCBob3N0IG9uIHdoaWNoIHRoZSBJREUgaXMgcnVubmluZyksIG9yCi0gKiBhdHRhY2ggdG8gYSBzZXJ2ZXIgdGhhdCdzIGFscmVhZHkgcnVubmluZyBvbiBhIHJlbW90ZSAob3IgbG9jYWwpIGhvc3QuIAotICogVGhlIG5ld2x5IGRldmVsb3BlZCBjb250ZW50IHNpdHRpbmcgaW4gdGhlIGRldmVsb3BlcidzIHdvcmtzcGFjZSBuZWVkcyB0bwotICogZW5kIHVwIGluIGEgbG9jYXRpb24gYW5kIGZvcm1hdCB0aGF0IHRoZSBydW5uaW5nIHNlcnZlciBjYW4gdXNlIGZvciBpdHMKLSAqIHNlcnZpbmcgcHVycG9zZXMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEluIHRoaXMgcGljdHVyZSwgYW4gPGNvZGU+SVNlcnZlcjwvY29kZT4gb2JqZWN0IGlzIGEgcHJveHkgZm9yIHRoZSByZWFsIHdlYgotICogc2VydmVyLiBUaHJvdWdoIHRoaXMgcHJveHksIGEgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHNlcnZlciwgYW5kIHN0YXJ0LAotICogc3RvcCwgYW5kIHJlc3RhcnQgaXQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBzZXJ2ZXIgZnJhbWV3b3JrIG1haW50YWlucyBhIGdsb2JhbCBsaXN0IG9mIGFsbCBrbm93biBzZXJ2ZXIgaW5zdGFuY2VzCi0gKiAoe0BsaW5rIFNlcnZlckNvcmUjZ2V0U2VydmVycygpfSkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFtyb3VnaCBub3RlczoKLSAqIFNlcnZlciBoYXMgYSBzdGF0ZS4KLSAqIFNlcnZlciBjYW4gYmUgc3RhcnRlZCwgc3RvcHBlZCwgYW5kIHJlc3RhcnRlZC4KLSAqIFRvIG1vZGlmeSBzZXJ2ZXIgYXR0cmlidXRlcywgZ2V0IGEgd29ya2luZyBjb3B5LCBtb2RpZnkgaXQsIGFuZCB0aGVuIHNhdmUgaXQKLSAqIHRvIGNvbW1pdCB0aGUgY2hhbmdlcy4KLSAqIFNlcnZlciBhdHRyaWJ1dGVzLiBTZXJpYWxpemF0aW9uLgotICogQ2hhaW5lZCB3b3JraW5nIGNvcGllcyBmb3IgcnVudGltZSwgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0gKiBTZXJ2ZXIgaGFzIGEgc2V0IG9mIHJvb3QgbW9kdWxlcy4KLSAqIE1vZHVsZXMgaGF2ZSBzdGF0ZSB3cnQgYSBzZXJ2ZXIuCi0gKiBSZXN0YXJ0aW5nIG1vZHVsZXMuCi0gKiBdCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFR3byBzZXJ2ZXJzIGFyZSBpZGVudGljYWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGlkLgotICogPC9wPgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyIGV4dGVuZHMgSVNlcnZlckF0dHJpYnV0ZXMsIElTY2hlZHVsaW5nUnVsZSB7Ci0JLyoqCi0JICogQW4gb3BlcmF0aW9uIGxpc3RlbmVyIGlzIHVzZWQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gYmFjayBhYm91dCBhCi0JICogc3BlY2lmaWMgc2VydmVyIG9wZXJhdGlvbiwgc3VjaCBhcyBzdGFydGluZyBvciBzdG9wcGluZyBhIHNlcnZlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uTGlzdGVuZXIgewotCQkvKioKLQkJICogQ2FsbGVkIG9uY2Ugd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgotCQkgKiAKLQkJICogQHBhcmFtIHJlc3VsdCBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0JCSAqICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdAotCQkgKiAgICBpbmRpY2F0aW5nIHdoeSBpdCBkaWRuJ3QKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpOwotCX0KLQotCS8qKgotCSAqIFNlcnZlciBzdGF0ZSBjb25zdGFudCAodmFsdWUgMCkgaW5kaWNhdGluZyB0aGF0IHRoZQotCSAqIHNlcnZlciBpcyBpbiBhbiB1bmtub3duIHN0YXRlLgotCSAqIAotCSAqIEBzZWUgI2dldFNlcnZlclN0YXRlKCkKLQkgKiBAc2VlICNnZXRNb2R1bGVTdGF0ZShJTW9kdWxlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVU5LTk9XTiA9IDA7Ci0KLQkvKioKLQkgKiBTZXJ2ZXIgc3RhdGUgY29uc3RhbnQgKHZhbHVlIDEpIGluZGljYXRpbmcgdGhhdCB0aGUKLQkgKiBzZXJ2ZXIgaXMgc3RhcnRpbmcsIGJ1dCBub3QgeWV0IHJlYWR5IHRvIHNlcnZlIGNvbnRlbnQuCi0JICogCi0JICogQHNlZSAjZ2V0U2VydmVyU3RhdGUoKQotCSAqIEBzZWUgI2dldE1vZHVsZVN0YXRlKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVEFSVElORyA9IDE7Ci0KLQkvKioKLQkgKiBTZXJ2ZXIgc3RhdGUgY29uc3RhbnQgKHZhbHVlIDIpIGluZGljYXRpbmcgdGhhdCB0aGUKLQkgKiBzZXJ2ZXIgaXMgcmVhZHkgdG8gc2VydmUgY29udGVudC4KLQkgKiAKLQkgKiBAc2VlICNnZXRTZXJ2ZXJTdGF0ZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlU3RhdGUoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NUQVJURUQgPSAyOwotCi0JLyoqCi0JICogU2VydmVyIHN0YXRlIGNvbnN0YW50ICh2YWx1ZSAzKSBpbmRpY2F0aW5nIHRoYXQgdGhlCi0JICogc2VydmVyIGlzIHNodXR0aW5nIGRvd24uCi0JICogCi0JICogQHNlZSAjZ2V0U2VydmVyU3RhdGUoKQotCSAqIEBzZWUgI2dldE1vZHVsZVN0YXRlKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVE9QUElORyA9IDM7Ci0KLQkvKioKLQkgKiBTZXJ2ZXIgc3RhdGUgY29uc3RhbnQgKHZhbHVlIDQpIGluZGljYXRpbmcgdGhhdCB0aGUKLQkgKiBzZXJ2ZXIgaXMgc3RvcHBlZC4KLQkgKiAKLQkgKiBAc2VlICNnZXRTZXJ2ZXJTdGF0ZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlU3RhdGUoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NUT1BQRUQgPSA0OwotCi0JLyoqCi0JICogUHVibGlzaCBzdGF0ZSBjb25zdGFudCAodmFsdWUgMCkgaW5kaWNhdGluZyB0aGF0IGl0J3MKLQkgKiBpbiBhbiB1bmtub3duIHN0YXRlLgotCSAqIAotCSAqIEBzZWUgI2dldFNlcnZlclB1Ymxpc2hTdGF0ZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlUHVibGlzaFN0YXRlKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSVNIX1NUQVRFX1VOS05PV04gPSAwOwotCi0JLyoqCi0JICogUHVibGlzaCBzdGF0ZSBjb25zdGFudCAodmFsdWUgMSkgaW5kaWNhdGluZyB0aGF0IHRoZXJlCi0JICogaXMgbm8gcHVibGlzaCByZXF1aXJlZC4KLQkgKiAKLQkgKiBAc2VlICNnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKQotCSAqIEBzZWUgI2dldE1vZHVsZVB1Ymxpc2hTdGF0ZShJTW9kdWxlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElTSF9TVEFURV9OT05FID0gMTsKLQotCS8qKgotCSAqIFB1Ymxpc2ggc3RhdGUgY29uc3RhbnQgKHZhbHVlIDIpIGluZGljYXRpbmcgdGhhdCBhbgotCSAqIGluY3JlbWVudGFsIHB1Ymxpc2ggaXMgcmVxdWlyZWQuCi0JICogCi0JICogQHNlZSAjZ2V0U2VydmVyUHVibGlzaFN0YXRlKCkKLQkgKiBAc2VlICNnZXRNb2R1bGVQdWJsaXNoU3RhdGUoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfU1RBVEVfSU5DUkVNRU5UQUwgPSAyOwotCi0JLyoqCi0JICogUHVibGlzaCBzdGF0ZSBjb25zdGFudCAodmFsdWUgMykgaW5kaWNhdGluZyB0aGF0IGEKLQkgKiBmdWxsIHB1Ymxpc2ggaXMgcmVxdWlyZWQuCi0JICogCi0JICogQHNlZSAjZ2V0U2VydmVyUHVibGlzaFN0YXRlKCkKLQkgKiBAc2VlICNnZXRNb2R1bGVQdWJsaXNoU3RhdGUoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfU1RBVEVfRlVMTCA9IDM7Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGtpbmQgY29uc3RhbnQgKHZhbHVlIDEpIGluZGljYXRpbmcgYW4gaW5jcmVtZW50YWwgcHVibGlzaCByZXF1ZXN0LgotCSAqIAotCSAqIEBzZWUgI3B1Ymxpc2goaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfSU5DUkVNRU5UQUwgPSAxOwotCi0JLyoqCi0JICogUHVibGlzaCBraW5kIGNvbnN0YW50ICh2YWx1ZSAyKSBpbmRpY2F0aW5nIGEgZnVsbCBwdWJsaXNoIHJlcXVlc3QuCi0JICogCi0JICogQHNlZSAjcHVibGlzaChpbnQsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElTSF9GVUxMID0gMjsKLQotCS8qKgotCSAqIFB1Ymxpc2gga2luZCBjb25zdGFudCAodmFsdWUgMykgaW5kaWNhdGluZyBhbiBhdXRvbWF0aWMgcHVibGlzaCByZXF1ZXN0LgotCSAqIAotCSAqIEBzZWUgI3B1Ymxpc2goaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfQVVUTyA9IDM7Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGtpbmQgY29uc3RhbnQgKHZhbHVlIDQpIGluZGljYXRpbmcgYSBwdWJsaXNoIGNsZWFuIHJlcXVlc3QKLQkgKiAKLQkgKiBAc2VlICNwdWJsaXNoKGludCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSVNIX0NMRUFOID0gNDsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyBzZXJ2ZXIuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgb3BlcmF0aW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgZmFzdAotCSAqIChpdCBkb2VzIG5vdCBhY3R1YWxseSBjb21tdW5pY2F0ZSB3aXRoIGFueSBhY3R1YWwKLQkgKiBzZXJ2ZXIpLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBzZXJ2ZXIgc3RhdGUgKDxjb2RlPlNUQVRFX1hYWDwvY29kZT4pCi0JICogY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBJU2VydmVyfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2VydmVyU3RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElMYXVuY2hNYW5hZ2VyIG1vZGUgdGhhdCB0aGUgc2VydmVyIGlzIGluLiBUaGlzIG1ldGhvZCB3aWxsCi0JICogcmV0dXJuIG51bGwgaWYgdGhlIHNlcnZlciBpcyBub3QgcnVubmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGlzIHJ1bm5pbmcsIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMKLQkgKiAgICBkZWZpbmVkIGJ5IHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfSwgb3IKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHN0b3BwZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIncyBzeW5jIHN0YXRlLgotCSAqCi0JICogQHJldHVybiBvbmUgb2YgdGhlIFBVQkxJU0hfWFhYIHN0YXRlIGZsYWdzCi0JICovCi0JcHVibGljIGludCBnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIHNlcnZlciBzdGF0ZSBsaXN0ZW5lciB0byB0aGlzIHNlcnZlci4KLQkgKiBPbmNlIHJlZ2lzdGVyZWQsIGEgbGlzdGVuZXIgc3RhcnRzIHJlY2VpdmluZyBub3RpZmljYXRpb24gb2YgCi0JICogc3RhdGUgY2hhbmdlcyB0byB0aGlzIHNlcnZlci4gVGhlIGxpc3RlbmVyIGNvbnRpbnVlcyB0byByZWNlaXZlCi0JICogbm90aWZpY2F0aW9ucyB1bnRpbCBpdCBpcyByZW1vdmVkLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgc2VydmVyIGxpc3RlbmVyCi0JICogQHNlZSAjcmVtb3ZlU2VydmVyTGlzdGVuZXIoSVNlcnZlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlcnZlckxpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBzZXJ2ZXIgc3RhdGUgbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICogT25jZSByZWdpc3RlcmVkLCBhIGxpc3RlbmVyIHN0YXJ0cyByZWNlaXZpbmcgbm90aWZpY2F0aW9uIG9mIAotCSAqIHN0YXRlIGNoYW5nZXMgdG8gdGhpcyBzZXJ2ZXIuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZQotCSAqIG5vdGlmaWNhdGlvbnMgdW50aWwgaXQgaXMgcmVtb3ZlZC4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHNlcnZlciBsaXN0ZW5lcgotCSAqIEBwYXJhbSBldmVudE1hc2sgdGhlIGJpdC13aXNlIE9SIG9mIGFsbCBldmVudCB0eXBlcyBvZiBpbnRlcmVzdCB0byB0aGUKLQkgKiBsaXN0ZW5lcgotCSAqIEBzZWUgI3JlbW92ZVNlcnZlckxpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIsIGludCBldmVudE1hc2spOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gc2VydmVyIHN0YXRlIGxpc3RlbmVyIGZyb20gdGhpcyBzZXJ2ZXIuIEhhcyBubwotCSAqIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotCSAqIEBzZWUgI2FkZFNlcnZlckxpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQWRkcyBhIHB1Ymxpc2ggbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBwdWJsaXNoIGxpc3RlbmVyCi0JICogQHNlZSAjcmVtb3ZlUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHB1Ymxpc2ggbGlzdGVuZXIgZnJvbSB0aGlzIHNlcnZlci4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgcHVibGlzaCBsaXN0ZW5lcgotCSAqIEBzZWUgI2FkZFB1Ymxpc2hMaXN0ZW5lcihJUHVibGlzaExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihJUHVibGlzaExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlcnZlciBpcyBpbiBhIHN0YXRlIHRoYXQgaXQgY2FuCi0JICogYmUgcHVibGlzaGVkIHRvLgotCSAqCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgY2FuCi0JICogICBiZSBwdWJsaXNoZWQgdG8sIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuUHVibGlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHB1Ymxpc2hlZCB0by4gVGhpcyBpcyA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHRoZSBzZXJ2ZXIKLQkgKiBjYW4gYmUgcHVibGlzaGVkIHRvIGFuZCB0aGUgc2VydmVyJ3MgcHVibGlzaCBzdGF0ZSBvciBhbnkgbW9kdWxlJ3MgcHVibGlzaCBzdGF0ZSBpcyBub3QKLQkgKiBQVUJMSVNIX1NUQVRFX05PTkUuIAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRQdWJsaXNoKCk7Ci0KLQkvKioKLQkgKiBQdWJsaXNoIHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIHByb2dyZXNzIG1vbml0b3IuIFRoZSByZXN1bHQgb2YgdGhlCi0JICogcHVibGlzaCBvcGVyYXRpb24gaXMgcmV0dXJuZWQgYXMgYW4gSVN0YXR1cy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuIFB1Ymxpc2hpbmcgaXMgbG9uZy0KLQkgKiBydW5uaW5nIGFuZCBtYXkgdHJpZ2dlciByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzIG9yIGJ1aWxkcy4gQWx0aG91Z2ggdGhpcwotCSAqIGZyYW1ld29yayBpcyBzYWZlLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBvdGhlciBidW5kbGVzIGFyZSBVSS1zYWZlCi0JICogYW5kIHRoZSByaXNrIG9mIFVJIGRlYWRsb2NrIGlzIGhpZ2guIAotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBTaW5jZSB0aGlzIG1ldGhvZCBpcyBzeW5jaHJvbm91cyBhbmQgcmVxdWlyZXMgYWNjZXNzIHRvIHRoZSB3b3Jrc3BhY2UsCi0JICogaXQgd2lsbCBibG9jayB1bnRpbCBpdCBjYW4gYWNjZXNzIGEgcmVzb3VyY2UgYW5kIHNlcnZlciBzY2hlZHVsaW5nIGxvY2suCi0JICogVG8gcHVibGlzaCBhc3luY2hyb25vdXNseSB1c2luZyBhIGpvYiwgdXNlIHRoZSBhbHRlcm5hdGUgcHVibGlzaCgpIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgcHVibGlzaCBiZWluZyByZXF1ZXN0ZWQuIFZhbGlkIHZhbHVlcyBhcmU6Ci0JICogICAgPHVsPgotCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0ZVTEw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBmdWxsIHB1Ymxpc2guPC9saT4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9JTkNSRU1FTlRBTDwvY29kZT4tIGluZGljYXRlcyBhIGluY3JlbWVudGFsIHB1Ymxpc2guCi0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfQ0xFQU48L2NvZGU+LSBpbmRpY2F0ZXMgYSBjbGVhbiByZXF1ZXN0LiBDbGVhbiB0aHJvd3MKLQkgKiAgICAgIG91dCBhbGwgc3RhdGUgYW5kIGNsZWFucyB1cCB0aGUgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgYmVmb3JlIGRvaW5nIGEKLQkgKiAgICAgIGZ1bGwgcHVibGlzaC4KLQkgKiAgICA8L3VsPgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIHdoYXQgKGlmIGFueXRoaW5nKSB3ZW50IHdyb25nCi0JICogQHNlZSAjcHVibGlzaChpbnQsIExpc3QsIElBZGFwdGFibGUsIElPcGVyYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwdWJsaXNoKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUHVibGlzaCBvbmUgb3IgbW9yZSBtb2R1bGVzIHRvIHRoZSBzZXJ2ZXIuCi0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiBsaXN0ZW5lciBjYW4gYmUgdXNlZCB0byBhZGQgYSBsaXN0ZW5lciBmb3Igbm90aWZpY2F0aW9uCi0JICogb2YgdGhlIHB1Ymxpc2ggcmVzdWx0LiBUaGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCBhCi0JICogc2luZ2xlIHN1Y2Nlc3NmdWwgc3RhdHVzIChzZXZlcml0eSBPSykgd2hlbiB0aGUgc2VydmVyIGhhcwotCSAqIGZpbmlzaGVkIHB1Ymxpc2hpbmcsIG9yIGEgc2luZ2xlIGZhaWx1cmUgKHNldmVyaXR5IEVSUk9SKSBpZgotCSAqIHRoZXJlIHdhcyBhbiBlcnJvciBwdWJsaXNoaW5nIHRvIHRoZSBzZXJ2ZXIuCi0JICogPC9wPjxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZC4gUHVibGlzaGluZyBpcyBsb25nLQotCSAqIHJ1bm5pbmcgYW5kIG1heSB0cmlnZ2VyIHJlc291cmNlIGNoYW5nZSBldmVudHMgb3IgYnVpbGRzLiBBbHRob3VnaCB0aGlzCi0JICogZnJhbWV3b3JrIGlzIHNhZmUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IG90aGVyIGJ1bmRsZXMgYXJlIFVJLXNhZmUKLQkgKiBhbmQgdGhlIHJpc2sgb2YgVUkgZGVhZGxvY2sgaXMgaGlnaC4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIHB1Ymxpc2ggYmVpbmcgcmVxdWVzdGVkLiBWYWxpZCB2YWx1ZXMgYXJlOgotCSAqICAgIDx1bD4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9GVUxMPC9jb2RlPi0gaW5kaWNhdGVzIGEgZnVsbCBwdWJsaXNoLjwvbGk+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfSU5DUkVNRU5UQUw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBpbmNyZW1lbnRhbCBwdWJsaXNoLgotCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0NMRUFOPC9jb2RlPi0gaW5kaWNhdGVzIGEgY2xlYW4gcmVxdWVzdC4gQ2xlYW4gdGhyb3dzCi0JICogICAgICBvdXQgYWxsIHN0YXRlIGFuZCBjbGVhbnMgdXAgdGhlIG1vZHVsZSBvbiB0aGUgc2VydmVyIGJlZm9yZSBkb2luZyBhCi0JICogICAgICBmdWxsIHB1Ymxpc2guCi0JICogICAgPC91bD4KLQkgKiBAcGFyYW0gbW9kdWxlcyBhIGxpc3Qgb2YgbW9kdWxlcyB0byBwdWJsaXNoLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgIHB1Ymxpc2ggYWxsIG1vZHVsZXMKLQkgKiBAcGFyYW0gaW5mbyB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZQotCSAqICAgIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUKLQkgKiAgICB1c2VyIGlmIG5lY2Vzc2FyeS4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3QKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIKLQkgKiAgICBmb3IgdGhlIFNoZWxsIGNsYXNzLgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhbiBvcGVyYXRpb24gbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiB0aGlzCi0JICogICAgb3BlcmF0aW9uIGlzIGRvbmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdGlmaWNhdGlvbiBpcyBub3QKLQkgKiAgICByZXF1aXJlZAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWJsaXNoKGludCBraW5kLCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlcywgSUFkYXB0YWJsZSBpbmZvLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2VydmVyIGlzIGluIGEgc3RhdGUgdGhhdCBpdCBjYW4KLQkgKiBiZSBzdGFydGVkIGluIHRoZSBnaXZlbiBtb2RlLgotCSAqCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgYSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGNhbiBiZSBsYXVuY2hlZCwKLQkgKiAgICBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzIGRlZmluZWQgYnkKLQkgKiAgICB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0KLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIHNlcnZlciBjYW4KLQkgKiAgICBiZSBzdGFydGVkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2h5IGl0IGNhbid0Ci0JICovCi0JcHVibGljIElTdGF0dXMgY2FuU3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUpOwotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgc3RhcnRzIHRoaXMgc2VydmVyIGluIHRoZSBnaXZlbiBsYXVuY2ggbW9kZS4KLQkgKiA8cD4KLQkgKiBJZiBjYW5TdGFydChsYXVuY2hNb2RlKSBpcyBmYWxzZSwgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbgotCSAqIGV4Y2VwdGlvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhlIGNhbGxlciB3YW50cyB0byBsaXN0ZW4gZm9yIGZhaWx1cmUgb3Igc3VjY2VzcyBvZiB0aGUKLQkgKiBzZXJ2ZXIgc3RhcnRpbmcsIGl0IGNhbiBhZGQgYSBzZXJ2ZXIgbGlzdGVuZXIgb3IgdXNlIHRoZQotCSAqIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgdGhhdCB0YWtlcyBhbiBvcGVyYXRpb24gbGlzdGVuZXIgYXMgYQotCSAqIHBhcmFtZXRlci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byBzdGFydCB0aGUgc2VydmVyCi0JICogQHNlZSAjc3RhcnQoU3RyaW5nLCBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHN0YXJ0cyB0aGlzIHNlcnZlciBpbiB0aGUgZ2l2ZW4gbGF1bmNoIG1vZGUuCi0JICogPHA+Ci0JICogSWYgY2FuU3RhcnQobGF1bmNoTW9kZSkgaXMgZmFsc2UsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBvcGVyYXRpb24gbGlzdGVuZXIgY2FuIGJlIHVzZWQgdG8gYWRkIGEgbGlzdGVuZXIgZm9yIG5vdGlmaWNhdGlvbgotCSAqIG9mIHRoaXMgc3BlY2lmaWMgc2VydmVyIGxhdW5jaC4gVGhlIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIHdpdGggYQotCSAqIHNpbmdsZSBzdWNjZXNzZnVsIHN0YXR1cyAoc2V2ZXJpdHkgT0spIHdoZW4gdGhlIHNlcnZlciBoYXMKLQkgKiBmaW5pc2hlZCBzdGFydGluZywgb3IgYSBzaW5nbGUgZmFpbHVyZSAoc2V2ZXJpdHkgRVJST1IpIGlmCi0JICogdGhlcmUgd2FzIGFuIGVycm9yIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBjYW4gYmUgbGF1bmNoZWQsCi0JICogICAgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cyBkZWZpbmVkIGJ5Ci0JICogICAge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9Ci0JICogQHBhcmFtIGxpc3RlbmVyIGFuIG9wZXJhdGlvbiBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiB3aGVuIHRoaXMKLQkgKiAgICBvcGVyYXRpb24gaXMgZG9uZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90aWZpY2F0aW9uIGlzIG5vdAotCSAqICAgIHJlcXVpcmVkCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUsIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHJlc3RhcnRlZCBpbiB0aGUgZ2l2ZW4gbW9kZS4gTm90ZSB0aGF0IG9ubHkgc2VydmVycwotCSAqIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nIGNhbiBiZSByZXN0YXJ0ZWQuCi0JICoKLQkgKiBAcGFyYW0gbW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgc2VydmVyIGNhbgotCSAqICAgIGJlIHJlc3RhcnRlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoeSBpdCBjYW4ndAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhblJlc3RhcnQoU3RyaW5nIG1vZGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHJlc3RhcnRlZC4gVGhpcyBpcyA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHRoZSBzZXJ2ZXIKLQkgKiBjYW4gYmUgcmVzdGFydGVkIGFuZCB0aGUgc2VydmVyJ3MgcmVzdGFydCBzdGF0ZSBvciBhbnkgbW9kdWxlJ3MgcmVzdGFydCBzdGF0ZXMgaXMgbm90Ci0JICogZmFsc2UuIAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZXN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgb3V0IG9mIHN5bmMgYW5kIG5lZWRzIHRvIGJlCi0JICogcmVzdGFydGVkLiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBmYWxzZSB3aGVuIHRoZQotCSAqIHNlcnZlciBpcyBub3QgcnVubmluZy4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IE5lZWQgdG8gZXhwbGFpbiB3aGF0IGlzIGl0IHRoYXQgY2FuIGdldCBvdXQgb2YKLQkgKiAib3V0IG9mIHN5bmMiIGhlcmUsIGFuZCBob3cgdGhpcyBjYW4gaGFwcGVuLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlcnZlciBpcyBvdXQgb2Ygc3luYyBhbmQgbmVlZHMgdG8gYmUKLQkgKiByZXN0YXJ0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlIChlLmcuLCBpZiB0aGUgY29udGVudHMgaGF2ZQotCSAqIG5vdCBiZWVuIG1vZGlmaWVkIGFuZCB0aGUgc2VydmVyIHByb2Nlc3MgaXMgc3RpbGwgaW4gc3luYyk7IHRoZQotCSAqIHJlc3VsdCBpcyB1bnNwZWNpZmllZCBpZiB0aGUgc2VydmVyIGlzIG5vdCBjdXJyZW50bHkgcnVubmluZwotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNlcnZlclJlc3RhcnRTdGF0ZSgpOwotCi0JLyoqCi0JICogU3luY2hyb25vdXNseSByZXN0YXJ0cyB0aGlzIHNlcnZlci4gVGhpcyBvcGVyYXRpb24gZG9lcwotCSAqIG5vdGhpbmcgaWYgdGhpcyBzZXJ2ZXIgY2Fubm90IGJlIHN0b3BwZWQgKHtAbGluayAjY2FuUmVzdGFydChTdHJpbmcpfQotCSAqIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIgZnJvbSBhIHN0b3BwZWQgc3RhdGUuCi0JICogPHA+Ci0JICogSWYgdGhlIGNhbGxlciB3YW50cyB0byBsaXN0ZW4gZm9yIGZhaWx1cmUgb3Igc3VjY2VzcyBvZiB0aGUKLQkgKiBzZXJ2ZXIgcmVzdGFydGluZywgaXQgY2FuIGFkZCBhIHNlcnZlciBsaXN0ZW5lciBvciB1c2UgdGhlCi0JICogdmVyc2lvbiBvZiB0aGlzIG1ldGhvZCB0aGF0IHRha2VzIGFuIG9wZXJhdGlvbiBsaXN0ZW5lciBhcyBhCi0JICogcGFyYW1ldGVyLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBjYW4gYmUgbGF1bmNoZWQsCi0JICogICAgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cyBkZWZpbmVkIGJ5Ci0JICogICAge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEBzZWUgI3Jlc3RhcnQoU3RyaW5nLCBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0KFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgcmVzdGFydHMgdGhpcyBzZXJ2ZXIuIFRoaXMgb3BlcmF0aW9uIGRvZXMKLQkgKiBub3RoaW5nIGlmIHRoaXMgc2VydmVyIGNhbm5vdCBiZSBzdG9wcGVkICh7QGxpbmsgI2NhblJlc3RhcnQoU3RyaW5nKX0KLQkgKiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBUaGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBzdGFydCB0aGUgc2VydmVyIGZyb20gYSBzdG9wcGVkIHN0YXRlLgotCSAqIDxwPgotCSAqIFRoZSBvcGVyYXRpb24gbGlzdGVuZXIgY2FuIGJlIHVzZWQgdG8gYWRkIGEgbGlzdGVuZXIgZm9yIG5vdGlmaWNhdGlvbgotCSAqIG9mIHRoaXMgc3BlY2lmaWMgc2VydmVyIHJlc3RhcnQuIFRoZSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZCB3aXRoIGEKLQkgKiBzaW5nbGUgc3VjY2Vzc2Z1bCBzdGF0dXMgKHNldmVyaXR5IE9LKSB3aGVuIHRoZSBzZXJ2ZXIgaGFzCi0JICogZmluaXNoZWQgcmVzdGFydGluZywgb3IgYSBzaW5nbGUgZmFpbHVyZSAoc2V2ZXJpdHkgRVJST1IpIGlmCi0JICogdGhlcmUgd2FzIGFuIGVycm9yIHJlc3RhcnRpbmcgdGhlIHNlcnZlci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEBwYXJhbSBsaXN0ZW5lciBhbiBvcGVyYXRpb24gbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiB0aGlzCi0JICogICAgb3BlcmF0aW9uIGlzIGRvbmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdGlmaWNhdGlvbiBpcyBub3QKLQkgKiAgICByZXF1aXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUsIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHN0b3BwZWQuCi0JICogU2VydmVycyBjYW4gYmUgc3RvcHBlZCBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBzdG9wcGVkIGFuZCBpZgotCSAqIHRoZXkgYmVsb25nIHRvIGEgc3RhdGUtc2V0IHRoYXQgY2FuIGJlIHN0b3BwZWQuCi0JICoKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIHNlcnZlciBjYW4KLQkgKiAgIGJlIHN0b3BwZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aHkgaXQgY2FuJ3QKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5TdG9wKCk7Ci0KLQkvKioKLQkgKiBBc3luY2hyb25vdXNseSBzdG9wcyB0aGlzIHNlcnZlci4gVGhpcyBvcGVyYXRpb24gZG9lcwotCSAqIG5vdGhpbmcgaWYgdGhpcyBzZXJ2ZXIgY2Fubm90IGJlIHN0b3BwZWQgKHtAbGluayAjY2FuU3RvcCgpfQotCSAqIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIDxwPgotCSAqIElmIGZvcmNlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXQgd2lsbCBhdHRlbXB0IHRvIHN0b3AgdGhlIHNlcnZlcgotCSAqIG5vcm1hbGx5L2dyYWNlZnVsbHkuIElmIGZvcmNlIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSBzZXJ2ZXIKLQkgKiBwcm9jZXNzIHdpbGwgYmUgdGVybWluYXRlZCBhbnkgd2F5IHRoYXQgaXQgY2FuLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgY2FsbGVyIHdhbnRzIHRvIGxpc3RlbiBmb3Igc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZQotCSAqIHNlcnZlciBzdG9wcGluZywgaXQgY2FuIGFkZCBhIHNlcnZlciBsaXN0ZW5lciBvciB1c2UgdGhlCi0JICogdmVyc2lvbiBvZiB0aGlzIG1ldGhvZCB0aGF0IHRha2VzIGFuIG9wZXJhdGlvbiBsaXN0ZW5lciBhcyBhCi0JICogcGFyYW1ldGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2UgPGNvZGU+dHJ1ZTwvY29kZT4gdG8ga2lsbCB0aGUgc2VydmVyLCBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICB0byBzdG9wIG5vcm1hbGx5Ci0JICogQHNlZSAjc3RhcnQoU3RyaW5nLCBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKGJvb2xlYW4gZm9yY2UpOwotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgc3RvcHMgdGhpcyBzZXJ2ZXIuIFRoaXMgb3BlcmF0aW9uIGRvZXMKLQkgKiBub3RoaW5nIGlmIHRoaXMgc2VydmVyIGNhbm5vdCBiZSBzdG9wcGVkICh7QGxpbmsgI2NhblN0b3AoKX0KLQkgKiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBJZiBmb3JjZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIGl0IHdpbGwgYXR0ZW1wdCB0byBzdG9wIHRoZSBzZXJ2ZXIKLQkgKiBub3JtYWxseS9ncmFjZWZ1bGx5LiBJZiBmb3JjZSBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgc2VydmVyCi0JICogcHJvY2VzcyB3aWxsIGJlIHRlcm1pbmF0ZWQgYW55IHdheSB0aGF0IGl0IGNhbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiBsaXN0ZW5lciBjYW4gYmUgdXNlZCB0byBhZGQgYSBsaXN0ZW5lciBmb3Igbm90aWZpY2F0aW9uCi0JICogb2YgdGhpcyBzcGVjaWZpYyBzZXJ2ZXIgc3RvcC4gVGhlIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIHdpdGggYQotCSAqIHNpbmdsZSBzdWNjZXNzZnVsIHN0YXR1cyAoc2V2ZXJpdHkgT0spIHdoZW4gdGhlIHNlcnZlciBoYXMKLQkgKiBmaW5pc2hlZCBzdG9wcGluZywgb3IgYSBzaW5nbGUgZmFpbHVyZSAoc2V2ZXJpdHkgRVJST1IpIGlmCi0JICogdGhlcmUgd2FzIGFuIGVycm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBraWxsIHRoZSBzZXJ2ZXIsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIHRvIHN0b3Agbm9ybWFsbHkKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYW4gb3BlcmF0aW9uIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIHdoZW4gdGhpcwotCSAqICAgIG9wZXJhdGlvbiBpcyBkb25lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3RpZmljYXRpb24gaXMgbm90Ci0JICogICAgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKGJvb2xlYW4gZm9yY2UsIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBnaXZlbiBtb2R1bGUgb24gdGhpcyBzZXJ2ZXIuCi0JICogUmV0dXJucyA8Y29kZT5TVEFURV9VTktOT1dOPC9jb2RlPiBpZiB0aGUgbW9kdWxlCi0JICogaXMgbm90IGFtb25nIHRoZSBvbmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKLQkgKiBAcmV0dXJuIG9uZSBvZiB0aGUgc3RhdGUgKDxjb2RlPlNUQVRFX1hYWDwvY29kZT4pIGNvbnN0YW50cyBkZWNsYXJlZAotCSAqICAgIG9uIHtAbGluayBJU2VydmVyfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlU3RhdGUoSU1vZHVsZVtdIG1vZHVsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUncyBzeW5jIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBQVUJMSVNIX1NUQVRFX1hYWCBzdGF0ZSBmbGFncwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlUHVibGlzaFN0YXRlKElNb2R1bGVbXSBtb2R1bGUpOwotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGdpdmVuIG1vZHVsZSBpcyBpbiBzeW5jIG9uIHRoZSBzZXJ2ZXIuIEl0IHNob3VsZAotCSAqIHJldHVybiB0cnVlIGlmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIHJlc3RhcnRlZCAoaXMgb3V0IG9mCi0JICogc3luYykgb3IgZmFsc2UgaWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlc3RhcnRlZC4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1vZHVsZVJlc3RhcnRTdGF0ZShJTW9kdWxlW10gbW9kdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbW9kdWxlIGNhbiBiZSByZXN0YXJ0ZWQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaGFzIGEgcHJvZ3Jlc3MgbW9uaXRvciBiZWNhdXNlIGl0IG1heSBpbnZvbHZlIHBsdWdpbgotCSAqIGFuZCBjbGFzcyBsb2FkaW5nLiBObyBjb21tdW5pY2F0aW9uIHRvIHRoZSBzZXJ2ZXIgd2lsbCBvY2N1ci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgbW9kdWxlIGNhbgotCSAqICAgIGJlIHJlc3RhcnRlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoeSBpdCBjYW4ndAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbkNvbnRyb2xNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHN0YXJ0cyB0aGlzIHNlcnZlciBpbiB0aGUgZ2l2ZW4gbGF1bmNoIG1vZGUuCi0JICogPHA+Ci0JICogSWYgY2FuU3RhcnQobGF1bmNoTW9kZSkgaXMgZmFsc2UsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBvcGVyYXRpb24gbGlzdGVuZXIgY2FuIGJlIHVzZWQgdG8gYWRkIGEgbGlzdGVuZXIgZm9yIG5vdGlmaWNhdGlvbgotCSAqIG9mIHRoaXMgc3BlY2lmaWMgbW9kdWxlIHN0YXJ0LiBUaGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCBhCi0JICogc2luZ2xlIHN1Y2Nlc3NmdWwgc3RhdHVzIChzZXZlcml0eSBPSykgd2hlbiB0aGUgbW9kdWxlIGhhcwotCSAqIGZpbmlzaGVkIHN0YXJ0aW5nLCBvciBhIHNpbmdsZSBmYWlsdXJlIChzZXZlcml0eSBFUlJPUikgaWYKLQkgKiB0aGVyZSB3YXMgYW4gZXJyb3Igc3RhcnRpbmcgdGhlIG1vZHVsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKkBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byBiZSBzdGFydGVkCi0JICogQHBhcmFtIGxpc3RlbmVyIGFuIG9wZXJhdGlvbiBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiB3aGVuIHRoaXMKLQkgKiAgICBvcGVyYXRpb24gaXMgZG9uZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90aWZpY2F0aW9uIGlzIG5vdAotCSAqICAgIHJlcXVpcmVkCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHN0b3BzIHRoZSBnaXZlbiBtb2R1bGUuIFRoaXMgb3BlcmF0aW9uIGRvZXMKLQkgKiBub3RoaW5nIGlmIHRoaXMgbW9kdWxlIGNhbm5vdCBiZSBzdG9wcGVkLgotCSAqIDxwPgotCSAqIFRoZSBvcGVyYXRpb24gbGlzdGVuZXIgY2FuIGJlIHVzZWQgdG8gYWRkIGEgbGlzdGVuZXIgZm9yIG5vdGlmaWNhdGlvbgotCSAqIG9mIHRoaXMgc3BlY2lmaWMgbW9kdWxlIHN0b3AuIFRoZSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZCB3aXRoIGEKLQkgKiBzaW5nbGUgc3VjY2Vzc2Z1bCBzdGF0dXMgKHNldmVyaXR5IE9LKSB3aGVuIHRoZSBtb2R1bGUgaGFzCi0JICogZmluaXNoZWQgc3RvcHBpbmcsIG9yIGEgc2luZ2xlIGZhaWx1cmUgKHNldmVyaXR5IEVSUk9SKSBpZgotCSAqIHRoZXJlIHdhcyBhbiBlcnJvciBzdG9wcGluZyB0aGUgbW9kdWxlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYmUgc3RvcHBlZAotCSAqIEBwYXJhbSBsaXN0ZW5lciBhbiBvcGVyYXRpb24gbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiB0aGlzCi0JICogICAgb3BlcmF0aW9uIGlzIGRvbmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdGlmaWNhdGlvbiBpcyBub3QKLQkgKiAgICByZXF1aXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHJlc3RhcnRzIHRoZSBnaXZlbiBtb2R1bGUgb24gdGhlIHNlcnZlci4KLQkgKiA8cD4KLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHVwZGF0ZSB0aGUgbW9kdWxlIHN5bmMgc3RhdGUgYW5kIGZpcmUKLQkgKiBhbiBldmVudCBmb3IgdGhlIG1vZHVsZS4gSWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBleGlzdCBvbiB0aGUgc2VydmVyLAotCSAqIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBJZiB0aGUgbW9kdWxlIHdhcyBqdXN0IHB1Ymxpc2hlZCB0byB0aGUgc2VydmVyCi0JICogYW5kIGhhZCBuZXZlciBiZWVuIHN0YXJ0ZWQsIHdvdWxkIGlzIGJlIG9rIHRvICJzdGFydCIKLQkgKiB0aGUgbW9kdWxlIHVzaW5nIHRoaXMgbWV0aG9kP10KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRvIGJlIHN0YXJ0ZWQKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYW4gb3BlcmF0aW9uIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIHdoZW4gdGhpcwotCSAqICAgIG9wZXJhdGlvbiBpcyBkb25lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3RpZmljYXRpb24gaXMgbm90Ci0JICogICAgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0TW9kdWxlKElNb2R1bGVbXSBtb2R1bGUsIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciB0aGlzIHNlcnZlci4gSWYgb25lIGRvZXMgbm90IGV4aXN0LCBpdAotCSAqIHdpbGwgYmUgY3JlYXRlZCBpZiAiY3JlYXRlIiBpcyB0cnVlLCBhbmQgb3RoZXJ3aXNlIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIFdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgc2VydmVyIHR5cGUgaXMgaW52YWxpZCBvciBoYXMgbm8gYXNzb2NpYXRlZAotCSAqIGxhdW5jaCBjb25maWd1cmF0aW9uIHR5cGUgKGkuZS4gdGhpcyBzZXJ2ZXIgdHlwZSBjYW5ub3QgYmUgc3RhcnRlZCkuCi0JICogCi0JICogQHBhcmFtIGNyZWF0ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG5ldyBsYXVuY2ggY29uZmlndXJhdGlvbiBzaG91bGQgYmUKLQkgKiAgICBjcmVhdGVkIGlmIHRoZXJlIGFyZSBub25lIGFscmVhZHkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIHdhcyBubwotCSAqICAgIGV4aXN0aW5nIGxhdW5jaCBjb25maWd1cmF0aW9uIGFuZCA8Y29kZT5jcmVhdGU8L2NvZGU+IHdhcyBmYWxzZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSUxhdW5jaENvbmZpZ3VyYXRpb24gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihib29sZWFuIGNyZWF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhdW5jaCB0aGF0IHdhcyB1c2VkIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIsIGlmIGF2YWlsYWJsZS4gSWYgdGhlIHNlcnZlcgotCSAqIGlzIG5vdCBydW5uaW5nLCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4gCi0JICogCi0JICogQHJldHVybiB0aGUgbGF1bmNoIHVzZWQgdG8gc3RhcnQgdGhlIGN1cnJlbnRseSBydW5uaW5nIHNlcnZlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICBpZiB0aGUgbGF1bmNoIGlzIHVuYXZhaWxhYmxlIG9yIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgSUxhdW5jaCBnZXRMYXVuY2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IHRpbWVvdXQgaW4gc2Vjb25kcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCB0aW1lb3V0IGluIHNlY29uZHMKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydFRpbWVvdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0b3AgdGltZW91dCBpbiBzZWNvbmRzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0b3AgdGltZW91dCBpbiBzZWNvbmRzCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RvcFRpbWVvdXQoKTsKLQotCS8qKgotCSAqIFN0YXJ0cyB0aGlzIHNlcnZlciBpbiB0aGUgZ2l2ZW4gbGF1bmNoIG1vZGUgYW5kIHdhaXRzIHVudGlsIHRoZSBzZXJ2ZXIKLQkgKiBoYXMgZmluaXNoZWQgc3RhcnRpbmcuCi0JICogPHA+Ci0JICogVGhpcyBjb252ZW5pZW5jZSBtZXRob2QgdXNlcyB7QGxpbmsgI3N0YXJ0KFN0cmluZywgSVByb2dyZXNzTW9uaXRvcil9Ci0JICogdG8gc3RhcnQgdGhlIHNlcnZlciwgYW5kIGFuIGludGVybmFsIHRocmVhZCBhbmQgbGlzdGVuZXIgdG8gZGV0ZWN0Ci0JICogd2hlbiB0aGUgc2VydmVyIGhhcyBmaW5pc2hlZCBzdGFydGluZy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNzdGFydChTdHJpbmcsIElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKX0KLQkgKiAgICBpbnN0ZWFkCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gc3RhcnQgdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9ub3VzU3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTdG9wcyB0aGlzIHNlcnZlciBhbmQgd2FpdHMgdW50aWwgdGhlIHNlcnZlciBoYXMgY29tcGxldGVseSBzdG9wcGVkLgotCSAqIDxwPgotCSAqIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHVzZXMge0BsaW5rICNzdG9wKGJvb2xlYW4pfQotCSAqIHRvIHN0b3AgdGhlIHNlcnZlciwgYW5kIGFuIGludGVybmFsIHRocmVhZCBhbmQgbGlzdGVuZXIgdG8gZGV0ZWN0Ci0JICogd2hlbiB0aGUgc2VydmVyIGhhcyBjb21wbGllZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGZvcmNlIDxjb2RlPnRydWU8L2NvZGU+IHRvIGtpbGwgdGhlIHNlcnZlciwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgdG8gc3RvcCBub3JtYWxseQotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI3N0b3AoYm9vbGVhbiwgSU9wZXJhdGlvbkxpc3RlbmVyKX0KLQkgKiAgICBpbnN0ZWFkCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25vdXNTdG9wKGJvb2xlYW4gZm9yY2UpOwotCi0JLyoqCi0JICogU3luY2hyb25vdXNseSByZXN0YXJ0cyB0aGlzIHNlcnZlci4gVGhpcyBvcGVyYXRpb24gZG9lcwotCSAqIG5vdGhpbmcgaWYgdGhpcyBzZXJ2ZXIgY2Fubm90IGJlIHN0b3BwZWQgKHtAbGluayAjY2FuUmVzdGFydChTdHJpbmcpfQotCSAqIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIDxwPgotCSAqCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgYSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGNhbiBiZSBsYXVuY2hlZCwKLQkgKiAgICBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzIGRlZmluZWQgYnkKLQkgKiAgICB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvcgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI3Jlc3RhcnQoU3RyaW5nLCBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcil9IAotCSAqICAgIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbm91c1Jlc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlckF0dHJpYnV0ZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Yjg4M2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlckF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLS8qKgotICogUmVwcmVzZW50cyBhIHNlcnZlciBpbnN0YW5jZS4gRXZlcnkgc2VydmVyIGlzIGFuIGluc3RhbmNlIG9mIGEKLSAqIHBhcnRpY3VsYXIsIGZpeGVkIHNlcnZlciB0eXBlLgotICogPHA+Ci0gKiBOb3Qgc3VycHJpc2luZ2x5LCB0aGUgbm90aW9uIG9mIDxiPnNlcnZlcjwvYj4gaXMgY2VudHJhbCBpbiB0aGUgd2ViIHRvb2xzCi0gKiBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUuIEluIHRoaXMgY29udGV4dCwgdW5kZXJzdGFuZCB0aGF0IGEgc2VydmVyIGlzCi0gKiBhIHdlYiBzZXJ2ZXIgb2Ygc29tZSBpbGsuIEl0IGNvdWxkIGJlIGEgc2ltcGxlIHdlYiBzZXJ2ZXIgbGFja2luZyBKYXZhCi0gKiBzdXBwb3J0LCBvciBhbiBKMkVFIGJhc2VkIHNlcnZlciwgb3IgcGVyaGFwcyBldmVuIHNvbWUga2luZCBvZiBkYXRhYmFzZQotICogc2VydmVyLiBBIG1vcmUgZXhhY3QgZGVmaW5pdGlvbiBpcyBub3QgcmVxdWlyZWQgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIEFQSS4KLSAqIEZyb20gYSB0b29sLWNlbnRyaWMgcG9pbnQgb2YgdmlldywgYSBzZXJ2ZXIKLSAqIGlzIHNvbWV0aGluZyB0aGF0IHRoZSBkZXZlbG9wZXIgaXMgd3JpdGluZyAiY29udGVudCIgZm9yLgotICogVGhlIHVuaXQgb2YgY29udGVudCBpcyB0ZXJtZWQgYSBtb2R1bGUuCi0gKiBJbiBhIHNlbnNlLCB0aGUgc2VydmVyIGV4aXN0cywgYnV0IGxhY2tzIHVzZWZ1bCBjb250ZW50LiBUaGUKLSAqIGRldmVsb3BtZW50IHRhc2sgaXMgdG8gcHJvdmlkZSB0aGF0IGNvbnRlbnQuIFRoZSBjb250ZW50IGNhbiBpbmNsdWRlCi0gKiBhbnl0aGluZyBmcm9tIHNpbXBsZSwgc3RhdGljIEhUTUwgd2ViIHBhZ2VzIHRvIGNvbXBsZXgsIGhpZ2hseSBkeW5hbWljCi0gKiB3ZWIgYXBwbGljYXRpb25zLgotICogSW4gdGhlIGNvdXJzZSBvZiB3cml0aW5nIGFuZCBkZWJ1Z2dpbmcgdGhpcyBjb250ZW50LAotICogdGhlIGRldmVsb3BlciB3aWxsIHdhbnQgdG8gdGVzdCB0aGVpciBjb250ZW50IG9uIGEgd2ViIHNlcnZlciwgdG8gc2VlIGhvdyBpdAotICogZ2V0cyBzZXJ2ZWQgdXAuIEZvciB0aGlzIHRoZXkgd2lsbCBuZWVkIHRvIGxhdW5jaCBhIHNlcnZlciBwcm9jZXNzIHJ1bm5pbmcgb24KLSAqIHNvbWUgaG9zdCBtYWNoaW5lIChvZnRlbiB0aGUgbG9jYWwgaG9zdCBvbiB3aGljaCB0aGUgSURFIGlzIHJ1bm5pbmcpLCBvcgotICogYXR0YWNoIHRvIGEgc2VydmVyIHRoYXQncyBhbHJlYWR5IHJ1bm5pbmcgb24gYSByZW1vdGUgKG9yIGxvY2FsKSBob3N0LiAKLSAqIFRoZSBuZXdseSBkZXZlbG9wZWQgY29udGVudCBzaXR0aW5nIGluIHRoZSBkZXZlbG9wZXIncyB3b3Jrc3BhY2UgbmVlZHMgdG8KLSAqIGVuZCB1cCBpbiBhIGxvY2F0aW9uIGFuZCBmb3JtYXQgdGhhdCB0aGUgcnVubmluZyBzZXJ2ZXIgY2FuIHVzZSBmb3IgaXRzCi0gKiBzZXJ2aW5nIHB1cnBvc2VzLgotICogPC9wPgotICogPHA+Ci0gKiBJbiB0aGlzIHBpY3R1cmUsIGFuIDxjb2RlPklTZXJ2ZXI8L2NvZGU+IG9iamVjdCBpcyBhIHByb3h5IGZvciB0aGUgcmVhbCB3ZWIKLSAqIHNlcnZlci4gVGhyb3VnaCB0aGlzIHByb3h5LCBhIGNsaWVudCBjYW4gY29uZmlndXJlIHRoZSBzZXJ2ZXIsIGFuZCBzdGFydCwKLSAqIHN0b3AsIGFuZCByZXN0YXJ0IGl0LgotICogPC9wPgotICogPHA+Ci0gKiBJU2VydmVyQXR0cmlidXRlcyBpbXBsZW1lbnRzIElBZGFwdGFibGUgdG8gYWxsb3cgdXNlcnMgdG8gb2J0YWluIGEKLSAqIHNlcnZlci10eXBlLXNwZWNpZmljIGNsYXNzLiBCeSBjYXN0aW5nIHRoZSBydW50aW1lIGV4dGVuc2lvbiB0byB0aGUgdHlwZQotICogcHJlc2NyaWJlZCBpbiB0aGUgQVBJIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgcGFydGljdWxhciBzZXJ2ZXIgdHlwZSwgdGhlCi0gKiBjbGllbnQgY2FuIGFjY2VzcyBzZXJ2ZXItdHlwZS1zcGVjaWZpYyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLgotICogZ2V0QWRhcHRlcigpIG1heSBpbnZvbHZlIHBsdWdpbiBsb2FkaW5nLCBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbQotICogcG9wdXAgbWVudXMsIGV0Yy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIHNlcnZlciBmcmFtZXdvcmsgbWFpbnRhaW5zIGEgZ2xvYmFsIGxpc3Qgb2YgYWxsIGtub3duIHNlcnZlciBpbnN0YW5jZXMKLSAqICh7QGxpbmsgU2VydmVyQ29yZSNnZXRTZXJ2ZXJzKCl9KS4KLSAqIDwvcD4KLSAqIDxwPgotICogW3JvdWdoIG5vdGVzOgotICogU2VydmVyIGhhcyBhIHN0YXRlLgotICogU2VydmVyIGNhbiBiZSBzdGFydGVkLCBzdG9wcGVkLCBhbmQgcmVzdGFydGVkLgotICogVG8gbW9kaWZ5IHNlcnZlciBhdHRyaWJ1dGVzLCBnZXQgYSB3b3JraW5nIGNvcHksIG1vZGlmeSBpdCwgYW5kIHRoZW4gc2F2ZSBpdAotICogdG8gY29tbWl0IHRoZSBjaGFuZ2VzLgotICogU2VydmVyIGF0dHJpYnV0ZXMuIFNlcmlhbGl6YXRpb24uCi0gKiBDaGFpbmVkIHdvcmtpbmcgY29waWVzIGZvciBydW50aW1lLCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqIFNlcnZlciBoYXMgYSBzZXQgb2Ygcm9vdCBtb2R1bGVzLgotICogTW9kdWxlcyBoYXZlIHN0YXRlIHdydCBhIHNlcnZlci4KLSAqIFJlc3RhcnRpbmcgbW9kdWxlcy5dCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFR3byBzZXJ2ZXJzIGFyZSBpZGVudGljYWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGlkLgotICogPC9wPgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyQXR0cmlidXRlcyBleHRlbmRzIElBZGFwdGFibGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgc2VydmVyLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG5hbWUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgc2VydmVyLgotCSAqIEVhY2ggc2VydmVyIChvZiBhIGdpdmVuIHR5cGUpIGhhcyBhIGRpc3RpbmN0IGlkLCBmaXhlZCBmb3IKLQkgKiBpdHMgbGlmZXRpbWUuIElkcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IGFzIGtleXM7Ci0JICogdGhleSBhcmUgbm90IGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBwZXJzaXN0ZW50IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VydmVyLgotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW55IGVycm9yIHJlY2VpdmVkIHdoaWxlIGRlbGV0aW5nIHRoZSBzZXJ2ZXIKLQkgKiAgICBvciBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYSB3b3JraW5nIGNvcHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlcnZlciBpcyBtYXJrZWQgcmVhZCBvbmx5LgotCSAqIFdoZW4gYSBzZXJ2ZXIgaXMgcmVhZCBvbmx5LCB3b3JraW5nIGNvcGllcyBjYW4gYmUgY3JlYXRlZCBidXQKLQkgKiB0aGV5IGNhbm5vdCBiZSBzYXZlZC4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZXJ2ZXIgaXMgbWFya2VkIGFzIHJlYWQgb25seSwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgd29ya2luZyBjb3B5LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZXJ2ZXIgaXMgYSB3b3JraW5nIGNvcHksCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIG9iamVjdCB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiBubyBzdWNoIG9iamVjdCBjYW4gYmUgZm91bmQsIG9yIGlmIHRoZSBkZWxlZ2F0ZSBpcyBub3QKLQkgKiBsb2FkZWQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY2hlY2sgdGhlIGRlbGVnYXRlIGNsYXNzZXMgZm9yIGFkYXB0aW5nCi0JICogdW5sZXNzIHRoZXkgYXJlIGFscmVhZHkgbG9hZGVkLiBObyBwbHVnaW4gbG9hZGluZyB3aWxsIG9jY3VyCi0JICogd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9kLiBJdCBpcyBzdWl0YWJsZSBmb3IgcG9wdXAgbWVudXMgYW5kCi0JICogb3RoZXIgVUkgYXJ0aWZhY3RzIHdoZXJlIHBlcmZvcm1hbmNlIGlzIGEgY29uY2Vybi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIgdGhlIGFkYXB0ZXIgY2xhc3MgdG8gbG9vayB1cAotCSAqIEByZXR1cm4gYSBvYmplY3QgY2FzdGFibGUgdG8gdGhlIGdpdmVuIGNsYXNzLCAKLQkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBkb2VzIG5vdAotCSAqICAgIGhhdmUgYW4gYWRhcHRlciBmb3IgdGhlIGdpdmVuIGNsYXNzCi0JICogQHNlZSBJQWRhcHRhYmxlI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICogQHNlZSAjbG9hZEFkYXB0ZXIoQ2xhc3MsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IG9ubHkgaWYKLQkgKiBubyBzdWNoIG9iamVjdCBjYW4gYmUgZm91bmQgYWZ0ZXIgbG9hZGluZyBhbmQgaW5pdGlhbGl6aW5nCi0JICogZGVsZWdhdGVzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgZm9yY2UgYSBsb2FkIGFuZCBpbml0aWFsaXphdGlvbiBvZiBhbGwgZGVsZWdhdGUKLQkgKiBjbGFzc2VzIGFuZCBjaGVjayB0aGVtIGZvciBhZGFwdGluZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIgdGhlIGFkYXB0ZXIgY2xhc3MgdG8gbG9vayB1cAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgb2JqZWN0IGNhc3RhYmxlIHRvIHRoZSBnaXZlbiBjbGFzcywgCi0JICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgZG9lcyBub3QKLQkgKiAgICBoYXZlIGFuIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBjbGFzcwotCSAqIEBzZWUgI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkQWRhcHRlcihDbGFzcyBhZGFwdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaG9zdCBmb3IgdGhlIHNlcnZlci4KLQkgKiBUaGUgZm9ybWF0IG9mIHRoZSBob3N0IGNhbiBiZSBlaXRoZXIgYSBxdWFsaWZpZWQgb3IgdW5xdWFsaWZpZWQgaG9zdG5hbWUsCi0JICogb3IgYW4gSVAgYWRkcmVzcyBhbmQgbXVzdCBjb25mb3JtIHRvIFJGQyAyNzMyLgotCSAqIAotCSAqIEByZXR1cm4gYSBob3N0IHN0cmluZyBjb25mb3JtaW5nIHRvIFJGQyAyNzMyCi0JICogQHNlZSBqYXZhLm5ldC5VUkwjZ2V0SG9zdCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgcnVudGltZSBvZiBhIHNlcnZlciB3b3JraW5nIGNvcHkgbWF5IG9yIG1heSBub3QKLQkgKiBiZSBhIHdvcmtpbmcgY29weS4gRm9yIGEgc2VydmVyIGluc3RhbmNlIHRoYXQgaXMgbm90IGEKLQkgKiB3b3JraW5nIGNvcHksIHRoZSBydW50aW1lIGluc3RhbmNlIGlzIG5vdCBhIHdvcmtpbmcgY29weQotCSAqIGVpdGhlci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBBY2NvcmRpbmcgdG8gc2VydmVyVHlwZSBleHRlbnNpb24gcG9pbnQsIAotCSAqIHJ1bnRpbWVUeXBlSWQgaXMgYSBtYW5kYXRvcnkgYXR0cmlidXRlLiBJdCBzZWVtcyBvZGQKLQkgKiB0aGVuIHRvIGhhdmUgc2VydmVyIHJ1bnRpbWUgaW5zdGFuY2UgYmVpbmcgYW4KLQkgKiBvcHRpb25hbCBwcm9wZXJ0eSBvZiBzZXJ2ZXIgaW5zdGFuY2UuIFdoYXQgZG9lcyBpdCBtZWFuCi0JICogZm9yIGEgc2VydmVyIHRvIG5vdCBoYXZlIGEgcnVudGltZT9dCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0UnVudGltZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIHR5cGUKLQkgKiBAc2VlIElTZXJ2ZXJUeXBlCi0JICovCi0JcHVibGljIElTZXJ2ZXJUeXBlIGdldFNlcnZlclR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHNlcnZlciBjb25maWd1cmF0aW9uIG9mIGEgc2VydmVyIHdvcmtpbmcgY29weSBtYXkKLQkgKiBvciBtYXkgbm90IGJlIGEgd29ya2luZyBjb3B5LiBGb3IgYSBzZXJ2ZXIgaW5zdGFuY2UgdGhhdCBpcwotCSAqIG5vdCBhIHdvcmtpbmcgY29weSwgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGluc3RhbmNlIGlzIG5vdAotCSAqIGEgd29ya2luZyBjb3B5IGVpdGhlci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBBY2NvcmRpbmcgdG8gc2VydmVyVHlwZSBleHRlbnNpb24gcG9pbnQsIAotCSAqIGNvbmZpZ3VyYXRpb25UeXBlSWQgaXMgYW4gb3B0aW9uYWwgYXR0cmlidXRlLiBJZiBhIHNlcnZlciB0eXBlCi0JICogaGFzIG5vIHNlcnZlciBjb25maWd1cmF0aW9uIHR5cGUsIHRoZW4gaXQgc2VlbXMgcmVhc29uYWJsZSB0byAKLQkgKiBleHBlY3QgdGhpcyBtZXRob2QgdG8gcmV0dXJuIG51bGwgZm9yIGFsbCBpbnN0YW5jZXMgb2YgdGhhdCBzZXJ2ZXIKLQkgKiB0eXBlLiBCdXQgd2hhdCBhYm91dCBhIHNlcnZlciB0eXBlIHRoYXQgZXhwbGljaXRseSBzcGVjaWZpZXMKLQkgKiBhIHNlcnZlciBjb25maWd1cmF0aW9uIHR5cGUuIERvZXMgdGhhdCBtZWFuIHRoYXQgYWxsIHNlcnZlcgotCSAqIGluc3RhbmNlcyBvZiB0aGF0IHNlcnZlciB0eXBlIG11c3QgaGF2ZSBhIHNlcnZlciBjb25maWd1cmF0aW9uCi0JICogaW5zdGFuY2Ugb2YgdGhhdCBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0eXBlLCBhbmQgdGhhdCB0aGlzIG1ldGhvZAotCSAqIG5ldmVyIHJldHVybnMgbnVsbCBpbiB0aG9zZSBjYXNlcz9dCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIElGb2xkZXIgZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHNlcnZlciB3b3JraW5nIGNvcHkgZm9yIG1vZGlmeWluZyB0aGlzIHNlcnZlciBpbnN0YW5jZS4KLQkgKiBJZiB0aGlzIGluc3RhbmNlIGlzIGFscmVhZHkgYSB3b3JraW5nIGNvcHksIGl0IGlzIHJldHVybmVkLgotCSAqIElmIHRoaXMgaW5zdGFuY2UgaXMgbm90IGEgd29ya2luZyBjb3B5LCBhIG5ldyBzZXJ2ZXIgd29ya2luZyBjb3B5Ci0JICogaXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGlkIGFuZCBhdHRyaWJ1dGVzLgotCSAqIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBzYXZpbmcgb3IgcmVsZWFzaW5nIHRoZSB3b3JraW5nIGNvcHkgd2hlbgotCSAqIHRoZXkgYXJlIGRvbmUgd2l0aCBpdC4KLQkgKiA8cD4KLQkgKiBUaGUgc2VydmVyIHdvcmtpbmcgY29weSBpcyByZWxhdGVkIHRvIHRoaXMgc2VydmVyIGluc3RhbmNlCi0JICogaW4gdGhlIGZvbGxvd2luZyB3YXlzOgotCSAqIDxwcmU+Ci0JICogdGhpcy5nZXRXb3JraW5nQ29weSgpLmdldElkKCkgPT0gdGhpcy5nZXRJZCgpCi0JICogdGhpcy5nZXRXb3JraW5nQ29weSgpLmdldEZpbGUoKSA9PSB0aGlzLmdldEZpbGUoKQotCSAqIHRoaXMuZ2V0V29ya2luZ0NvcHkoKS5nZXRPcmlnaW5hbCgpID09IHRoaXMKLQkgKiB0aGlzLmdldFdvcmtpbmdDb3B5KCkuZ2V0UnVudGltZSgpID09IHRoaXMuZ2V0UnVudGltZSgpCi0JICogdGhpcy5nZXRXb3JraW5nQ29weSgpLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSA9PSB0aGlzLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKQotCSAqIDwvcHJlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IElTZXJ2ZXJXb3JraW5nQ29weSBleHRlbmRzIElTZXJ2ZXIuIAotCSAqIFNlcnZlci5nZXRXb3JraW5nQ29weSgpIGNyZWF0ZSBhIG5ldyB3b3JraW5nIGNvcHk7Ci0JICogU2VydmVyV29ya2luZ0NvcHkuZ2V0V29ya2luZ0NvcHkoKSByZXR1cm5zIHRoaXMuCi0JICogVGhpcyBtYXkgYmUgY29udmVuaWVudCBpbiBjb2RlIHRoYXQgaXMgaWdub3JhbnQgb2YKLQkgKiB3aGV0aGVyIHRoZXkgYXJlIGRlYWxpbmcgd2l0aCBhIHdvcmtpbmcgY29weSBvciBub3QuCi0JICogSG93ZXZlciwgaXQgaXMgaGFyZCBmb3IgY2xpZW50cyB0byBtYW5hZ2Ugd29ya2luZyBjb3BpZXMKLQkgKiB3aXRoIHRoaXMgZGVzaWduLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyB3b3JraW5nIGNvcHkKLQkgKi8KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG1vZHVsZXMgdGhhdCBhcmUgY3VycmVudGx5IGNvbmZpZ3VyZWQgb24KLQkgKiB0aGUgc2VydmVyLiBXaGVuIHRoZSBzZXJ2ZXIgaXMgcHVibGlzaGVkLCB0aGVzZSBhcmUgdGhlIG1vZHVsZXMKLQkgKiB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBvbiB0aGUgc2VydmVyLiBUaGlzIG1ldGhvZCBtYXkgbm90IHJldHVybgotCSAqIHRoZSBsaXN0IG9mIG1vZHVsZXMgdGhhdCBhcmUgY3VycmVudGx5IG9uIHRoZSBzZXJ2ZXIgaWYgYSBtb2R1bGUKLQkgKiBoYXMgYmVlbiBhZGRlZCBvciByZW1vdmVkIHNpbmNlIHRoZSBsYXN0IHB1Ymxpc2guCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgcm9vdCBtb2R1bGVzLCB3aGljaCBhcmUgbm90IHBhcmVudGVkIHdpdGhpbgotCSAqIGFub3RoZXIgbW9kdWxlcy4gRWFjaCBvZiB0aGVzZSBtYXkgY29udGFpbiBjaGlsZCBtb2R1bGVzLCB3aGljaCBhcmUKLQkgKiBhbHNvIGRlcGxveWVkIHRvIHRoaXMgc2VydmVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgbW9kdWxlcwotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbW9kdWxlIG1vZGlmaWNhdGlvbnMgY291bGQgYmUgbWFkZSB0byB0aGlzCi0JICogc2VydmVyIGF0IHRoaXMgdGltZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBtYXkgZGVjaWRlIGJhc2VkIG9uIHRoZSB0eXBlIG9mIG1vZHVsZQotCSAqIG9yIHJlZnVzZSBzaW1wbHkgZHVlIHRvIHJlYWNoaW5nIGEgbWF4aW11bSBudW1iZXIgb2YKLQkgKiBtb2R1bGVzIG9yIG90aGVyIGNyaXRlcmlhLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFRoaXMgc2VlbXMgb2RkIHRvIGhhdmUgYSBwcmUtZmxpZ2h0IG1ldGhvZC4KLQkgKiBJIHNob3VsZCBleHBlY3QgdGhhdCB0aGUgY2xpZW50IGNhbiBwcm9wb3NlIG1ha2luZwotCSAqIGFueSBzZXQgb2YgbW9kdWxlIGNoYW5nZXMgdGhleSBkZXNpcmUgKHZpYSBhIHNlcnZlcgotCSAqIHdvcmtpbmcgY29weSkuIElmIHRoZSBzZXJ2ZXIgZG9lc24ndCBsaWtlIGl0LCB0aGUgb3BlcmF0aW9uCi0JICogc2hvdWxkIGZhaWwuXQotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGQgYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIG1vZHVsZXMgdG8gYWRkCi0JICogQHBhcmFtIHJlbW92ZSBhIHBvc3NpYmx5LWVtcHR5IGxpc3Qgb2YgbW9kdWxlcyB0byByZW1vdmUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcG9zZWQgbW9kaWZpY2F0aW9ucwotCSAqIGxvb2sgZmVhc2libGUsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuTW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10gYWRkLCBJTW9kdWxlW10gcmVtb3ZlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlKHMpIG9mIHRoaXMgbW9kdWxlLiBJZiB0aGlzCi0JICogbW9kdWxlIGNvbnRhaW5zIG90aGVyIG1vZHVsZXMsIGl0IHNob3VsZCBsaXN0IHRob3NlCi0JICogbW9kdWxlcy4gSWYgbm90LCBpdCBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IGxpc3QuCi0JICoKLQkgKiA8cD5UaGlzIG1ldGhvZCBzaG91bGQgb25seSByZXR1cm4gdGhlIGRpcmVjdCBjaGlsZHJlbi4KLQkgKiBUbyBvYnRhaW4gdGhlIGZ1bGwgbW9kdWxlIHRyZWUsIHRoaXMgbWV0aG9kIG1heSBiZQotCSAqIHJlY3Vyc2l2ZWx5IGNhbGxlZCBvbiB0aGUgY2hpbGRyZW4uPC9wPgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGRpcmVjdCBtb2R1bGUgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJTW9kdWxlIG1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IG1vZHVsZShzKSBvZiB0aGlzIG1vZHVsZS4gV2hlbiBkZXRlcm1pbmluZyBpZiBhIGdpdmVuCi0JICogcHJvamVjdCBjYW4gcnVuIG9uIGEgc2VydmVyLCB0aGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgYWN0dWFsCi0JICogbW9kdWxlKHMpIHRoYXQgbWF5IGJlIHJ1biBvbiB0aGUgc2VydmVyLiBGb3IgaW5zdGFuY2UsIGEgV2ViIG1vZHVsZSBtYXkKLQkgKiByZXR1cm4gYSBsaXN0IG9mIEVBUiBtb2R1bGVzIHRoYXQgaXQgaXMgY29udGFpbmVkIGluIGlmIHRoZSBzZXJ2ZXIgb25seQotCSAqIHN1cHBvcnRzIGNvbmZpZ3VyaW5nIEVBUiBtb2R1bGVzLiBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIHJ1bm5pbmcgYSBtb2R1bGUKLQkgKiBkaXJlY3RseSwgdGhlIHJldHVybmVkIGFycmF5IHNob3VsZCBjb250YWluIHRoZSBtb2R1bGUuCi0JICogCi0JICogPHA+SWYgdGhlIG1vZHVsZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgb3IKLQkgKiBhbiBlbXB0eSBhcnJheS4gSWYgdGhlIHR5cGUgaXMgbm9ybWFsbHkgc3VwcG9ydGVkIGJ1dCB0aGVyZSBpcyBhCi0JICogY29uZmlndXJhdGlvbiBwcm9ibGVtIG9yIG1pc3NpbmcgcGFyZW50LCBldGMuLCB0aGlzIG1ldGhvZCB3aWxsIGZpcmUgYQotCSAqIENvcmVFeGNlcHRpb24gdGhhdCBtYXkgdGhlbiBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuPC9wPgotCSAqIAotCSAqIDxwPklmIGl0IGRvZXMgcmV0dXJuIHZhbGlkIHBhcmVudChzKSwgdGhpcyBtZXRob2Qgd2lsbCBhbHdheXMgcmV0dXJuCi0JICogdGhlIHRvcG1vc3QgcGFyZW50IG1vZHVsZShzKSwgZXZlbiBpZiB0aGVyZSBhcmUgYSBmZXcgbGV2ZWxzCi0JICogKGEgaGllcmFyY2h5KSBvZiBtb2R1bGVzLjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcG9zc2libGUgcm9vdCBtb2R1bGVzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbQotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Um9vdE1vZHVsZXMoSU1vZHVsZSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFNlcnZlclBvcnRzIHRoYXQgdGhpcyBzZXJ2ZXIgaGFzLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2Ygc2VydmVycyBwb3J0cwotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQb3J0W10gZ2V0U2VydmVyUG9ydHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmMyMGI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0vKioKLSAqIExpc3RlbmVyIGludGVyZmFjZSBmb3IgY2hhbmdlcyB0byBzZXJ2ZXJzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBmaXJlZCB3aGVuZXZlciBhIHNlcnZlciBpcyBhZGRlZCwgbW9kaWZpZWQsIG9yIHJlbW92ZWQuCi0gKiBBbGwgZXZlbnRzIGFyZSBmaXJlZCBwb3N0LWNoYW5nZSwgc28gdGhhdCBhbGwgc2VydmVyIHRvb2xzIEFQSSBjYWxsZWQgYXMgYQotICogcmVzdWx0IG9mIHRoZSBldmVudCB3aWxsIHJldHVybiB0aGUgdXBkYXRlZCByZXN1bHRzLiAoZm9yIGV4YW1wbGUsIG9uCi0gKiBzZXJ2ZXJBZGRlZCB0aGUgbmV3IHNlcnZlciB3aWxsIGJlIGluIHRoZSBnbG9iYWwgbGlzdCBvZiBzZXJ2ZXJzCi0gKiAoe0BsaW5rIFNlcnZlckNvcmUjZ2V0U2VydmVycygpfSksIGFuZCBvbiBzZXJ2ZXJSZW1vdmVkIHRoZSBzZXJ2ZXIgd2lsbAotICogbm90IGJlIGluIHRoZSBsaXN0LgotICogPC9wPgotICogCi0gKiBAc2VlIFNlcnZlckNvcmUKLSAqIEBzZWUgSVNlcnZlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciB7Ci0JLyoqCi0JICogQSBuZXcgc2VydmVyIGhhcyBiZWVuIGNyZWF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBuZXcgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc2VydmVyQWRkZWQoSVNlcnZlciBzZXJ2ZXIpOwotCi0JLyoqCi0JICogQW4gZXhpc3Rpbmcgc2VydmVyIGhhcyBiZWVuIHVwZGF0ZWQgb3IgbW9kaWZpZWQuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBtb2RpZmllZCBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKElTZXJ2ZXIgc2VydmVyKTsKLQotCS8qKgotCSAqIEEgZXhpc3Rpbmcgc2VydmVyIGhhcyBiZWVuIHJlbW92ZWQuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSByZW1vdmVkIHNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNlcnZlclJlbW92ZWQoSVNlcnZlciBzZXJ2ZXIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDA1ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSB0aGUgc2VydmVyIHRvIGJyb2FkY2FzdCBhIGNoYW5nZSBvZiBzdGF0ZS4KLSAqIFVzdWFsbHksIHRoZSBjaGFuZ2Ugb2Ygc3RhdGUgd2lsbCBiZSBjYXVzZWQgYnkgc29tZSB1c2VyIGFjdGlvbiwKLSAqIChlLmcuIHJlcXVlc3RpbmcgdG8gc3RhcnQgYSBzZXJ2ZXIpIGhvd2V2ZXIsIGl0IGlzIGVxdWFsbHkgZmluZSBmb3IKLSAqIGEgc2VydmVyIHRvIGJyb2FkY2FzdCBhIGNoYW5nZSBvZiBzdGF0ZSB0aHJvdWdoIG5vIGRpcmVjdCB1c2VyIGFjdGlvbi4KLSAqIChlLmcuIHN0b3BwaW5nIGJlY2F1c2UgdGhlIHNlcnZlciBjcmFzaGVkKSBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZQotICogdXNlZCB0byBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIGNoYW5nZSBvciB1cGRhdGUgdGhlIFVJLgotICoKLSAqIDxwPk5vdGU6IFRoZSBzZXJ2ZXIgbGlzdGVuZXIgZXZlbnQgTVVTVCBOT1QgZGlyZWN0bHkgYmUgdXNlZCB0byBtb2RpZnkKLSAqIHRoZSBzZXJ2ZXIncyBvciBtb2R1bGUncyBzdGF0ZSB2aWEgb25lIG9mIHRoZSBzZXJ2ZXIncyBtZXRob2QuIEZvciBleGFtcGxlLCAKLSAqIGEgc2VydmVyIHN0b3BwZWQgZXZlbnQgY2Fubm90IGRpcmVjdGx5IHRyaWdnZXIgYSBzdGFydCgpLiBEb2luZyB0aGlzIG1heSAKLSAqIGNhdXNlIHRoZSB0aHJlYWQgdG8gaGFuZy48L3A+Ci0gKiAgIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJMaXN0ZW5lciB7Ci0JLyoqCi0JICogQSBzZXJ2ZXIgb3IgbW9kdWxlIGhhcyBiZWVuIGNoYW5nZWQgYXMgc3BlY2lmaWVkIGluIHRoZSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgYSBzZXJ2ZXIgZXZlbnQgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgY2hhbmdlCi0JICovCi0JcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCk7IAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2MzNzdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2VydmVyIHR5cGUgZnJvbSB3aGljaCBzZXJ2ZXIgaW5zdGFuY2VzIGNhbiBiZSBjcmVhdGVkLgotICogPHA+Ci0gKiBUaGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrIHN1cHBvcnRzCi0gKiBhbiBvcGVuLWVuZGVkIHNldCBvZiBzZXJ2ZXIgdHlwZXMsIHdoaWNoIGFyZSBjb250cmlidXRlZCB2aWEKLSAqIHRoZSA8Y29kZT5zZXJ2ZXJUeXBlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IGluIHRoZSBzZXJ2ZXIgY29yZQotICogcGx1Zy1pbi4gU2VydmVyIHR5cGUgb2JqZWN0cyBjYXJyeSBubyBzdGF0ZSAoYWxsIGluZm9ybWF0aW9uIGlzCi0gKiByZWFkLW9ubHkgYW5kIGlzIHN1cHBsaWVkIGJ5IHRoZSBzZXJ2ZXIgdHlwZSBkZWNsYXJhdGlvbikuCi0gKiBUaGUgZ2xvYmFsIGxpc3Qgb2Yga25vd24gc2VydmVyIHR5cGVzIGlzIGF2YWlsYWJsZSB2aWEKLSAqIHtAbGluayBTZXJ2ZXJDb3JlI2dldFNlcnZlclR5cGVzKCl9LiAKLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFR3byBzZXJ2ZXIgdHlwZXMgYXJlIGlkZW50aWNhbCBpZiBhbmQgb25seSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgaWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyVHlwZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBzZXJ2ZXIgdHlwZS4KLQkgKiBFYWNoIGtub3duIHNlcnZlciB0eXBlIGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIHR5cGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIHNlcnZlciB0eXBlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG5hbWUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBzZXJ2ZXIgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgc2VydmVyIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgZGVzY3JpcHRpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgc2VydmVyIHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHNlcnZlciBydW50aW1lIHRoYXQgdGhpcyB0eXBlCi0JICogb2Ygc2VydmVyIHJlcXVpcmVzLgotCSAqIDxwPgotCSAqIFtpc3N1ZTogInJ1bnRpbWVUeXBlSWQiIGlzIG1hbmRhdG9yeSBhY2NvcmRpbmcgdGhlCi0JICogc2VydmVyVHlwZXMgc2NoZW1hLiBUaGlzIHN1Z2dlc3RzIHRoYXQgYWxsIHR5cGVzCi0JICogb2Ygc2VydmVycyBoYXZlIGEgc2VydmVyIHJ1bnRpbWUuIEJ1dCB0aGVyZSBpcyBhbHNvCi0JICogYSBib29sZWFuICJydW50aW1lIiBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQotCSAqIHNlcnZlciByZXF1aXJlcyBhIHJ1bnRpbWUuIEkgc3VwZWN0IHRoYXQgc2VydmVyIHR5cGUKLQkgKiBoYXMgYW4gb3B0aW9uYWwgc2VydmVyIHJ1bnRpbWUsIGluIHdoaWNoIGNhc2UgeW91Ci0JICogY2FuIG1ha2UgInJ1bnRpbWVUeXBlSWQiIG9wdGlvbmFsIGFuZCBkaXNwZW5zZSB3aXRoCi0JICogInJ1bnRpbWUiLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBEb2VzIGl0IHJlYWxseSBtYWtlIHNlbnNlIGZvcgotCSAqIHJ1bnRpbWVUeXBlcyBhbmQgc2VydmVyVHlwZXMgYmUgc2VwYXJhdGUgZXh0ZW5zaW9uCi0JICogcG9pbnRzPyBXb3VsZCBpdCBub3QgYmUgc3VmZmljaWVudCB0byBoYXZlIHRoZSBwYXJ0eSBkZWNsYXJpbmcKLQkgKiB0aGUgc2VydmVyIHR5cGUgYWxzbyBkZWNsYXJlIHRoZSBzZXJ2ZXIgcnVudGltZSB0eXBlPwotCSAqIEhhdmluZyBydW50aW1lVHlwZSBhcyBhIHNlcGFyYXRlIGV4dGVuc2lvbiBwb2ludAotCSAqIG9ubHkgbWFrZXMgc2Vuc2UgaWYgaXQgd291bGQgYmUgcG9zc2libGUgaW4gcHJpbmNpcGxlIHRvIAotCSAqIGRlY2xhcmUgYSBzZXJ2ZXIgcnVudGltZSB0eXBlIHRoYXQgY291bGQgYWN0dWFsbHkgYmUKLQkgKiB1c2VkIG9uIHNlcnZlcmFsIHNlcnZlciB0eXBlcy4gSWYgc2VydmVyIHJ1bnRpbWVzCi0JICogYWx3YXlzIGVuZCB1cCBiZWluZyBzZXJ2ZXItdHlwZSBzcGVjaWZpYywgaXQgd291bGQgYmUgYmV0dGVyCi0JICogdG8gY29tYmluZSB0aGVtLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBXaGF0IHNob3VsZCBoYXBwZW4gd2hlbiBhIHNlcnZlciB0eXBlIG1lbnRpb25zCi0JICogdGhlIGlkIG9mIGEgc2VydmVyIHJ1bnRpbWUgdHlwZSB0aGF0IGlzIG5vdCBrbm93bgotCSAqIHRvIHRoZSBzeXN0ZW0/XQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc2VydmVyIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBJUnVudGltZVR5cGUgZ2V0UnVudGltZVR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIG9mIHNlcnZlciByZXF1aXJlcyBhIHNlcnZlcgotCSAqIHJ1bnRpbWUuCi0JICogPHA+Ci0JICogW2lzc3VlOiBTZWUgaXNzdWVzIG9uIGdldFJ1bnRpbWVUeXBlKCkuIEkgc3VzcGVjdCB0aGlzCi0JICogbWV0aG9kIGlzIHVubmVjZXNzYXJ5LCBhbmQgdGhhdCAKLQkgKiB0aGlzLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCB3aWxsIGRvLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgb2Ygc2VydmVyIHJlcXVpcmVzCi0JICogYSBzZXJ2ZXIgcnVudGltZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBkb2VzIG5vdAotCSAqIEBzZWUgI2dldFJ1bnRpbWVUeXBlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSdW50aW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBvZiBzZXJ2ZXIgc3VwcG9ydHMgdGhlIGdpdmVuIGxhdW5jaCBtb2RlLgotCSAqIDxwPgotCSAqIFtpc3N1ZTogSXQgYWxzbyBzZWVtcyBvZGQgdGhhdCB0aGlzIGlzIHBhcnQgb2YgdGhlIHNlcnZlciB0eXBlCi0JICogZGVjbGFyYXRpb24uIFRoaXMgbWVhbnMgdGhhdCBhbnkgc2VydmVyIHR5cGUgaGFzIHRvIGNvbW1pdAotCSAqIHNvIGVhcmx5IG9uIHdoaWNoIG1vZGVzIGl0IHN1cHBvcnRzLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgYSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGNhbiBiZSBsYXVuY2hlZCwKLQkgKiAgICBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzIGRlZmluZWQgYnkKLQkgKiAgICB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB0eXBlIG9mIHNlcnZlciBzdXBwb3J0cyB0aGUgZ2l2ZW4gbW9kZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzTGF1bmNoTW9kZShTdHJpbmcgbGF1bmNoTW9kZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIG9mIHNlcnZlciByZXF1aXJlcyBhIHNlcnZlcgotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogPHA+Ci0JICogW2lzc3VlOiBJdCdzIG5vdCBjbGVhciBob3cgdGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIAotCSAqIHRoaXMuZ2V0U2VydmVyQ29uZmlndXJhdGlvblR5cGUoKSAhPSBudWxsXQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBvZiBzZXJ2ZXIgcmVxdWlyZXMKLQkgKiAgICBhIHNlcnZlciBjb25maWd1cmF0aW9uLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGRvZXMgbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU2VydmVyQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgb2Ygc2VydmVyIGNhbiBydW4gb24gYSByZW1vdGUgaG9zdC4KLQkgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgc2VydmVyIHR5cGUgY2FuIG9ubHkgYmUgcnVuIG9uICJsb2NhbGhvc3QiCi0JICogKHRoZSBsb2NhbCBtYWNoaW5lKS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBvZiBzZXJ2ZXIgY2FuIHJ1biBvbgotCSAqICAgIGEgcmVtb3RlIGhvc3QsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgY2Fubm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSZW1vdGVIb3N0cygpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB3b3JraW5nIGNvcHkgaW5zdGFuY2Ugb2YgdGhpcyBzZXJ2ZXIgdHlwZS4KLQkgKiBBZnRlciBzZXR0aW5nIHZhcmlvdXMgcHJvcGVydGllcyBvZiB0aGUgd29ya2luZyBjb3B5LAotCSAqIHRoZSBjbGllbnQgc2hvdWxkIGNhbGwge0BsaW5rIElTZXJ2ZXJXb3JraW5nQ29weSNzYXZlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpfQotCSAqIHRvIGJyaW5nIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgaW50byBleGlzdGVuY2UuCi0JICogPHA+Ci0JICogW2lzc3VlOiBXaHkgaXMgYSBydW50aW1lIHBhc3NlZCBpbj8gCi0JICogSVNlcnZlcldvcmtpbmdDb3B5LnNldFJ1bnRpbWUocnVudGltZSkgY291bGQgYmUgY2FsbGVkIG9uCi0JICogdGhlIHJlc3VsdCB0byBhY2NvbXBsaXNoIHRoZSBzYW1lIHRoaW5nLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgbmV2ZXIgY3JlYXRlcyBhIHNlcnZlcgotCSAqIGNvbmZpZyB3b3JraW5nIGNvcHksIHdoZXJlYXMgdGhlIG90aGVyIG9uZSBkb2VzIT9dCi0JICogQ29uc2lkZXIgY29tYmluaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUgb3RoZXIuXQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgc2VydmVyIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2Qgd2lsbCBoYXZlIGl0J3MgaG9zdCBzZXQgdG8KLQkgKiAibG9jYWxob3N0Ii4gT3RoZXIgZGVmYXVsdHMgd2lsbCBiZSBzZXQgYnkgY2FsbGluZyB0aGUgc2VydmVyCi0JICogZGVsZWdhdGUncyBzZXREZWZhdWx0cygpIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkIHRoZSBpZCB0byBhc3NpZ24gdG8gdGhlIHNlcnZlciBpbnN0YW5jZTsgdGhlIGRlZmF1bHQgbmFtZSBpcwotCSAqICAgIHVzZWQgaWYgaWQgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gZW1wdHkgc3RyaW5nCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSB3aGVyZSB0aGUgc2VydmVyIGluc3RhbmNlCi0JICogICAgaXMgdG8gYmUgc2VyaWFsaXplZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGluZm9ybWF0aW9uIGlzCi0JICogICAgaW5zdGVhZCB0byBiZSBwZXJzaXN0ZWQgd2l0aCB0aGUgd29ya3NwYWNlIGJ1dCBub3Qgd2l0aCBhbnkKLQkgKiAgICBwYXJ0aWN1bGFyIHdvcmtzcGFjZSByZXNvdXJjZQotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzZXJ2ZXIgaW5zdGFuY2UsCi0JICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgbmV3IHNlcnZlciB3b3JraW5nIGNvcHkgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGlzIHJ1bnRpbWUKLQkgKiAgICBvciBzZXR0aW5nIGl0J3MgZGVmYXVsdCB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVNlcnZlcihTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd29ya2luZyBjb3B5IGluc3RhbmNlIG9mIHRoaXMgc2VydmVyIHR5cGUuCi0JICogQWZ0ZXIgc2V0dGluZyB2YXJpb3VzIHByb3BlcnRpZXMgb2YgdGhlIHdvcmtpbmcgY29weSwKLQkgKiB0aGUgY2xpZW50IHNob3VsZCBjYWxsIHtAbGluayBJU2VydmVyV29ya2luZ0NvcHkjc2F2ZShib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiB0byBicmluZyB0aGUgc2VydmVyIGluc3RhbmNlIGludG8gZXhpc3RlbmNlLgotCSAqIDxwPgotCSAqIFtpc3N1ZTogU2luY2UgdGhpcyBtZXRob2QganVzdCBjcmVhdGVzIGEgd29ya2luZyBjb3B5LAotCSAqIGl0J3Mgbm90IGNsZWFyIHRoZSBvcGVyYXRpb24gaXMgbG9uZy1ydW5uaW5nIGFuZCBpbiBuZWVkCi0JICogb2YgYSBwcm9ncmVzcyBtb25pdG9yLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIHNlcnZlciByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBpdCdzIGhvc3Qgc2V0IHRvCi0JICogImxvY2FsaG9zdCIuIE90aGVyIGRlZmF1bHRzIHdpbGwgYmUgc2V0IGJ5IGNhbGxpbmcgdGhlIHNlcnZlcgotCSAqIGRlbGVnYXRlJ3Mgc2V0RGVmYXVsdHMoKSBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzZXJ2ZXIKLQkgKiBjb25maWcgd29ya2luZyBjb3B5LCB3aGVyZWFzIHRoZSBvdGhlciBvbmUgZG9lcyBub3QhPwotCSAqIENvbnNpZGVyIGNvbWJpbmluZyB0aGUgbWV0aG9kIHdpdGggdGhlIG90aGVyLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkIHRoZSBpZCB0byBhc3NpZ24gdG8gdGhlIHNlcnZlciBpbnN0YW5jZTsgdGhlIGRlZmF1bHQgbmFtZSBpcwotCSAqICAgIHVzZWQgaWYgaWQgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gZW1wdHkgc3RyaW5nCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSB3aGVyZSB0aGUgc2VydmVyIGluc3RhbmNlCi0JICogICAgaXMgdG8gYmUgc2VyaWFsaXplZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGluZm9ybWF0aW9uIGlzCi0JICogICAgaW5zdGVhZCB0byBiZSBwZXJzaXN0ZWQgd2l0aCB0aGUgd29ya3NwYWNlIGJ1dCBub3Qgd2l0aCBhbnkKLQkgKiAgICBwYXJ0aWN1bGFyIHdvcmtzcGFjZSByZXNvdXJjZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgbmV3IHNlcnZlciB3b3JraW5nIGNvcHkgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGlzIHJ1bnRpbWUKLQkgKiAgICBvciBzZXR0aW5nIGl0J3MgZGVmYXVsdCB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVNlcnZlcihTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNThhODhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJXb3JraW5nQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLS8qKgotICogQSB3b3JraW5nIGNvcHkgc2VydmVyIG9iamVjdCB1c2VkIGZvciBmb3JtdWxhdGluZyBjaGFuZ2VzCi0gKiB0byBhIHNlcnZlciBpbnN0YW5jZSAoe0BsaW5rIElTZXJ2ZXJ9KS4gQ2hhbmdlcyBtYWRlIG9uIGEKLSAqIHdvcmtpbmcgY29weSBkbyBub3Qgb2NjdXIgKGFuZCBhcmUgbm90IHBlcnNpc3RlZCkgdW50aWwgYQotICogc2F2ZSgpIGlzIHBlcmZvcm1lZC4KLSAqIDxwPgotICogSWYgdGhlIGNsaWVudCBvZiB0aGlzIHdvcmtpbmcgY29weSBjYWxscyBsb2FkQWRhcHRlcigpLCBhIG5ldyBpbnN0YW5jZSBvZgotICogdGhlIGRlbGVnYXRlIChTZXJ2ZXJEZWxlZ2F0ZSkgd2lsbCBiZSBjcmVhdGVkIHRvIGhlbHAgdGhpcyB3b3JraW5nIGNvcHkuCi0gKiBUaGlzIGRlbGVnYXRlIGluc3RhbmNlIHdpbGwgYmUgdXNlZCBhcyBsb25nIGFzIHRoaXMgd29ya2luZyBjb3B5IGV4aXN0cy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyV29ya2luZ0NvcHkgZXh0ZW5kcyBJU2VydmVyQXR0cmlidXRlcyB7Ci0JLyoqCi0JICogU3RhdHVzIGNvZGUgKHZhbHVlIDEpIHJldHVybmVkIGZyb20gdGhlIHNhdmUoKSBtZXRob2Qgd2hlbiB0aGUgc2F2ZQotCSAqIGZhaWxlZCB3aXRoIGZvcmNlIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4gYmVjYXVzZSB0aGUgcnVudGltZSBoYXMKLQkgKiBiZWVuIG1vZGlmaWVkIGFuZCBzYXZlZCBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2VlICNzYXZlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FWRV9DT05GTElDVCA9IDE7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIHNlcnZlci4KLQkgKiA8cD4KLQkgKiBUaGUgbmFtZSBzaG91bGQgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbmFtZSBhIGRpc3BsYXlhYmxlIG5hbWUKLQkgKiBAc2VlIElTZXJ2ZXJBdHRyaWJ1dGVzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQotCS8qKgotCSAqIFNldHMgb3IgdW5zZXRzIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgbWFya2VkIGFzIHJlYWQgb25seS4KLQkgKiBXaGVuIGEgc2VydmVyIGlzIHJlYWQgb25seSwgd29ya2luZyBjb3BpZXMgY2FuIGJlIGNyZWF0ZWQgYnV0Ci0JICogdGhleSBjYW5ub3QgYmUgc2F2ZWQuCi0JICoKLQkgKiBAcGFyYW0gcmVhZE9ubHkgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc2V0IHRoaXMgc2VydmVyIHRvIGJlIG1hcmtlZAotCSAqICAgIHJlYWQgb25seSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiB0byB1bnNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHdvcmtpbmcgY29weSBoYXMgdW5zYXZlZCBjaGFuZ2VzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3b3JraW5nIGNvcHkgaGFzIHVuc2F2ZWQKLQkgKiAgICBjaGFuZ2VzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKTsKLQotCS8qKgotCSAqIEFkZHMgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICogPHA+Ci0JICogT25jZSByZWdpc3RlcmVkLCBhIGxpc3RlbmVyIHN0YXJ0cyByZWNlaXZpbmcgbm90aWZpY2F0aW9uIG9mIAotCSAqIHByb3BlcnR5IGNoYW5nZXMgdG8gdGhpcyBzZXJ2ZXIuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZQotCSAqIG5vdGlmaWNhdGlvbnMgdW50aWwgaXQgaXMgcmVtb3ZlZC4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0JICogQHNlZSAjcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBzZXJ2ZXIuCi0JICogSGFzIG5vIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiBAc2VlICNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlciB3b3JraW5nIGNvcHkuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHNlcnZlciBjb25maWd1cmF0aW9uIG9mIGEgc2VydmVyIHdvcmtpbmcgY29weSBtYXkKLQkgKiBvciBtYXkgbm90IGJlIGEgd29ya2luZyBjb3B5LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IEFjY29yZGluZyB0byBzZXJ2ZXJUeXBlIGV4dGVuc2lvbiBwb2ludCwgCi0JICogY29uZmlndXJhdGlvblR5cGVJZCBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUuIFdoYXQgaGFwcGVucyBpZiB0aGUKLQkgKiBzZXJ2ZXIgY29uZmlndXJhdGlvbiBwYXNzZWQgaXMgbnVsbCBidXQgdGhlIHNlcnZlciBtdXN0IGhhdmUgYQotCSAqIHNlcnZlciBjb25maWd1cmF0aW9uPyBXaGF0IGhhcHBlbnMgb2YgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uCi0JICogaGFzIHRoZSB3cm9uZyB0eXBlPyBEbyB0aGUgZXJyb3JzIGdldCBkZXRlY3RlZCBhbmQgcmVwb3J0ZWQgbm93LCBvcgotCSAqIHVwb24gc2F2ZSgpP10KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmVyQ29uZmlndXJhdGlvbihJRm9sZGVyIGNvbmZpZ3VyYXRpb24pOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciBpbnN0YW5jZSB0aGF0IHRoaXMgd29ya2luZyBjb3B5IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqIDxwPgotCSAqIEZvciBhIHNlcnZlciB3b3JraW5nIGNvcHkgY3JlYXRlZCBieSBhIGNhbGwgdG8KLQkgKiB7QGxpbmsgSVNlcnZlciNjcmVhdGVXb3JraW5nQ29weSgpfSwKLQkgKiA8Y29kZT50aGlzLmdldE9yaWdpbmFsKCk8L2NvZGU+IHJldHVybnMgdGhlIG9yaWdpbmFsCi0JICogc2VydmVyIG9iamVjdC4gRm9yIGEgc2VydmVyIHdvcmtpbmcgY29weSBqdXN0IGNyZWF0ZWQgYnkKLQkgKiBhIGNhbGwgdG8ge0BsaW5rIElTZXJ2ZXJUeXBlI2NyZWF0ZVNlcnZlcihTdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yKX0sCi0JICogPGNvZGU+dGhpcy5nZXRPcmlnaW5hbCgpPC9jb2RlPiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIHNlcnZlciBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldE9yaWdpbmFsKCk7Ci0KLQkvKioKLQkgKiBDb21taXRzIHRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhpcyB3b3JraW5nIGNvcHkuIElmIHRoZXJlIGlzCi0JICogbm8gZXh0YW50IHNlcnZlciBpbnN0YW5jZSB3aXRoIGEgbWF0Y2hpbmcgaWQgYW5kIHNlcnZlcgotCSAqIHR5cGUsIHRoaXMgd2lsbCBjcmVhdGUgYSBzZXJ2ZXIgaW5zdGFuY2Ugd2l0aCBhdHRyaWJ1dGVzCi0JICogdGFrZW4gZnJvbSB0aGlzIHdvcmtpbmcgY29weS4gSWYgdGhlcmUgYW4gZXhpc3Rpbmcgc2VydmVyCi0JICogaW5zdGFuY2Ugd2l0aCBhIG1hdGNoaW5nIGlkIGFuZCBzZXJ2ZXIgdHlwZSwgdGhpcyB3aWxsCi0JICogY2hhbmdlIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgYWNjb3JkaW5nbHkuCi0JICogPHA+Ci0JICogSWYgdGhlcmUgYW4gZXhpc3Rpbmcgc2VydmVyIGluc3RhbmNlIHdpdGggYSBtYXRjaGluZyBpZCBhbmQKLQkgKiBzZXJ2ZXIgdHlwZSwgdGhpcyB3aWxsIGNoYW5nZSB0aGUgc2VydmVyIGluc3RhbmNlIGFjY29yZGluZ2x5LgotCSAqIFRoZSByZXR1cm5lZCBzZXJ2ZXIgd2lsbCBiZSB0aGUgc2FtZSBzZXJ2ZXIgdGhpcyBpcyByZXR1cm5lZAotCSAqIGZyb20gZ2V0T3JpZ2luYWwoKSwgYWZ0ZXIgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIGFwcGxpZWQuCi0JICogT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgc2VydmVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBTZXJ2ZXJzIGNhbiBiZSBzYXZlZCBldmVuIHdoZW4gdGhleSBoYXZlIGludmFsaWQgcHJvcGVydGllcy4gSXQKLQkgKiBpcyB0aGUgY2xpZW50cyByZXNwb25zaWJpbGl0eSB0byB2YWxpZGF0ZSBvciBjaGVjayB0aGUKLQkgKiBwcm9wZXJ0aWVzIGJlZm9yZSBzYXZpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFwcGx5IGNoYW5nZXMgdG8gdGhlIHNlcnZlci4gQSBwdWJsaXNoKCkKLQkgKiBtdXN0IGJlIGNvbXBsZXRlZCB0byBwdXNoIG91dCBhZnRlciB0aGUgc2F2ZSB0byBwdXNoIG91dCBhbnkKLQkgKiBjaGFuZ2VzIHRvIHRoZSBzZXJ2ZXIuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogU2luY2UgaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBjb21taXQgYSBzZXJ2ZXIKLQkgKiB3b3JraW5nIGNvcHkgd2l0aG91dCBmaXJzdCBjb21taXR0aW5nIGFueSBhc3NvY2lhdGVkCi0JICogcnVudGltZSBhbmQgc2VydmVyIGNvbmZpZyB3b3JraW5nIGNvcGllcywgdGhlIHNlbWFudGljcwotCSAqIG9mIHNhdmVBbGwgc2hvdWxkIGJlIHBhcnQgYW5kIHBhcmNlbCBvZiB0aGUKLQkgKiBub3JtYWwgc2F2ZSwgYW5kIHRoZSBzYXZlQWxsIG1ldGhvZCBlbGltaW5hdGVkLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGZvcmNlIDxjb2RlPnRydWU8L2NvZGU+IHRvIGZvcmNlIHRoZSBzYXZlLCBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICBvdGhlcndpc2UKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIG5ldyBzZXJ2ZXIgaW5zdGFuY2UKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igc2F2aW5nIHRoZSBzZXJ2ZXIKLQkgKiBAc2VlICNTQVZFX0NPTkZMSUNUCi0JICovCi0JcHVibGljIElTZXJ2ZXIgc2F2ZShib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ29tbWl0cyB0aGUgY2hhbmdlcyBtYWRlIGluIHRoaXMgc2VydmVyIHdvcmtpbmcgY29weSBhZnRlcgotCSAqIGZpcnN0IGNvbW1pdHRpbmcgYW55IGFzc29jaWF0ZWQgc2VydmVyIGNvbmZpZ3VyYXRpb24gb3IKLQkgKiBzZXJ2ZXIgcnVudGltZSB3b3JraW5nIGNvcGllcy4KLQkgKiA8cD4KLQkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvOgotCSAqIDxwcmU+Ci0JICogSVJ1bnRpbWUgcnQgPSB0aGlzLmdldFJ1bnRpbWUoKTsKLQkgKiBpZiAocnQgIT0gbnVsbCAmJiBydC5pc1dvcmtpbmdDb3B5KCkpIHsKLQkgKiAgICAoKElSdW50aW1lV29ya2luZ0NvcHkpIHJ0KS5zYXZlKG1vbml0b3IpOwotCSAqIH0KLQkgKiBJU2VydmVyQ29uZmlndXJhdGlvbiBjZiA9IHRoaXMuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCSAqIGlmIChjZiAhPSBudWxsICYmIGNmLmlzV29ya2luZ0NvcHkoKSkgewotCSAqICAgICgoSVNlcnZlckNvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkgY2YpLnNhdmUobW9uaXRvcik7Ci0JICogfQotCSAqIHJldHVybiBzYXZlKG1vbml0b3IpOwotCSAqIDwvcHJlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNpbmNlIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gY29tbWl0IGEgc2VydmVyCi0JICogd29ya2luZyBjb3B5IHdpdGhvdXQgZmlyc3QgY29tbWl0dGluZyBhbnkgYXNzb2NpYXRlZAotCSAqIHJ1bnRpbWUgYW5kIHNlcnZlciBjb25maWcgd29ya2luZyBjb3BpZXMsIHRoZSBzZW1hbnRpY3MKLQkgKiBvZiB0aGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgcGFydCBhbmQgcGFyY2VsIG9mIHRoZQotCSAqIG5vcm1hbCBzYXZlLCBhbmQgdGhlIHNhdmVBbGwgbWV0aG9kIGVsaW1pbmF0ZWQuXQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2UgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZm9yY2UgdGhlIHNhdmUsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgbmV3IHNlcnZlciBpbnN0YW5jZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBzYXZpbmcgdGhlIHNlcnZlciwgcnVudGltZSwgb3IKLQkgKiAgICBzZXJ2ZXIgY29uZmlndXJhdGlvbgotCSAqIEBzZWUgI1NBVkVfQ09ORkxJQ1QKLQkgKi8KLQlwdWJsaWMgSVNlcnZlciBzYXZlQWxsKGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBydW50aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlciB3b3JraW5nIGNvcHkuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHJ1bnRpbWUgb2YgYSBzZXJ2ZXIgd29ya2luZyBjb3B5IG1heQotCSAqIG9yIG1heSBub3QgYmUgYSB3b3JraW5nIGNvcHkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogQWNjb3JkaW5nIHRvIHNlcnZlclR5cGUgZXh0ZW5zaW9uIHBvaW50LCAKLQkgKiBydW50aW1lVHlwZUlkIGlzIGEgbWFuZGF0b3J5IGF0dHJpYnV0ZS4gQnV0IElTZXJ2ZXIuZ2V0UnVudGltZSgpCi0JICogaXMgYWxsb3dlZCB0byByZXR1cm4gbnVsbCwgc3VnZ2VzdGluZyB0aGF0IGl0IGlzIG9wdGlvbmFsIGZvciBpbnN0YW5jZXMuCi0JICogV2hhdCBoYXBwZW5zIGlmIHRoZSBydW50aW1lIHBhc3NlZCBpcyBudWxsIGJ1dCB0aGUgc2VydmVyIG11c3QKLQkgKiBoYXZlIGEgcnVudGltZT8gV2hhdCBoYXBwZW5zIGlmIHRoZSBydW50aW1lIGhhcyB0aGUgd3JvbmcKLQkgKiB0eXBlPyBEbyB0aGUgZXJyb3JzIGdldCBkZXRlY3RlZCBhbmQgcmVwb3J0ZWQgbm93LCBvciB1cG9uIHNhdmUoKT9dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVudGltZShJUnVudGltZSBydW50aW1lKTsKLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGhvc3QgZm9yIHRoZSBzZXJ2ZXIuCi0JICogVGhlIGZvcm1hdCBvZiB0aGUgaG9zdCBjYW4gYmUgZWl0aGVyIGEgcXVhbGlmaWVkIG9yIHVucXVhbGlmaWVkIGhvc3RuYW1lLAotCSAqIG9yIGFuIElQIGFkZHJlc3MgYW5kIG11c3QgY29uZm9ybSB0byBSRkMgMjczMi4KLQkgKiAKLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFRoaXMgaXMgYSBxdWVzdGlvbmFibGUgb3BlcmF0aW9uIGlmIHRoZXJlIGlzIGEgcnVubmluZwotCSAqIHNlcnZlciBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsLiBXaGVuIGEgaG9zdCBuYW1lCi0JICogY2hhbmdlIGlzIGNvbW1pdHRlZCwgdGhlIHNlcnZlciBpbnN0YW5jZSBsb3NlcyBjb250YWN0IHdpdGgKLQkgKiB0aGUgcnVubmluZyBzZXJ2ZXIgYmVjYXVzZSBvZiB0aGUgaG9zdCBuYW1lIGNoYW5nZS5dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBob3N0IGEgaG9zdCBzdHJpbmcgY29uZm9ybWluZyB0byBSRkMgMjczMgotCSAqIEBzZWUgSVNlcnZlciNnZXRIb3N0KCkKLQkgKiBAc2VlIGphdmEubmV0LlVSTCNnZXRIb3N0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KTsKLQotCS8qKgotCSAqIE1vZGlmaWVzIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2ZXIuCi0JICogVGhlIG1vZHVsZXMgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPmFkZDwvY29kZT4gbGlzdAotCSAqIG11c3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSBhbmQgbXVzdCBub3QgYWxyZWFkeSBiZSBhc3NvY2lhdGVkCi0JICogd2l0aCB0aGUgc2VydmVyLgotCSAqIFRoZSBtb2R1bGVzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5yZW1vdmU8L2NvZGU+IGxpc3QKLQkgKiBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmVyLCBidXQgbWF5IG9yIG1heSBub3QgZXhpc3QKLQkgKiBpbiB0aGUgd29ya3NwYWNlLgotCSAqIEVudHJpZXMgaW4gdGhlIGFkZCBvciByZW1vdmUgbGlzdHMgbWF5IG5vdCBiZSBudWxsLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci4gQWZ0ZXIgc2F2aW5nLAotCSAqIHB1Ymxpc2goKSBjYW4gYmUgdXNlZCB0byBzeW5jIHVwIHdpdGggdGhlIHNlcnZlci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBmYWlsIHdpdGggdGhlIHNhbWUgc3RhdHVzIGV4Y2VwdGlvbgotCSAqIGlmIHRoZSByZXN1bHQgb2YgY2FuTW9kaWZ5TW9kdWxlcygpIGlzIGFuIGVycm9yIHN0YXR1cy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBIb3cgdG8gZm9ybXVsYXRlIHdoYXQgaXQgbWVhbnMKLQkgKiB0byBzYXkgInRoZSBtb2R1bGUgbXVzdCBleGlzdCBpbiB0aGUgd29ya3NwYWNlIj9dCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogVGhlIHNwZWMgc2hvdWxkIGJlIG1vcmUgbGF4LiBBdHRlbXB0aW5nIHRvIGFkZAotCSAqIGEgbW9kdWxlIHRoYXQncyBhbHJlYWR5IGluY2x1ZGUgc2hvdWxkIGJlIHF1aWV0bHkgaWdub3JlOwotCSAqIGRpdHRvIHJlbW92aW5nIGEgbW9kdWxlIHRoYXQncyBub3Qgb24gdGhpcyBsaXN0LiBUaGlzCi0JICogc2ltcGxpZmllcyB0aGUgaGFuZGxpbmcgb2YgdmFyaW91cyBvdGhlciB3YWNrbyBjYXNlcyAKLQkgKiBzdWNoIGFzIGR1cGxpY2F0aW9uIHdpdGhpbiBhbmQgYmV0d2VlbiB0aGUgYWRkIGFuZCByZW1vdmUKLQkgKiBsaXN0cy5dCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogV2hhdCBlcnJvciBjaGVja2luZyBzaG91bGQgYmUgcGVyZm9ybWVkIGJ5IHRoaXMKLQkgKiBvcGVyYXRpb24sIGFuZCB3aGF0IG5lZWRzIHRvIGJlIHBlcmZvcm1lZCBieSBzYXZlKCkgaWYKLQkgKiB0aGUgY2xpZW50IHRyaWVzIHRvIGNvbW1pdCB0aGVzZSBoeXBvdGhldGlzaXplZCBjaGFuZ2VzP10KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFkZCBhIHBvc3NpYmx5LWVtcHR5IGxpc3Qgb2YgbW9kdWxlcyB0byBhZGQKLQkgKiBAcGFyYW0gcmVtb3ZlIGEgcG9zc2libHktZW1wdHkgbGlzdCBvZiBtb2R1bGVzIHRvIHJlbW92ZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIGNoYW5nZXMgYXJlIG5vdCBhbGxvd2VkIG9yIGNvdWxkIG5vdAotCSAqICAgIGJlIHByb2Nlc3NlZAotCSAqIEBzZWUgSVNlcnZlckF0dHJpYnV0ZXMjY2FuTW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10sIElNb2R1bGVbXSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyQ29yZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyQ29yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmI2ZjBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlckNvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLio7Ci0vKioKLSAqIE1haW4gY2xhc3MgZm9yIHNlcnZlciBjb3JlIEFQSS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBBUEkgdG8gYWNjZXNzIG1vc3Qgb2YgdGhlIHR5cGVzIGluIHRoZSBzZXJ2ZXIKLSAqIGZyYW1ld29yaywgaW5jbHVkaW5nIHNlcnZlciBydW50aW1lcyBhbmQgc2VydmVycy4KLSAqIFRoZSBtZXRob2RzIG9uIHRoaXMgY2xhc3MgYXJlIHRocmVhZCBzYWZlLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLgotICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3IgaW5zdGFudGlhdGVkLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2ZXJDb3JlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1NFUlZFUl9UWVBFID0gInNlcnZlclR5cGVzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1JVTlRJTUVfVFlQRSA9ICJydW50aW1lVHlwZXMiOwotCi0JLy8JY2FjaGVkIGNvcHkgb2YgYWxsIHJ1bnRpbWUgdHlwZXMKLQlwcml2YXRlIHN0YXRpYyBMaXN0PElSdW50aW1lVHlwZT4gcnVudGltZVR5cGVzOwotCi0JLy8JY2FjaGVkIGNvcHkgb2YgYWxsIHNlcnZlciBhbmQgY29uZmlndXJhdGlvbiB0eXBlcwotCXByaXZhdGUgc3RhdGljIExpc3Q8SVNlcnZlclR5cGU+IHNlcnZlclR5cGVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgcmVnaXN0cnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcmVnaXN0cnlDaGFuZ2VkKElSZWdpc3RyeUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJRXh0ZW5zaW9uRGVsdGFbXSBkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1JVTlRJTUVfVFlQRSk7Ci0JCQlpZiAoZGVsdGFzICE9IG51bGwpIHsKLQkJCQlmb3IgKElFeHRlbnNpb25EZWx0YSBkZWx0YSA6IGRlbHRhcykKLQkJCQkJaGFuZGxlUnVudGltZVR5cGVEZWx0YShkZWx0YSk7Ci0JCQl9Ci0JCQkKLQkJCWRlbHRhcyA9IGV2ZW50LmdldEV4dGVuc2lvbkRlbHRhcyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fU0VSVkVSX1RZUEUpOwotCQkJaWYgKGRlbHRhcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJRXh0ZW5zaW9uRGVsdGEgZGVsdGEgOiBkZWx0YXMpCi0JCQkJCWhhbmRsZVNlcnZlclR5cGVEZWx0YShkZWx0YSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYW5ub3QgaW5zdGFudGlhdGUgU2VydmVyQ29yZSAtIHVzZSBzdGF0aWMgbWV0aG9kcy4KLQkgKi8KLQlwcml2YXRlIFNlcnZlckNvcmUoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIG1hbmFnZXIuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcigpIHsKLQkJcmV0dXJuIFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZWZlcmVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9qZWN0LiBUaGUgcHJvamVjdCBtYXkgbm90Ci0JICogYmUgbnVsbC4KLQkgKgotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdGhlIHByb2plY3QKLQkgKiBAZGVwcmVjYXRlZCBQcm9qZWN0IGZhY2V0IHN1cHBvcnQgc2hvdWxkIG5vdyBiZSB1c2VkIGluc3RlYWQgb2YgdGhpcyBBUEkuIEBzZWUKLQkgKiAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QjZ2V0UnVudGltZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFByb3BlcnRpZXMgZ2V0UHJvamVjdFByb3BlcnRpZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlyZXR1cm4gbmV3IElQcm9qZWN0UHJvcGVydGllcygpIHsKLQkJCXB1YmxpYyBJUnVudGltZSBnZXRSdW50aW1lVGFyZ2V0KCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHJ1bnRpbWUgdHlwZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgcnVudGltZSB0eXBlcyB7QGxpbmsgSVJ1bnRpbWVUeXBlfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVUeXBlW10gZ2V0UnVudGltZVR5cGVzKCkgewotCQlpZiAocnVudGltZVR5cGVzID09IG51bGwpCi0JCQlsb2FkUnVudGltZVR5cGVzKCk7Ci0JCQotCQlJUnVudGltZVR5cGVbXSBydCA9IG5ldyBJUnVudGltZVR5cGVbcnVudGltZVR5cGVzLnNpemUoKV07Ci0JCXJ1bnRpbWVUeXBlcy50b0FycmF5KHJ0KTsKLQkJcmV0dXJuIHJ0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgdHlwZSB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgotCSAqIHJ1bnRpbWUgdHlwZXMgKHtAbGluayAjZ2V0UnVudGltZVR5cGVzKCl9KSBmb3IgdGhlIG9uZSB3aXRoIGEgbWF0Y2hpbmcKLQkgKiBydW50aW1lIHR5cGUgaWQgKHtAbGluayBJUnVudGltZVR5cGUjZ2V0SWQoKX0pLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBydW50aW1lIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHJ1bnRpbWUgdHlwZQotCSAqIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZVR5cGUgZmluZFJ1bnRpbWVUeXBlKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotCQlpZiAocnVudGltZVR5cGVzID09IG51bGwpCi0JCQlsb2FkUnVudGltZVR5cGVzKCk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IHJ1bnRpbWVUeXBlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSAoSVJ1bnRpbWVUeXBlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKHJ1bnRpbWVUeXBlLmdldElkKCkpKQotCQkJCXJldHVybiBydW50aW1lVHlwZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBzZXJ2ZXIgdHlwZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2Ygc2VydmVyIHR5cGVzIHtAbGluayBJU2VydmVyVHlwZX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXJUeXBlW10gZ2V0U2VydmVyVHlwZXMoKSB7Ci0JCWlmIChzZXJ2ZXJUeXBlcyA9PSBudWxsKQotCQkJbG9hZFNlcnZlclR5cGVzKCk7Ci0JCQotCQlJU2VydmVyVHlwZVtdIHN0ID0gbmV3IElTZXJ2ZXJUeXBlW3NlcnZlclR5cGVzLnNpemUoKV07Ci0JCXNlcnZlclR5cGVzLnRvQXJyYXkoc3QpOwotCQlyZXR1cm4gc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBzZXJ2ZXIgdHlwZXMgKHtAbGluayAjZ2V0U2VydmVyVHlwZXMoKX0pIGZvciB0aGUgb25lIHdpdGggYSBtYXRjaGluZwotCSAqIHNlcnZlciB0eXBlIGlkICh7QGxpbmsgSVNlcnZlclR5cGUjZ2V0SWQoKX0pLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBzZXJ2ZXIgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIHNlcnZlciB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzZXJ2ZXIgdHlwZQotCSAqIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyVHlwZSBmaW5kU2VydmVyVHlwZShTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJaWYgKHNlcnZlclR5cGVzID09IG51bGwpCi0JCQlsb2FkU2VydmVyVHlwZXMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVyVHlwZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IChJU2VydmVyVHlwZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhzZXJ2ZXJUeXBlLmdldElkKCkpKQotCQkJCXJldHVybiBzZXJ2ZXJUeXBlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHJ1bnRpbWUgdHlwZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZFJ1bnRpbWVUeXBlcygpIHsKLQkJaWYgKHJ1bnRpbWVUeXBlcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAucnVudGltZVR5cGVzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9SVU5USU1FX1RZUEUpOwotCQlMaXN0PElSdW50aW1lVHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVUeXBlPihjZi5sZW5ndGgpOwotCQlhZGRSdW50aW1lVHlwZXMoY2YsIGxpc3QpOwotCQlhZGRSZWdpc3RyeUxpc3RlbmVyKCk7Ci0JCXJ1bnRpbWVUeXBlcyA9IGxpc3Q7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5ydW50aW1lVHlwZXMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHJ1bnRpbWUgdHlwZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgYWRkUnVudGltZVR5cGVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmLCBMaXN0PElSdW50aW1lVHlwZT4gbGlzdCkgewotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNmKSB7Ci0JCQl0cnkgewotCQkJCWlmICghU2VydmVyUGx1Z2luLmNvbnRhaW5zKFNlcnZlclBsdWdpbi5nZXRFeGNsdWRlZFNlcnZlckFkYXB0ZXJzKCksIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSkpCi0JCQkJCWxpc3QuYWRkKG5ldyBSdW50aW1lVHlwZShjZSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIHJ1bnRpbWVUeXBlOiAiICsgY2UuZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBydW50aW1lVHlwZTogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBzZXJ2ZXIgdHlwZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZFNlcnZlclR5cGVzKCkgewotCQlpZiAoc2VydmVyVHlwZXMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5zZXJ2ZXJUeXBlcyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fU0VSVkVSX1RZUEUpOwotCQlMaXN0PElTZXJ2ZXJUeXBlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJU2VydmVyVHlwZT4oY2YubGVuZ3RoKTsKLQkJYWRkU2VydmVyVHlwZXMoY2YsIGxpc3QpOwotCQlhZGRSZWdpc3RyeUxpc3RlbmVyKCk7Ci0JCXNlcnZlclR5cGVzID0gbGlzdDsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi08LSBEb25lIGxvYWRpbmcgLnNlcnZlclR5cGVzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBzZXJ2ZXIgdHlwZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgYWRkU2VydmVyVHlwZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YsIExpc3Q8SVNlcnZlclR5cGU+IGxpc3QpIHsKLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgOiBjZikgewotCQkJdHJ5IHsKLQkJCQlpZiAoIVNlcnZlclBsdWdpbi5jb250YWlucyhTZXJ2ZXJQbHVnaW4uZ2V0RXhjbHVkZWRTZXJ2ZXJBZGFwdGVycygpLCBjZS5nZXRBdHRyaWJ1dGUoImlkIikpKQotCQkJCQlsaXN0LmFkZChuZXcgU2VydmVyVHlwZShjZSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIHNlcnZlclR5cGU6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHNlcnZlclR5cGU6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgotCSAqIHJ1bnRpbWVzICh7QGxpbmsgI2dldFJ1bnRpbWVzKCl9KSBmb3IgdGhlIG9uZSB3aXRoIGEgbWF0Y2hpbmcKLQkgKiBydW50aW1lIGlkICh7QGxpbmsgSVJ1bnRpbWUjZ2V0SWQoKX0pLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBydW50aW1lIGlkCi0JICogQHJldHVybiB0aGUgcnVudGltZSBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gcnVudGltZQotCSAqIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZSBmaW5kUnVudGltZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTWFuYWdlcigpLmdldFJ1bnRpbWUoaWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHJ1bnRpbWUgaW5zdGFuY2VzLiBUaGUgbGlzdCB3aWxsIG5vdCBjb250YWluIGFueQotCSAqIHdvcmtpbmcgY29waWVzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBydW50aW1lIGluc3RhbmNlcyB7QGxpbmsgSVJ1bnRpbWV9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZVtdIGdldFJ1bnRpbWVzKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuZ2V0UnVudGltZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBzZXJ2ZXJzICh7QGxpbmsgI2dldFNlcnZlcnMoKX0pIGZvciB0aGUgb25lIHdpdGggYSBtYXRjaGluZwotCSAqIHNlcnZlciBpZCAoe0BsaW5rIElTZXJ2ZXIjZ2V0SWQoKX0pLiBUaGUgaWQgbXVzdCBub3QgYmUgbnVsbC4KLQkgKgotCSAqIEBwYXJhbSBpZCB0aGUgc2VydmVyIGlkCi0JICogQHJldHVybiB0aGUgc2VydmVyIGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzZXJ2ZXIKLQkgKiB3aXRoIHRoZSBnaXZlbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBmaW5kU2VydmVyKFN0cmluZyBpZCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuZ2V0U2VydmVyKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBzZXJ2ZXIgaW5zdGFuY2VzLiBUaGUgYXJyYXkgd2lsbCBub3QgaW5jbHVkZSBhbnkKLQkgKiB3b3JraW5nIGNvcGllcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2Ygc2VydmVyIGluc3RhbmNlcyB7QGxpbmsgSVNlcnZlcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXJbXSBnZXRTZXJ2ZXJzKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuZ2V0U2VydmVycygpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgcnVudGltZSBsaWZlY3ljbGUgbGlzdGVuZXIuCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgcnVudGltZSBsaWZlY3ljbGUgbGlzdGVuZXIKLQkgKiBAc2VlICNyZW1vdmVSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIoSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuYWRkUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgcnVudGltZSBsaWZlY3ljbGUgbGlzdGVuZXIuCi0JICogSGFzIG5vIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBydW50aW1lIGxpZmVjeWNsZSBsaXN0ZW5lcgotCSAqIEBzZWUgI2FkZFJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcihJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIoSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRSZXNvdXJjZU1hbmFnZXIoKS5yZW1vdmVSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgc2VydmVyIGxpZmVjeWNsZSBsaXN0ZW5lci4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBzZXJ2ZXIgbGlmZWN5Y2xlIGxpc3RlbmVyCi0JICogQHNlZSAjcmVtb3ZlU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBzZXJ2ZXIgbGlmZWN5Y2xlIGxpc3RlbmVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgc2VydmVyIGxpZmVjeWNsZSBsaXN0ZW5lcgotCSAqICNhZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRSZXNvdXJjZU1hbmFnZXIoKS5yZW1vdmVTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlZmVycmVkIHJ1bnRpbWUgc2VydmVyIGZvciB0aGUgZ2l2ZW4gbW9kdWxlLiBUaGlzIG1ldGhvZAotCSAqIHJldHVybnMgbnVsbCBpZiB0aGUgc2VydmVyIHdhcyBuZXZlciBjaG9zZW4gb3IgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0LiAoaWYgdGhlCi0JICogc2VydmVyIGlzIHJlY3JlYXRlZCBvciB3YXMgaW4gYSBjbG9zZWQgcHJvamVjdCwgZXRjLiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybgotCSAqIHRoZSBvcmlnaW5hbCB2YWx1ZSBpZiBpdCBiZWNvbWVzIGF2YWlsYWJsZSBhZ2FpbikKLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQgc2VydmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgIGRlZmF1bHQgc2VydmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGdldERlZmF1bHRTZXJ2ZXIoSU1vZHVsZSBtb2R1bGUpIHsKLQkJcmV0dXJuIE1vZHVsZVByb3BlcnRpZXMuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0U2VydmVyKG1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJlZmVycmVkIHJ1bnRpbWUgc2VydmVyIGZvciB0aGUgZ2l2ZW4gbW9kdWxlLiBTZXQgdGhlIHNlcnZlciB0bwotCSAqIG51bGwgdG8gY2xlYXIgdGhlIHNldHRpbmcuIElmIHRoZXJlIGlzIGEgcHJvYmxlbSBzYXZpbmcgdGhlIGZpbGUsIGEgQ29yZUV4Y2VwdGlvbgotCSAqIHdpbGwgYmUgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byBzZXQgdGhlIGRlZmF1bHQgZm9yCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHNldCB0aGUgZGVmYXVsdCBzZXJ2ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgdG8gdW5zZXQgdGhlIGRlZmF1bHQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBzZXR0aW5nIHRoZSBkZWZhdWx0IHNlcnZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0U2VydmVyKElNb2R1bGUgbW9kdWxlLCBJU2VydmVyIHNlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU1vZHVsZVByb3BlcnRpZXMuZ2V0SW5zdGFuY2UoKS5zZXREZWZhdWx0U2VydmVyKG1vZHVsZSwgc2VydmVyLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgY2hhbmdlIHRvIHRoZSBzZXJ2ZXIgdHlwZSBleHRlbnNpb24gcG9pbnQgZHVlIHRvIGJ1bmRsZXMgZ2V0dGluZyBhZGRlZAotCSAqIG9yIHJlbW92ZWQgZHluYW1pY2FsbHkgYXQgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgYW4gZXh0ZW5zaW9uIGRlbHRhCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhhbmRsZVNlcnZlclR5cGVEZWx0YShJRXh0ZW5zaW9uRGVsdGEgZGVsdGEpIHsKLQkJaWYgKHNlcnZlclR5cGVzID09IG51bGwpIC8vIG5vdCBsb2FkZWQgeWV0Ci0JCQlyZXR1cm47Ci0JCQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IGRlbHRhLmdldEV4dGVuc2lvbigpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkKLQkJTGlzdDxJU2VydmVyVHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlclR5cGU+KHNlcnZlclR5cGVzKTsKLQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJRXh0ZW5zaW9uRGVsdGEuQURERUQpIHsKLQkJCWFkZFNlcnZlclR5cGVzKGNmLCBsaXN0KTsKLQkJfSBlbHNlIHsKLQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQlTZXJ2ZXJUeXBlW10gc3QgPSBuZXcgU2VydmVyVHlwZVtzaXplXTsKLQkJCWxpc3QudG9BcnJheShzdCk7Ci0JCQlpbnQgc2l6ZTIgPSBjZi5sZW5ndGg7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCWlmIChzdFtpXS5nZXRJZCgpLmVxdWFscyhjZltqXS5nZXRBdHRyaWJ1dGUoImlkIikpKSB7Ci0JCQkJCQlzdFtpXS5kaXNwb3NlKCk7Ci0JCQkJCQlsaXN0LnJlbW92ZShzdFtpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2VydmVyVHlwZXMgPSBsaXN0OwotCQlnZXRSZXNvdXJjZU1hbmFnZXIoKS5yZXNvbHZlU2VydmVycygpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBjaGFuZ2UgdG8gdGhlIHJ1bnRpbWUgdHlwZSBleHRlbnNpb24gcG9pbnQgZHVlIHRvIGJ1bmRsZXMgZ2V0dGluZyBhZGRlZAotCSAqIG9yIHJlbW92ZWQgZHluYW1pY2FsbHkgYXQgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgYW4gZXh0ZW5zaW9uIGRlbHRhCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhhbmRsZVJ1bnRpbWVUeXBlRGVsdGEoSUV4dGVuc2lvbkRlbHRhIGRlbHRhKSB7Ci0JCWlmIChydW50aW1lVHlwZXMgPT0gbnVsbCkgLy8gbm90IGxvYWRlZCB5ZXQKLQkJCXJldHVybjsKLQkJCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gZGVsdGEuZ2V0RXh0ZW5zaW9uKCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQotCQlMaXN0PElSdW50aW1lVHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVUeXBlPihydW50aW1lVHlwZXMpOwotCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElFeHRlbnNpb25EZWx0YS5BRERFRCkgewotCQkJYWRkUnVudGltZVR5cGVzKGNmLCBsaXN0KTsKLQkJfSBlbHNlIHsKLQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQlSdW50aW1lVHlwZVtdIHJ0ID0gbmV3IFJ1bnRpbWVUeXBlW3NpemVdOwotCQkJbGlzdC50b0FycmF5KHJ0KTsKLQkJCWludCBzaXplMiA9IGNmLmxlbmd0aDsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJaWYgKHJ0W2ldLmdldElkKCkuZXF1YWxzKGNmW2pdLmdldEF0dHJpYnV0ZSgiaWQiKSkpIHsKLQkJCQkJCXJ0W2ldLmRpc3Bvc2UoKTsKLQkJCQkJCWxpc3QucmVtb3ZlKHJ0W2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlydW50aW1lVHlwZXMgPSBsaXN0OwotCQlnZXRSZXNvdXJjZU1hbmFnZXIoKS5yZXNvbHZlUnVudGltZXMoKTsKLQkJZ2V0UmVzb3VyY2VNYW5hZ2VyKCkucmVzb2x2ZVNlcnZlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFJlZ2lzdHJ5TGlzdGVuZXIoKSB7Ci0JCWlmIChyZWdpc3RyeUxpc3RlbmVyICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlyZWdpc3RyeUxpc3RlbmVyID0gbmV3IFJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVnaXN0cnkuYWRkUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcihyZWdpc3RyeUxpc3RlbmVyLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEKTsKLQkJU2VydmVyUGx1Z2luLnNldFJlZ2lzdHJ5TGlzdGVuZXIocmVnaXN0cnlMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQgdG8gYXV0b21hdGljYWxseQotCSAqIHB1Ymxpc2ggd2hlbiBzdGFydGluZyBzZXJ2ZXJzLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQgdG8gYXV0b21hdGljYWxseQotCSAqICAgIHB1Ymxpc2ggd2hlbiBzdGFydGluZyBzZXJ2ZXJzLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9QdWJsaXNoaW5nKCkgewotCQlyZXR1cm4gU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5pc0F1dG9QdWJsaXNoaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlckV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWIxZjEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLS8qKgotICogQW4gZXZlbnQgZmlyZWQgd2hlbiBhIHNlcnZlciBjaGFuZ2Ugb3IgbW9kdWxlIGNoYW5nZXMuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckV2ZW50IHsKLQlwcml2YXRlIElTZXJ2ZXIgc2VydmVyOwotCXByaXZhdGUgaW50IGtpbmQ7Ci0JcHJpdmF0ZSBJTW9kdWxlW10gbW9kdWxlVHJlZTsKLQlwcml2YXRlIGludCBzdGF0ZTsKLQlwcml2YXRlIGludCBwdWJsaXNoU3RhdGU7Ci0JcHJpdmF0ZSBib29sZWFuIHJlc3RhcnRTdGF0ZTsKLQkKLQkvKioKLQkgKiBGb3Igbm90aWZpY2F0aW9uIHdoZW4gdGhlIHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqIFRoaXMga2luZCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCA8Y29kZT5QVUJMSVNIX1NUQVRFX0NIQU5HRTwvY29kZT4gYW5kIAotCSAqIDxjb2RlPlJFU1RBUlRfU1RBVEVfQ0hBTkdFPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ0hBTkdFID0gMHgwMDAxOwotCQotCS8qKgotCSAqIEZpcmVkIHdoZW4gcHVibGlzaGVkIGlzIG5lZWRlZCBvciBubyBsb25nZXIgbmVlZHMgdG8gYmUgcHVibGlzaGVkLCAKLQkgKiBvciBpdCdzIHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqIFRoaXMga2luZCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCA8Y29kZT5TVEFURV9DSEFOR0U8L2NvZGU+IGFuZCAKLQkgKiA8Y29kZT5SRVNUQVJUX1NUQVRFX0NIQU5HRTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfU1RBVEVfQ0hBTkdFID0gMHgwMDAyOwotCQotCS8qKgotCSAqIEZvciBub3RpZmljYXRpb24gd2hlbiB0aGUgc2VydmVyIGlzUmVzdGFydE5lZWRlZCgpIHByb3BlcnR5IGNoYW5nZXMuCi0JICogPHA+Ci0JICogVGhpcyBraW5kIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIDxjb2RlPlNUQVRFX0NIQU5HRTwvY29kZT4gYW5kIAotCSAqIDxjb2RlPlBVQkxJU0hfU1RBVEVfQ0hBTkdFPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVEFSVF9TVEFURV9DSEFOR0UgPSAweDAwMDQ7Ci0JCi0JLyoqCi0JICogRm9yIGV2ZW50IG9uIHNlcnZlciBjaGFuZ2VzLiBUaGlzIGtpbmQgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggPGNvZGU+TU9EVUxFX0NIQU5HRTwvY29kZT4uCi0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVkVSX0NIQU5HRSA9IDB4MDAxMDsKLQkKLQkvKioKLQkgKiBGb3IgZXZlbnQgb24gbW9kdWxlIGNoYW5nZXMuIFRoaXMga2luZCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCA8Y29kZT5TRVJWRVJfQ0hBTkdFPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RVTEVfQ0hBTkdFID0gMHgwMDIwOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHNlcnZlciBldmVudCBmb3Igc2VydmVyIGNoYW5nZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgdGhlIGNoYW5nZS4gKDxjb2RlPlhYWF9DSEFOR0U8L2NvZGU+KS4gSWYgdGhlIGtpbmQgZG9lcyBub3QgCi0JICogICAgaW5jbHVkZSB0aGUgPGNvZGU+U0VSVkVSX0NIQU5HRTwvY29kZT4ga2luZCwgdGhlIFNFUlZFUl9DSEFOR0Ugd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LiAgCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBTZXJ2ZXJFdmVudH0KLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgc2VydmVyIGV2ZW50IHRha2VzIHBsYWNlCi0JICogQHBhcmFtIHN0YXRlIHRoZSBzZXJ2ZXIgc3RhdGUgYWZ0ZXIgdGhlIGNoYW5nZSAoPGNvZGU+U1RBVEVfWFhYPC9jb2RlPikKLQkgKiAgICBjb25zdGFudHMgZGVjbGFyZWQgb24ge0BsaW5rIElTZXJ2ZXJ9Ci0JICogQHBhcmFtIHB1Ymxpc2hpbmdTdGF0ZSB0aGUgc2VydmVyIHB1Ymxpc2hpbmcgc3RhdGUgYWZ0ZXIgdGhlIAotCSAqICAgIGNoYW5nZSAoPGNvZGU+UFVCTElTSF9TVEFURV9YWFg8L2NvZGU+KQotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgSVNlcnZlcn0KLQkgKiBAcGFyYW0gcmVzdGFydFN0YXRlIGdldCB0aGUgc2VydmVyIHJlc3RhcnQgc3RhdGUgYWZ0ZXIgdGhlIHNlcnZlciBpcyByZXN0YXJ0IAotCSAqICAgIG5lZWRlZCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyRXZlbnQoaW50IGtpbmQsIElTZXJ2ZXIgc2VydmVyLCBpbnQgc3RhdGUsIGludCBwdWJsaXNoaW5nU3RhdGUsIGJvb2xlYW4gcmVzdGFydFN0YXRlKSB7Ci0JCXRoaXMua2luZCA9IGtpbmQgfD0gU0VSVkVSX0NIQU5HRTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJdGhpcy5wdWJsaXNoU3RhdGUgPSBwdWJsaXNoaW5nU3RhdGU7Ci0JCXRoaXMucmVzdGFydFN0YXRlID0gcmVzdGFydFN0YXRlOwotCQkKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2VydmVyIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBudWxsIik7Ci0JCWlmICgoa2luZCAmIE1PRFVMRV9DSEFOR0UpICE9IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJLaW5kIHBhcmFtZXRlciBpbnZhbGlkIik7Ci0JCQotCQljaGVja0tpbmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgU2VydmVyRXZlbnQgZm9yIG1vZHVsZSBjaGFuZ2UgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIHRoZSBjaGFuZ2UuICg8Y29kZT5YWFhfQ0hBTkdFPC9jb2RlPikuIElmIHRoZSBraW5kIGRvZXMgbm90IAotCSAqICAgIGluY2x1ZGUgdGhlIDxjb2RlPk1PRFVMRV9DSEFOR0U8L2NvZGU+IGtpbmQsIHRoZSBNT0RVTEVfQ0hBTkdFIHdpbGwgYmUgYWRkZWQgYXV0b21hdGljYWxseS4gIAotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgU2VydmVyRXZlbnR9Ci0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRoYXQgdGhlIG1vZHVsZSBldmVudCB0YWtlcyBwbGFjZQotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0aGF0IGhhcyBjaGFuZ2VkCi0JICogQHBhcmFtIHN0YXRlIHRoZSBtb2R1bGUgc3RhdGUgYWZ0ZXIgdGhlIGNoYW5nZSAoPGNvZGU+U1RBVEVfWFhYPC9jb2RlPikKLQkgKiAgICBjb25zdGFudHMgZGVjbGFyZWQgb24ge0BsaW5rIElTZXJ2ZXJ9Ci0JICogQHBhcmFtIHB1Ymxpc2hpbmdTdGF0ZSB0aGUgbW9kdWxlIHB1Ymxpc2hpbmcgc3RhdGUgYWZ0ZXIgdGhlIAotCSAqICAgIGNoYW5nZSAoPGNvZGU+UFVCTElTSF9TVEFURV9YWFg8L2NvZGU+KQotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgSVNlcnZlcn0KLQkgKiBAcGFyYW0gcmVzdGFydFN0YXRlIGdldCB0aGUgbW9kdWxlIHJlc3RhcnQgc3RhdGUgYWZ0ZXIgdGhlIG1vZHVsZSBpcyByZXN0YXJ0IAotCSAqICAgIG5lZWRlZCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIFNlcnZlckV2ZW50KGludCBraW5kLCBJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSwgaW50IHN0YXRlLCBpbnQgcHVibGlzaGluZ1N0YXRlLCBib29sZWFuIHJlc3RhcnRTdGF0ZSkgewotCQl0aGlzLmtpbmQgPSBraW5kIHw9IE1PRFVMRV9DSEFOR0U7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLm1vZHVsZVRyZWUgPSBtb2R1bGU7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJdGhpcy5wdWJsaXNoU3RhdGUgPSBwdWJsaXNoaW5nU3RhdGU7Ci0JCXRoaXMucmVzdGFydFN0YXRlID0gcmVzdGFydFN0YXRlOwotCQkKLQkJaWYgKG1vZHVsZVRyZWUgPT0gbnVsbCB8fCBtb2R1bGVUcmVlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIHBhcmFtZXRlciBpbnZhbGlkIik7Ci0JCWlmICgoa2luZCAmIFNFUlZFUl9DSEFOR0UpICE9IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJLaW5kIHBhcmFtZXRlciBpbnZhbGlkIik7Ci0JCQotCQljaGVja0tpbmQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tLaW5kKCkgewotCQlpbnQgaSA9IDA7Ci0JCWlmICgoa2luZCAmIFNUQVRFX0NIQU5HRSkgIT0gMCkKLQkJCWkrKzsKLQkJaWYgKChraW5kICYgUkVTVEFSVF9TVEFURV9DSEFOR0UpICE9IDApCi0JCQlpKys7Ci0JCWlmICgoa2luZCAmIFBVQkxJU0hfU1RBVEVfQ0hBTkdFKSAhPSAwKQotCQkJaSsrOwotCQkKLQkJaWYgKGkgIT0gMCAmJiBpICE9IDEpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJLaW5kIHBhcmFtZXRlciBpbnZhbGlkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUga2luZCBvZiB0aGUgc2VydmVyIGV2ZW50LgotCSAqIDxwPgotCSAqIFRoaXMga2luZCBjYW4gYmUgdXNlZCB0byB0ZXN0IHdoZXRoZXIgdGhpcyBldmVudCBpcyBhIHNlcnZlciBldmVudCBvciBtb2R1bGUgZXZlbnQgYnkgdXNpbmcKLQkgKiB0aGUgZm9sbG93aW5nIGNvZGUgKHRoZSBleGFtcGxlIGlzIGNoZWNraW5nIGZvciB0aGUgc2VydmVyIGV2ZW50KToKLQkgKiAgICAoKGdldEtpbmQoKSB8IFNFUlZFUl9DSEFOR0UpICE9IDApIAotCSAqIHRoZSBmb2xsb3dpbmcgY29kZSAodGhlIGV4YW1wbGUgaXMgY2hlY2tpbmcgZm9yIHRoZSBtb2R1bGUgZXZlbnQpOgotCSAqICAgICgoZ2V0S2luZCgpIHwgTU9EVUxFX0NIQU5HRSkgIT0gMCkgCi0JICogCi0JICogQHJldHVybiB0aGUga2luZCBvZiB0aGUgY2hhbmdlICg8Y29kZT5YWFhfQ0hBTkdFPC9jb2RlPgotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgU2VydmVyRXZlbnR9Ci0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHRyZWUgb2YgdGhlIG1vZHVsZSBpbnZvbHZlZCBpbiB0aGUgbW9kdWxlIGNoYW5nZSBldmVudCwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZXZlbnQgaXMgbm90IGEgbW9kdWxlIGV2ZW50LCBpLmUuIGlzTW9kdWxlRXZlbnQoKSBpcyBmYWxzZS4KLQkgKiAgCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHRyZWUgb2YgdGhlIG1vZHVsZSBpbnZvbHZlZCBpbiB0aGUgbW9kdWxlIGNoYW5nZSBldmVudCwKLQkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZXZlbnQgaXMgbm90IGEgbW9kdWxlIGV2ZW50LCBpLmUuCi0JICogICAgaXNNb2R1bGVFdmVudCgpIGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlVHJlZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBwdWJsaXNoIHN0YXRlIGFmdGVyIHRoZSBjaGFuZ2UgdGhhdCB0cmlnZ2VycyB0aGlzIHNlcnZlciBldmVudC4gSWYgdGhpcyBldmVudCAKLQkgKiBpcyBvZiB0aGUgU0VSVkVSX0NIQU5HRSBraW5kLCB0aGVuIHRoZSBwdWJsaXNoaW5nIHN0YXRlIGlzIHRoZSBzZXJ2ZXIgcHVibGlzaGluZyBzdGF0ZS4KLQkgKiBJZiB0aGlzIGV2ZW50IGlzIG9mIHRoZSBNT0RVTEVfQ0hBTkdFIGtpbmQsIHRoZW4gdGhlIHB1Ymxpc2hpbmcgc3RhdGUgaXMgdGhlIG1vZHVsZQotCSAqIHB1Ymxpc2hpbmcgc3RhdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHVibGlzaGluZyBzdGF0ZSBhZnRlciB0aGUgY2hhbmdlICg8Y29kZT5QVUJMSVNIX1NUQVRFX1hYWDwvY29kZT4pCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBJU2VydmVyfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHVibGlzaFN0YXRlKCkgewotCQlyZXR1cm4gcHVibGlzaFN0YXRlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHJlc3RhcnQgc3RhdGUgYWZ0ZXIgaXNSZXN0YXJ0TmVlZGVkKCkgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqIElmIHRoaXMgZXZlbnQgaXMgb2YgdGhlIFNFUlZFUl9DSEFOR0Uga2luZCwgdGhlbiB0aGUgcmVzdGFydCBzdGF0ZSBpcyB0aGUgc2VydmVyIAotCSAqIHJlc3RhcnQgc3RhdGUuIElmIHRoaXMgZXZlbnQgaXMgb2YgdGhlIE1PRFVMRV9DSEFOR0Uga2luZCwgdGhlbiB0aGUgcmVzdGFydCBzdGF0ZSAKLQkgKiBpcyB0aGUgbW9kdWxlIHJlc3RhcnQgc3RhdGUuIAotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVzdGFydCBpcyBuZWVkZWQsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRSZXN0YXJ0U3RhdGUoKSB7Ci0JCXJldHVybiByZXN0YXJ0U3RhdGU7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgc3RhdGUgYWZ0ZXIgdGhlIGNoYW5nZSB0aGF0IHRyaWdnZXJzIHRoaXMgc2VydmVyIGV2ZW50LiBJZiB0aGlzIGV2ZW50IAotCSAqIGlzIG9mIHRoZSBTRVJWRVJfQ0hBTkdFIGtpbmQsIHRoZW4gdGhlIHN0YXRlIGlzIHRoZSBzZXJ2ZXIgc3RhdGUuCi0JICogSWYgdGhpcyBldmVudCBpcyBvZiB0aGUgTU9EVUxFX0NIQU5HRSBraW5kLCB0aGVuIHRoZSBzdGF0ZSBpcyB0aGUgbW9kdWxlCi0JICogc3RhdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIHN0YXRlIGFmdGVyIHRoZSBjaGFuZ2UgKDxjb2RlPlNUQVRFX1hYWDwvY29kZT4pCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBJU2VydmVyfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIGludm9sdmVkIGluIHRoZSBjaGFuZ2UgZXZlbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIGludm9sdmVkIGluIHRoZSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJQb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJQb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTRiZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyUG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwb3J0IG9uIGEgc2VydmVyLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQb3J0IHsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgaW50IHBvcnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvdG9jb2w7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBjb250ZW50VHlwZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGFkdmFuY2VkOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgcG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBzZXJ2ZXItc3BlY2lmaWMgcG9ydCBpZAotCSAqIEBwYXJhbSBuYW1lIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIHBvcnQKLQkgKiBAcGFyYW0gcG9ydCB0aGUgbnVtYmVyIG51bWJlcgotCSAqIEBwYXJhbSBwcm90b2NvbCB0aGUgcG9ydCdzIHByb3RvY29sCi0JICovCi0JcHVibGljIFNlcnZlclBvcnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgaW50IHBvcnQsIFN0cmluZyBwcm90b2NvbCkgewotCQl0aGlzKGlkLCBuYW1lLCBwb3J0LCBwcm90b2NvbCwgbnVsbCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHNlcnZlciBwb3J0LgotCSAqIAotCSAqIEBwYXJhbSBpZCBhIHNlcnZlci1zcGVjaWZpYyBwb3J0IGlkCi0JICogQHBhcmFtIG5hbWUgYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgcG9ydAotCSAqIEBwYXJhbSBwb3J0IHRoZSBudW1iZXIgbnVtYmVyCi0JICogQHBhcmFtIHByb3RvY29sIHRoZSBwb3J0J3MgcHJvdG9jb2wKLQkgKiBAcGFyYW0gY29udGVudFR5cGVzIHRoZSBjb250ZW50IHR5cGVzIHRoYXQgdGhlIHBvcnQgc3VwcG9ydHMKLQkgKiBAcGFyYW0gYWR2YW5jZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBvcnQgaXMgImFkdmFuY2VkIiBhbmQgc2hvdWxkIG9ubHkKLQkgKiAgICBiZSBzaG93biB0byBhZHZhbmNlZCB1c2VycywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQb3J0KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIGludCBwb3J0LCBTdHJpbmcgcHJvdG9jb2wsIFN0cmluZ1tdIGNvbnRlbnRUeXBlcywgYm9vbGVhbiBhZHZhbmNlZCkgewotCQlzdXBlcigpOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucG9ydCA9IHBvcnQ7Ci0JCXRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKLQkJdGhpcy5jb250ZW50VHlwZXMgPSBjb250ZW50VHlwZXM7Ci0JCXRoaXMuYWR2YW5jZWQgPSBhZHZhbmNlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gb3B0aW9uYWwgaW50ZXJuYWwgaWQgdXNlZCB0byBpZGVudGlmeSB0aGlzIHBvcnQuCi0JICogCi0JICogQHJldHVybiBhbiBpbnRlcm5hbCBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBvcnQuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcG9ydAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY3R1YWwgcG9ydCBudW1iZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0JCXJldHVybiBwb3J0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3RvY29sLCBlLmcuIEhUVFAgb2YgdGhpcyBwb3J0LiBSZXR1cm5zIG51bGwKLQkgKiBpZiB0aGUgcHJvdG9jb2wgaXMgdW5rbm93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9jb3RvbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7Ci0JCXJldHVybiBwcm90b2NvbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGVzIHRoYXQgdGhpcyBwb3J0IHdvdWxkIG5vcm1hbGx5IHNlcnZlLCBvciBudWxsCi0JICogaWYgdGhlIGNvbnRlbnQgaXMgdW5rbm93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgY29udGVudCB0eXBlcwotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBjb250ZW50VHlwZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcG9ydCBpcyBhbiAiYWR2YW5jZWQiIHBvcnQgYW5kIHNob3VsZCBub3QgYmUgc2hvd24KLQkgKiB0byBub3ZpY2UgdXNlcnMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcG9ydCBpcyBhZHZhbmNlZCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZHZhbmNlZCgpIHsKLQkJcmV0dXJuIGFkdmFuY2VkOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIFNlcnZlclBvcnQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTZXJ2ZXJQb3J0IHNwID0gKFNlcnZlclBvcnQpIG9iajsKLQkJcmV0dXJuIChzcC5wb3J0ID09IHBvcnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2ZXJQb3J0IFsiICsgZ2V0TmFtZSgpICsgIiwgIiArIGdldElkKCkgKyAiLCAiICsgZ2V0UG9ydCgpICsgIiwgIiArIGdldFByb3RvY29sKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmODM2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC4qOwotLyoqCi0gKiBTZXJ2ZXIgdXRpbGl0eSBtZXRob2RzLiBUaGVzZSBzdGF0aWMgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBwZXJmb3JtCi0gKiBjb21tb24gb3BlcmF0aW9ucyBvbiBzZXJ2ZXIgYXJ0aWZhY3RzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLgotICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1Yi1jbGFzc2VkIG9yIGluc3RhbnRpYXRlZC4KLSAqIDwvcD4KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclV0aWwgewotCS8qKgotCSAqIENvbnN0YW50IGlkZW50aWZ5aW5nIHRoZSBqb2IgZmFtaWx5IGlkZW50aWZpZXIgZm9yIHNlcnZlciBvcGVyYXRpb25zLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYk1hbmFnZXIjam9pbihPYmplY3QsIElQcm9ncmVzc01vbml0b3IpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNFUlZFUl9KT0JfRkFNSUxZID0gU2VydmVyUGx1Z2luLlBMVUdJTl9JRDsKLQotCS8qKgotCSAqIFN0YXRpYyB1dGlsaXR5IGNsYXNzIC0gY2Fubm90IGNyZWF0ZSBhbiBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFNlcnZlclV0aWwoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSBjb250YWluZWQgd2l0aGluIHRoZSBnaXZlbiBwcm9qZWN0LiBJZiBtb3JlIHRoYW4gb25lIG1vZHVsZQotCSAqIGlzIGNvbnRhaW5lZCB3aXRoIHRoZSBwcm9qZWN0LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbiBhcmJpdHJhcnkgbW9kdWxlCi0JICogdW5sZXNzIHRoZSBtb2R1bGUgZmFjdG9yeSBkZWZpbmVzIGFuIG9yZGVyaW5nLiBJZiB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZQotCSAqIG1vZHVsZXMgaW4gYSBwcm9qZWN0LCB1c2VycyBzaG91bGQgdHlwaWNhbGx5IHVzZSBnZXRNb2R1bGVzKElQcm9qZWN0KSBpbnN0ZWFkLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG1heSB0cmlnZ2VyIGJ1bmRsZSBsb2FkaW5nIGFuZCBpcyBub3Qgc3VpdGFibGUgZm9yCi0JICogc2hvcnQvVUkgb3BlcmF0aW9ucy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0Ci0JICogQHJldHVybiBhIG1vZHVsZSB0aGF0IGlzIGNvbnRhaW5lZCB3aXRoIHRoZSBwcm9qZWN0LCBvciBudWxsIGlmIG5vCi0JICogICAgbW9kdWxlcyBhcmUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBwcm9qZWN0Ci0JICogQHNlZSAjZ2V0TW9kdWxlcyhJUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCUlNb2R1bGVbXSBtb2R1bGVzID0gZ2V0TW9kdWxlcyhwcm9qZWN0KTsKLQkJaWYgKG1vZHVsZXMgIT0gbnVsbCAmJiBtb2R1bGVzLmxlbmd0aCA+IDApCi0JCQlyZXR1cm4gbW9kdWxlc1swXTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBtYXkgdHJpZ2dlciBidW5kbGUgbG9hZGluZyBhbmQgaXMgbm90IHN1aXRhYmxlIGZvcgotCSAqIHNob3J0L1VJIG9wZXJhdGlvbnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBtb2R1bGVzCi0JICogQHNlZSAjZ2V0TW9kdWxlKElQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJLy8gdXNlIGEgc2V0IGZvciBiZXR0ZXIgY29udGFpbnMoKSBwZXJmb3JtYW5jZQotCQlTZXQ8SU1vZHVsZT4gc2V0ID0gbmV3IEhhc2hTZXQ8SU1vZHVsZT4oKTsKLQkJCi0JCU1vZHVsZUZhY3RvcnlbXSBmYWN0b3JpZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlRmFjdG9yaWVzKCk7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJZm9yIChNb2R1bGVGYWN0b3J5IGZhY3RvcnkgOiBmYWN0b3JpZXMpIHsKLQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IGZhY3RvcnkuZ2V0TW9kdWxlcyhwcm9qZWN0LCBudWxsKTsKLQkJCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBtb2R1bGVzKSB7Ci0JCQkJCQlpZiAoIXNldC5jb250YWlucyhtb2R1bGUpKQotCQkJCQkJCXNldC5hZGQobW9kdWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlJTW9kdWxlW10gbW9kdWxlcyA9IG5ldyBJTW9kdWxlW3NldC5zaXplKCldOwotCQlzZXQudG9BcnJheShtb2R1bGVzKTsKLQkJcmV0dXJuIG1vZHVsZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHdpdGggdGhlIGdpdmVuIG1vZHVsZUlkLCBpZiBvbmUgZXhpc3RzLiBUaGUgbW9kdWxlSWQKLQkgKiBtdXN0IG5vdCBiZSBudWxsLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG1heSB0cmlnZ2VyIGJ1bmRsZSBsb2FkaW5nIGFuZCBpcyBub3Qgc3VpdGFibGUgZm9yCi0JICogc2hvcnQvVUkgb3BlcmF0aW9ucy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZHVsZUlkIGEgbW9kdWxlIGlkCi0JICogQHJldHVybiB0aGUgbW9kdWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbW9kdWxlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoU3RyaW5nIG1vZHVsZUlkKSB7Ci0JCWlmIChtb2R1bGVJZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJaW50IGluZGV4ID0gbW9kdWxlSWQuaW5kZXhPZigiOiIpOwotCQlpZiAoaW5kZXggPD0gMCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJU3RyaW5nIGZhY3RvcnlJZCA9IG1vZHVsZUlkLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCU1vZHVsZUZhY3RvcnkgbW9kdWxlRmFjdG9yeSA9IFNlcnZlclBsdWdpbi5maW5kTW9kdWxlRmFjdG9yeShmYWN0b3J5SWQpOwotCQlpZiAobW9kdWxlRmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmcgbW9kdWxlU3ViSWQgPSBtb2R1bGVJZC5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0JCXJldHVybiBtb2R1bGVGYWN0b3J5LmZpbmRNb2R1bGUobW9kdWxlU3ViSWQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGF2YWlsYWJsZSBtb2R1bGVzIGZyb20gYWxsIGZhY3RvcmllcyB3aG9zZQotCSAqIHR5cGUgbWF0Y2hlcyB0aGUgZ2l2ZW4gbW9kdWxlIHR5cGVzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG1heSB0cmlnZ2VyIGJ1bmRsZSBsb2FkaW5nIGFuZCBpcyBub3Qgc3VpdGFibGUgZm9yCi0JICogc2hvcnQvVUkgb3BlcmF0aW9ucy4gSXQgYWxzbyBwZXJmb3JtcyBhIHNlYXJjaCBvZiBhbGwgYXZhaWxhYmxlCi0JICogbW9kdWxlcyBvZiB0aGUgZ2l2ZW4gdHlwZXMsIGFuZCBkdWUgdG8gcGVyZm9ybWFuY2UgcmVhc29ucyBzaG91bGQKLQkgKiBub3QgYmUgdXNlZCB1bmxlc3MgYWJzb2x1dGVseSByZXF1aXJlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZHVsZVR5cGVzIGFuIGFycmF5IG9mIG1vZHVsZSB0eXBlcwotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcyhJTW9kdWxlVHlwZVtdIG1vZHVsZVR5cGVzKSB7Ci0JCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQkJCi0JCU1vZHVsZUZhY3RvcnlbXSBmYWN0b3JpZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlRmFjdG9yaWVzKCk7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJZm9yIChNb2R1bGVGYWN0b3J5IGZhY3RvcnkgOiBmYWN0b3JpZXMpIHsKLQkJCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUoZmFjdG9yeS5nZXRNb2R1bGVUeXBlcygpLCBtb2R1bGVUeXBlcykpIHsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBmYWN0b3J5LmdldE1vZHVsZXMobnVsbCk7Ci0JCQkJCWlmIChtb2R1bGVzICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBtb2R1bGVzKQotCQkJCQkJCWxpc3QuYWRkKG1vZHVsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBuZXcgSU1vZHVsZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShtb2R1bGVzKTsKLQkJcmV0dXJuIG1vZHVsZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgYXZhaWxhYmxlIG1vZHVsZXMgZnJvbSBhbGwgZmFjdG9yaWVzIHdob3NlCi0JICogdHlwZSBtYXRjaGVzIHRoZSBnaXZlbiBtb2R1bGUgdHlwZSBpZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBtYXkgdHJpZ2dlciBidW5kbGUgbG9hZGluZyBhbmQgaXMgbm90IHN1aXRhYmxlIGZvcgotCSAqIHNob3J0L1VJIG9wZXJhdGlvbnMuIEl0IGFsc28gcGVyZm9ybXMgYSBzZWFyY2ggb2YgYWxsIGF2YWlsYWJsZQotCSAqIG1vZHVsZXMgb2YgdGhpcyB0eXBlLCBhbmQgZHVlIHRvIHBlcmZvcm1hbmNlIHJlYXNvbnMgc2hvdWxkIG5vdAotCSAqIGJlIHVzZWQgdW5sZXNzIGFic29sdXRlbHkgcmVxdWlyZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIGEgbW9kdWxlIHR5cGUKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgbW9kdWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoU3RyaW5nIHR5cGUpIHsKLQkJTGlzdDxJTW9kdWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQkKLQkJTW9kdWxlRmFjdG9yeVtdIGZhY3RvcmllcyA9IFNlcnZlclBsdWdpbi5nZXRNb2R1bGVGYWN0b3JpZXMoKTsKLQkJaWYgKGZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKE1vZHVsZUZhY3RvcnkgZmFjdG9yeSA6IGZhY3RvcmllcykgewotCQkJCWlmIChpc1N1cHBvcnRlZE1vZHVsZShmYWN0b3J5LmdldE1vZHVsZVR5cGVzKCksIHR5cGUsIG51bGwpKSB7Ci0JCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gZmFjdG9yeS5nZXRNb2R1bGVzKG51bGwpOwotCQkJCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKElNb2R1bGUgbW9kdWxlIDogbW9kdWxlcykKLQkJCQkJCQlpZiAodHlwZS5lcXVhbHMobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKSkKLQkJCQkJCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlJTW9kdWxlW10gbW9kdWxlcyA9IG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KG1vZHVsZXMpOwotCQlyZXR1cm4gbW9kdWxlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSBvZiB0aGUgZ2l2ZW4gbW9kdWxlVHlwZXMgaGF2ZSB0aGUgZ2l2ZW4KLQkgKiBtb2R1bGUgdHlwZSBpZCBhbmQgdmVyc2lvbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlVHlwZXMgYW4gYXJyYXkgb2YgbW9kdWxlIHR5cGVzLCBtYXkgbm90IGJlIG51bGwKLQkgKiBAcGFyYW0gdHlwZUlkIGEgbW9kdWxlIHR5cGUgaWQsIG9yIG51bGwgZm9yIGFueSBtb2R1bGUgdHlwZQotCSAqIEBwYXJhbSB2ZXJzaW9uSWQgYSBtb2R1bGUgdmVyc2lvbiwgb3IgbnVsbCBmb3IgYW55IHZlcnNpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2R1bGUgdHlwZSBpcyBzdXBwb3J0ZWQsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRNb2R1bGUoSU1vZHVsZVR5cGVbXSBtb2R1bGVUeXBlcywgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHZlcnNpb25JZCkgewotCQlpZiAobW9kdWxlVHlwZXMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCWlmICgiIi5lcXVhbHModHlwZUlkKSkKLQkJCXR5cGVJZCA9IG51bGw7Ci0JCWlmICgiIi5lcXVhbHModmVyc2lvbklkKSkKLQkJCXZlcnNpb25JZCA9IG51bGw7Ci0JCQotCQlpZiAodHlwZUlkID09IG51bGwgJiYgdmVyc2lvbklkID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWZvciAoSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSA6IG1vZHVsZVR5cGVzKSB7Ci0JCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUobW9kdWxlVHlwZSwgdHlwZUlkLCB2ZXJzaW9uSWQpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N1cHBvcnRlZE1vZHVsZShJTW9kdWxlVHlwZVtdIG1vZHVsZVR5cGVzLCBJTW9kdWxlVHlwZVtdIG10KSB7Ci0JCWlmIChtdCAhPSBudWxsKSB7Ci0JCQlmb3IgKElNb2R1bGVUeXBlIG1vZHVsZVR5cGUgOiBtdCkgewotCQkJCWlmIChpc1N1cHBvcnRlZE1vZHVsZShtb2R1bGVUeXBlcywgbW9kdWxlVHlwZSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSBvZiB0aGUgZ2l2ZW4gbW9kdWxlVHlwZXMgbWF0Y2ggdGhlIGdpdmVuCi0JICogbW9kdWxlIHR5cGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZVR5cGVzIGFuIGFycmF5IG9mIG1vZHVsZXMgdHlwZXMsIG1heSBub3QgYmUgbnVsbAotCSAqIEBwYXJhbSBtdCBhIG1vZHVsZSB0eXBlLCBtYXkgbm90IGJlIG51bGwKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2R1bGUgdHlwZSBpcyBzdXBwb3J0ZWQsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRNb2R1bGUoSU1vZHVsZVR5cGVbXSBtb2R1bGVUeXBlcywgSU1vZHVsZVR5cGUgbXQpIHsKLQkJaWYgKG1vZHVsZVR5cGVzID09IG51bGwgfHwgbXQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCWZvciAoSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSA6IG1vZHVsZVR5cGVzKSB7Ci0JCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUobW9kdWxlVHlwZSwgbXQpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3VwcG9ydGVkTW9kdWxlKElNb2R1bGVUeXBlIG1vZHVsZVR5cGUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbikgewotCQlTdHJpbmcgdHlwZTIgPSBtb2R1bGVUeXBlLmdldElkKCk7Ci0JCWlmIChTZXJ2ZXJQbHVnaW4ubWF0Y2hlcyh0eXBlLCB0eXBlMikpIHsKLQkJCVN0cmluZyB2ZXJzaW9uMiA9IG1vZHVsZVR5cGUuZ2V0VmVyc2lvbigpOwotCQkJaWYgKFNlcnZlclBsdWdpbi5tYXRjaGVzKHZlcnNpb24sIHZlcnNpb24yKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gZ2l2ZW4gbW9kdWxlIHR5cGVzIGFyZSBjb21wYXRpYmxlLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGVUeXBlIGEgbW9kdWxlIHR5cGUsIG1heSBub3QgYmUgbnVsbAotCSAqIEBwYXJhbSBtdCBhIG1vZHVsZSB0eXBlLCBtYXkgbm90IGJlIG51bGwKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2R1bGUgdHlwZSBpcyBzdXBwb3J0ZWQsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRNb2R1bGUoSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgSU1vZHVsZVR5cGUgbXQpIHsKLQkJaWYgKG1vZHVsZVR5cGUgPT0gbnVsbCB8fCBtdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJaWYgKFNlcnZlclBsdWdpbi5tYXRjaGVzKG10LmdldElkKCksIG1vZHVsZVR5cGUuZ2V0SWQoKSkgJiYKLQkJCQlTZXJ2ZXJQbHVnaW4ubWF0Y2hlcyhtdC5nZXRWZXJzaW9uKCksIG1vZHVsZVR5cGUuZ2V0VmVyc2lvbigpKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgb3IgcmVtb3ZlcyBtb2R1bGVzIGZyb20gYSBzZXJ2ZXIuIFdpbGwgc2VhcmNoIGZvciB0aGUgZmlyc3QgcGFyZW50IG1vZHVsZQotCSAqIG9mIGVhY2ggbW9kdWxlIGFuZCBhZGQgaXQgdG8gdGhlIHNlcnZlciBpbnN0ZWFkLiBUaGlzIG1ldGhvZCB3aWxsIGhhbmRsZSBtdWx0aXBsZQotCSAqIG1vZHVsZXMgaGF2aW5nIHRoZSBzYW1lIHBhcmVudCAodGhlIHBhcmVudCB3aWxsIG9ubHkgYmUgYWRkZWQgb25jZSksIGJ1dCBtYXkgbm90Ci0JICogaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBzYW1lIG1vZHVsZSBvciBwYXJlbnQgaXMgYmVpbmcgYm90aCBhZGRlZCBhbmQgcmVtb3ZlZC4KLQkgKiBFbnRyaWVzIGluIHRoZSBhZGQgb3IgcmVtb3ZlIGFycmF5cyBtYXkgbm90IGJlIG51bGwuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBhZGQgYW4gYXJyYXkgb2YgbW9kdWxlcyB0byBhZGQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIG5vdCBhZGQgYW55Ci0JICogQHBhcmFtIHJlbW92ZSBhbiBhcnJheSBvZiBtb2R1bGVzIHRvIHJlbW92ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gbm90IHJlbW92ZSBhbnkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbW9kaWZ5TW9kdWxlcyhJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBJTW9kdWxlW10gYWRkLCBJTW9kdWxlW10gcmVtb3ZlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2VydmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCQotCQlpZiAoYWRkID09IG51bGwpCi0JCQlhZGQgPSBuZXcgSU1vZHVsZVswXTsKLQkJaWYgKHJlbW92ZSA9PSBudWxsKQotCQkJcmVtb3ZlID0gbmV3IElNb2R1bGVbMF07Ci0JCQotCQlmb3IgKElNb2R1bGUgbW9kdWxlIDogYWRkKSB7Ci0JCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGFkZCBudWxsIGVudHJpZXMiKTsKLQkJfQotCQkKLQkJTGlzdDxJTW9kdWxlPiBhZGRQYXJlbnRNb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlmb3IgKElNb2R1bGUgbW9kdWxlIDogYWRkKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbW9uaXRvcik7Ci0JCQkJaWYgKHBhcmVudHMgIT0gbnVsbCAmJiBwYXJlbnRzLmxlbmd0aCA+IDApIHsJCQkJCi0JCQkJCUlNb2R1bGUgcGFyZW50ID0gcGFyZW50c1swXTsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlpZiAoIWFkZFBhcmVudE1vZHVsZXMuY29udGFpbnMocGFyZW50KSkKLQkJCQkJCWFkZFBhcmVudE1vZHVsZXMuYWRkKHBhcmVudCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgcGFyZW50IG1vZHVsZSIsIGUpOwotCQkJfQotCQkJCi0JCQlpZiAoIWZvdW5kKQotCQkJCWFkZFBhcmVudE1vZHVsZXMuYWRkKG1vZHVsZSk7Ci0JCX0KLQkJCi0JCWZvciAoSU1vZHVsZSBtb2R1bGUgOiByZW1vdmUpIHsKLQkJCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgcmVtb3ZlIG51bGwgZW50cmllcyIpOwotCQl9Ci0JCQotCQlMaXN0PElNb2R1bGU+IHJlbW92ZVBhcmVudE1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCWZvciAoSU1vZHVsZSBtb2R1bGUgOiByZW1vdmUpIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJSU1vZHVsZVtdIHBhcmVudHMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMobW9kdWxlLCBtb25pdG9yKTsKLQkJCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkgewkJCQkKLQkJCQkJSU1vZHVsZSBwYXJlbnQgPSBwYXJlbnRzWzBdOwotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWlmICghcmVtb3ZlUGFyZW50TW9kdWxlcy5jb250YWlucyhwYXJlbnQpKQotCQkJCQkJcmVtb3ZlUGFyZW50TW9kdWxlcy5hZGQocGFyZW50KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZmluZCBwYXJlbnQgbW9kdWxlIDIiLCBlKTsKLQkJCX0KLQkJCQotCQkJaWYgKCFmb3VuZCkKLQkJCQlyZW1vdmVQYXJlbnRNb2R1bGVzLmFkZChtb2R1bGUpOwotCQl9Ci0JCQotCQlJTW9kdWxlW10gYWRkMiA9IG5ldyBJTW9kdWxlW2FkZFBhcmVudE1vZHVsZXMuc2l6ZSgpXTsKLQkJYWRkUGFyZW50TW9kdWxlcy50b0FycmF5KGFkZDIpOwotCQlJTW9kdWxlW10gcmVtb3ZlMiA9IG5ldyBJTW9kdWxlW3JlbW92ZVBhcmVudE1vZHVsZXMuc2l6ZSgpXTsKLQkJcmVtb3ZlUGFyZW50TW9kdWxlcy50b0FycmF5KHJlbW92ZTIpOwotCQkKLQkJc2VydmVyLm1vZGlmeU1vZHVsZXMoYWRkMiwgcmVtb3ZlMiwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhIGRlZmF1bHQgbmFtZSBvbiB0aGUgZ2l2ZW4gcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UnVudGltZURlZmF1bHROYW1lKElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpOwotCQkKLQkJU3RyaW5nIG5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5kZWZhdWx0UnVudGltZU5hbWUsIHR5cGVOYW1lKTsKLQkJaW50IGkgPSAyOwotCQl3aGlsZSAoU2VydmVyUGx1Z2luLmlzTmFtZUluVXNlKHJ1bnRpbWUuZ2V0T3JpZ2luYWwoKSwgbmFtZSkpIHsKLQkJCW5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5kZWZhdWx0UnVudGltZU5hbWUyLCBuZXcgU3RyaW5nW10ge3R5cGVOYW1lLCBpICsgIiJ9KTsKLQkJCWkrKzsKLQkJfQotCQlydW50aW1lLnNldE5hbWUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhIGRlZmF1bHQgbmFtZSBvbiB0aGUgZ2l2ZW4gc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VydmVyRGVmYXVsdE5hbWUoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcikgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlTdHJpbmcgdHlwZU5hbWUgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGhvc3QgPSBzZXJ2ZXIuZ2V0SG9zdCgpOwotCQkKLQkJLy8gYmFzZSB0aGUgbmFtZSBvbiB0aGUgcnVudGltZSBpZiBpdCBleGlzdHMgYW5kIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSB0aGUgZGVmYXVsdAotCQlJUnVudGltZSBydW50aW1lID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IHJ1bnRpbWUuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCXNldFJ1bnRpbWVEZWZhdWx0TmFtZSh3Yyk7Ci0JCQlpZiAoIXdjLmdldE5hbWUoKS5lcXVhbHMocnVudGltZS5nZXROYW1lKCkpKQotCQkJCXR5cGVOYW1lID0gcnVudGltZS5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBuYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFNlcnZlck5hbWUsIG5ldyBTdHJpbmdbXSB7dHlwZU5hbWUsIGhvc3R9KTsKLQkJaW50IGkgPSAyOwotCQl3aGlsZSAoU2VydmVyUGx1Z2luLmlzTmFtZUluVXNlKHNlcnZlci5nZXRPcmlnaW5hbCgpLCBuYW1lKSkgewotCQkJbmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlZmF1bHRTZXJ2ZXJOYW1lMiwgbmV3IFN0cmluZ1tdIHt0eXBlTmFtZSwgaG9zdCwgaSArICIifSk7Ci0JCQlpKys7Ci0JCX0KLQkJc2VydmVyLnNldE5hbWUobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRmlsZW5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVOYW1lKG5hbWUsIElSZXNvdXJjZS5GSUxFKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJc3RhdHVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlTmFtZShuYW1lLCBJUmVzb3VyY2UuRk9MREVSKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFZhbGlkRmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGlzVmFsaWRGaWxlbmFtZShuYW1lKSkKLQkJCXJldHVybiBuYW1lOwotCQotCQkvLyByZW1vdmUgaW52YWxpZCBjaGFyYWN0ZXJzCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW10geyIuIiwgIlxcIiwgIi8iLCAiPyIsICI6IiwgIioiLCAiXCIiLCAifCIsICI8IiwgIj4ifTsKLQkJaW50IGluZCA9IDA7Ci0JCXdoaWxlIChpbmQgPCBzLmxlbmd0aCkgewotCQkJaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKHNbaW5kXSk7Ci0JCQl3aGlsZSAoaW5kZXggPj0gMCkgewotCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCkgKyBuYW1lLnN1YnN0cmluZyhpbmRleCsxKTsKLQkJCQlpbmRleCA9IG5hbWUuaW5kZXhPZihzW2luZF0pOwotCQkJfQotCQkJaW5kKys7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiB1bnVzZWQgZmlsZSBpbiB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiBhbiB1bnVzZWQgZmlsZSB3aXRoaW4gdGhlIGdpdmVuIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldFVudXNlZFNlcnZlckZpbGUoSVByb2plY3QgcHJvamVjdCwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCBzZXJ2ZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCVN0cmluZyB0eXBlTmFtZSA9IGdldFZhbGlkRmlsZU5hbWUoc2VydmVyLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBuYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFNlcnZlck5hbWUzLCB0eXBlTmFtZSkrICIuIiAgKyBTZXJ2ZXIuRklMRV9FWFRFTlNJT047Ci0JCWludCBpID0gMjsKLQkJd2hpbGUgKGlzRmlsZU5hbWVJblVzZShwcm9qZWN0LCBuYW1lKSkgewotCQkJbmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlZmF1bHRTZXJ2ZXJOYW1lNCwgbmV3IFN0cmluZ1tdIHt0eXBlTmFtZSwgaSArICIifSkgKyAiLiIgICsgU2VydmVyLkZJTEVfRVhURU5TSU9OOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0LmdldEZpbGUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGFuIGVsZW1lbnQgZXhpc3RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICoKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcGFyYW0gbmFtZSBhIGZpbGUgb3IgZm9sZGVyIG5hbWUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgb3IgZm9sZGVyIG5hbWUgaXMgYmVpbmcKLQkgKiAgICB1c2VkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGaWxlTmFtZUluVXNlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgcHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHByb2plY3QuZ2V0RmlsZShuYW1lKS5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAocHJvamVjdC5nZXRGb2xkZXIobmFtZSkuZXhpc3RzKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHJ1bnRpbWUgdGFyZ2V0cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiB0eXBlIGFuZCB2ZXJzaW9uLgotCSAqIElmIHR5cGUgb3IgdmVyc2lvbiBpcyBudWxsLCBpdCBtYXRjaGVzIGFsbCBvZiB0aGF0IHR5cGUgb3IgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBhIG1vZHVsZSB0eXBlCi0JICogQHBhcmFtIHZlcnNpb24gYSBtb2R1bGUgdmVyc2lvbgotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBydW50aW1lIGluc3RhbmNlcyB7QGxpbmsgSVJ1bnRpbWV9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZVtdIGdldFJ1bnRpbWVzKFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbikgewotCQlMaXN0PElSdW50aW1lPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUnVudGltZT4oKTsKLQkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKLQkJaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKLQkJCWZvciAoSVJ1bnRpbWUgcnVudGltZSA6IHJ1bnRpbWVzKSB7Ci0JCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJCWlmIChydW50aW1lVHlwZSAhPSBudWxsICYmIGlzU3VwcG9ydGVkTW9kdWxlKHJ1bnRpbWVUeXBlLmdldE1vZHVsZVR5cGVzKCksIHR5cGUsIHZlcnNpb24pKSB7Ci0JCQkJCWxpc3QuYWRkKHJ1bnRpbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJSVJ1bnRpbWVbXSBydW50aW1lczIgPSBuZXcgSVJ1bnRpbWVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocnVudGltZXMyKTsKLQkJcmV0dXJuIHJ1bnRpbWVzMjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBydW50aW1lIHR5cGVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHR5cGUgYW5kIHZlcnNpb24uCi0JICogSWYgdHlwZSBvciB2ZXJzaW9uIGlzIG51bGwsIGl0IG1hdGNoZXMgYWxsIG9mIHRoYXQgdHlwZSBvciB2ZXJzaW9uLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIGEgbW9kdWxlIHR5cGUKLQkgKiBAcGFyYW0gdmVyc2lvbiBhIG1vZHVsZSB2ZXJzaW9uCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJ1bnRpbWUgdHlwZSBpbnN0YW5jZXMge0BsaW5rIElSdW50aW1lVHlwZX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW50aW1lVHlwZVtdIGdldFJ1bnRpbWVUeXBlcyhTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJTGlzdDxJUnVudGltZVR5cGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lVHlwZT4oKTsKLQkJSVJ1bnRpbWVUeXBlW10gcnVudGltZVR5cGVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lVHlwZXMoKTsKLQkJaWYgKHJ1bnRpbWVUeXBlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSA6IHJ1bnRpbWVUeXBlcykgewotCQkJCWlmIChpc1N1cHBvcnRlZE1vZHVsZShydW50aW1lVHlwZS5nZXRNb2R1bGVUeXBlcygpLCB0eXBlLCB2ZXJzaW9uKSkgewotCQkJCQlsaXN0LmFkZChydW50aW1lVHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlJUnVudGltZVR5cGVbXSBydCA9IG5ldyBJUnVudGltZVR5cGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocnQpOwotCQlyZXR1cm4gcnQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHJ1bnRpbWUgdHlwZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gdHlwZSwgdmVyc2lvbiwKLQkgKiBhbmQgcGFydGlhbCBydW50aW1lIHR5cGUgaWQuIElmIHR5cGUsIHZlcnNpb24sIG9yIHJ1bnRpbWVUeXBlSWQgaXMgbnVsbCwKLQkgKiBpdCBtYXRjaGVzIGFsbCBvZiB0aGF0IHR5cGUgb3IgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBhIG1vZHVsZSB0eXBlCi0JICogQHBhcmFtIHZlcnNpb24gYSBtb2R1bGUgdmVyc2lvbgotCSAqIEBwYXJhbSBydW50aW1lVHlwZUlkIHRoZSBpZCBvZiBhIHJ1bnRpbWUgdHlwZQotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBydW50aW1lIHR5cGUgaW5zdGFuY2VzIHtAbGluayBJUnVudGltZVR5cGV9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZVR5cGVbXSBnZXRSdW50aW1lVHlwZXMoU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgcnVudGltZVR5cGVJZCkgewotCQlMaXN0PElSdW50aW1lVHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVUeXBlPigpOwotCQlJUnVudGltZVR5cGVbXSBydW50aW1lVHlwZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVUeXBlcygpOwotCQlpZiAocnVudGltZVR5cGVzICE9IG51bGwpIHsKLQkJCWZvciAoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlIDogcnVudGltZVR5cGVzKSB7Ci0JCQkJaWYgKGlzU3VwcG9ydGVkTW9kdWxlKHJ1bnRpbWVUeXBlLmdldE1vZHVsZVR5cGVzKCksIHR5cGUsIHZlcnNpb24pKSB7Ci0JCQkJCWlmIChydW50aW1lVHlwZUlkID09IG51bGwgfHwgcnVudGltZVR5cGUuZ2V0SWQoKS5zdGFydHNXaXRoKHJ1bnRpbWVUeXBlSWQpKQotCQkJCQkJbGlzdC5hZGQocnVudGltZVR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJSVJ1bnRpbWVUeXBlW10gcnQgPSBuZXcgSVJ1bnRpbWVUeXBlW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJ0KTsKLQkJcmV0dXJuIHJ0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBzZXJ2ZXJzIHRoYXQgdGhpcyBtb2R1bGUgaXMgbm90IGN1cnJlbnRseQotCSAqIGNvbmZpZ3VyZWQgb24sIGJ1dCBjb3VsZCBiZSBhZGRlZCB0by4gSWYgaW5jbHVkZUVycm9ycyBpcyB0cnVlLCB0aGlzCi0JICogbWV0aG9kIHJldHVybiBzZXJ2ZXJzIHdoZXJlIHRoZSBwYXJlbnQgbW9kdWxlIG1heSB0aHJvdyBlcnJvcnMuIEZvcgotCSAqIGluc3RhbmNlLCB0aGlzIG1vZHVsZSBtYXkgYmUgdGhlIHdyb25nIHNwZWMgbGV2ZWwuCi0JICoKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHBhcmFtIGluY2x1ZGVFcnJvcnMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaW5jbHVkZSBzZXJ2ZXJzIHRoYXQgcmV0dXJuZWQKLQkgKiAgICBlcnJvcnMgd2hlbiB0cnlpbmcgdG8gYWRkIHRoZSBtb2R1bGUsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBzZXJ2ZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyW10gZ2V0QXZhaWxhYmxlU2VydmVyc0Zvck1vZHVsZShJTW9kdWxlIG1vZHVsZSwgYm9vbGVhbiBpbmNsdWRlRXJyb3JzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJU2VydmVyWzBdOwotCi0JCS8vIGRvIGl0IHRoZSBzbG93IHdheSAtIGdvIHRocm91Z2ggYWxsIHNlcnZlcnMgYW5kCi0JCS8vIHNlZSBpZiB0aGlzIGRlcGxveWFibGUgaXMgbm90IGNvbmZpZ3VyZWQgaW4gaXQKLQkJLy8gYnV0IGNvdWxkIGJlIGFkZGVkCi0JCUxpc3Q8SVNlcnZlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlcj4oKTsKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJZm9yIChJU2VydmVyIHNlcnZlciA6IHNlcnZlcnMpIHsgCi0JCQkJaWYgKCFjb250YWluc01vZHVsZShzZXJ2ZXIsIG1vZHVsZSwgbW9uaXRvcikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbW9uaXRvcik7Ci0JCQkJCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkgewotCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlpbnQgc2l6ZTIgPSBwYXJlbnRzLmxlbmd0aDsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgIWZvdW5kICYmIGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQkJCUlNb2R1bGUgcGFyZW50ID0gcGFyZW50c1tqXTsKLQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXIuY2FuTW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgcGFyZW50IH0sIG5ldyBJTW9kdWxlWzBdLCBtb25pdG9yKTsKLQkJCQkJCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5pc09LKCkpewotCQkJCQkJCQkJbGlzdC5hZGQoc2VydmVyKTsKLQkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIHNlKSB7Ci0JCQkJCQlpZiAoaW5jbHVkZUVycm9ycykKLQkJCQkJCQlsaXN0LmFkZChzZXJ2ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgcHJlZmVycmVkIHNlcnZlciBpcyB0aGUgZmlyc3Qgb25lCi0JCS8vSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclByZWZlcmVuY2VzKCkuZ2V0RGVwbG95YWJsZVNlcnZlclByZWZlcmVuY2UoZGVwbG95YWJsZSk7Ci0JCS8vaWYgKHNlcnZlciAhPSBudWxsICYmIGxpc3QuY29udGFpbnMoc2VydmVyKSAmJiBsaXN0LmluZGV4T2Yoc2VydmVyKSAhPSAwKSB7Ci0JCS8vCWxpc3QucmVtb3ZlKHNlcnZlcik7Ci0JCS8vCWxpc3QuYWRkKDAsIHNlcnZlcik7Ci0JCS8vfQotCi0JCUlTZXJ2ZXJbXSBhbGxTZXJ2ZXJzID0gbmV3IElTZXJ2ZXJbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoYWxsU2VydmVycyk7Ci0JCXJldHVybiBhbGxTZXJ2ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBzZXJ2ZXJzIHRoYXQgdGhpcyBtb2R1bGUgaXMgY29uZmlndXJlZCBvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBzZXJ2ZXIgaW5zdGFuY2VzIHtAbGluayBJU2VydmVyfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlcnZlcltdIGdldFNlcnZlcnNCeU1vZHVsZShJTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSVNlcnZlclswXTsKLQotCQkvLyBkbyBpdCB0aGUgc2xvdyB3YXkgLSBnbyB0aHJvdWdoIGFsbCBzZXJ2ZXJzIGFuZAotCQkvLyBzZWUgaWYgdGhpcyBtb2R1bGUgaXMgY29uZmlndXJlZCBpbiBpdAotCQlMaXN0PElTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7Ci0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWZvciAoSVNlcnZlciBzZXJ2ZXIgOiBzZXJ2ZXJzKSB7Ci0JCQkJaWYgKGNvbnRhaW5zTW9kdWxlKHNlcnZlciwgbW9kdWxlLCBtb25pdG9yKSkKLQkJCQkJbGlzdC5hZGQoc2VydmVyKTsKLQkJCX0KLQkJfQotCQkKLQkJSVNlcnZlcltdIGFsbFNlcnZlcnMgPSBuZXcgSVNlcnZlcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShhbGxTZXJ2ZXJzKTsKLQkJcmV0dXJuIGFsbFNlcnZlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzZXJ2ZXIgY3VycmVudGx5IGNvbnRhaW5zIHRoZSBnaXZlbiBtb2R1bGUuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSBpcyBjb250YWluZWQgb24gdGhlIHNlcnZlciwKLQkgKiAgICBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zTW9kdWxlKElTZXJ2ZXIgc2VydmVyLCBmaW5hbCBJTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCB8fCBtb2R1bGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFyZ3VtZW50cyBjYW5ub3QgYmUgbnVsbCIpOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiY29udGFpbnNNb2R1bGUoKSAiICsgc2VydmVyICsgIiAiICsgbW9kdWxlKTsKLQkJCi0JCWZpbmFsIGJvb2xlYW5bXSBiID0gbmV3IGJvb2xlYW5bMV07Ci0JCQotCQkoKFNlcnZlcilzZXJ2ZXIpLnZpc2l0KG5ldyBJTW9kdWxlVmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGVzKSB7Ci0JCQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCQlpZiAobW9kdWxlc1tzaXplIC0gMV0uZXF1YWxzKG1vZHVsZSkpIHsKLQkJCQkJYlswXSA9IHRydWU7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0sIG51bGwpOwotCQlyZXR1cm4gYlswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBsYXVuY2ggY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBhIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgc2VydmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24sIG9yCi0JICogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc2VydmVyIGNvdWxkIGJlIGZvdW5kCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBnZXR0aW5nIHRoZSBhdHRyaWJ1dGUgZnJvbQotCSAqICAgIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBnZXRTZXJ2ZXIoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgc2VydmVySWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShTZXJ2ZXIuQVRUUl9TRVJWRVJfSUQsIChTdHJpbmcpIG51bGwpOwotCi0JCWlmIChzZXJ2ZXJJZCAhPSBudWxsKQotCQkJcmV0dXJuIFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJZCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoaXMgc2VydmVyIGNhbiBiZSBlZGl0dGVkLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IChTaGVsbCkKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIHNlcnZlcgotCSAqICAgY2FuIGJlIGVkaXRlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgd2hlbiB3cm9uZwotCSAqICAgd2l0aCB0aGUgY2hlY2tvdXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVFZGl0KE9iamVjdCBjb250ZXh0LCBJU2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gKChTZXJ2ZXIpc2VydmVyKS52YWxpZGF0ZUVkaXQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcG9ydCB0aGF0IGlzIGJlaW5nIHVzZWQgdG8gbW9uaXRvciB0aGUgZ2l2ZW4gcG9ydCBvbiB0aGUgc2VydmVyLgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHdoZW5ldmVyIGNyZWF0aW5nIGEgJ2NsaWVudCcgZm9yIHRoZSBzZXJ2ZXIsIGFuZCBhbGxvd3MKLQkgKiB0aGUgY2xpZW50IHRvIHNlYW1sZXNzbHkgdXNlIGEgbW9uaXRvcmVkIHBvcnQgaW5zdGVhZCBvZiBnb2luZyBkaXJlY3RseSB0byB0aGUKLQkgKiBzZXJ2ZXIuCi0JICogCi0JICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBwb3J0IGEgcG9ydCBvbiB0aGUgc2VydmVyCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlIHRoZSBjb250ZW50IHR5cGUsIGUuZy4gIndlYiIKLQkgKiBAcmV0dXJuIHRoZSBtb25pdG9yZWQgcG9ydCwgb3IgdGhlIG9yaWdpbmFsIHBvcnQgbnVtYmVyIGlmIHRoZSBwb3J0IGlzIG5vdAotCSAqICAgIGN1cnJlbnRseSBiZWluZyBtb25pdG9yZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRNb25pdG9yZWRQb3J0KElTZXJ2ZXIgc2VydmVyLCBpbnQgcG9ydCwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCXJldHVybiBTZXJ2ZXJNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vbml0b3JlZFBvcnQoc2VydmVyLCBwb3J0LCBjb250ZW50VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHNjaGVkdWxpbmcgcnVsZSB0byBwcmV2ZW50IGpvYnMgZnJvbSBzaW11bHRhbmVvdXNseSBzdGFydGluZywKLQkgKiBwdWJsaXNoaW5nLCBvciBzdG9wcGluZyB0aGUgc2FtZSBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEByZXR1cm4gYSBzY2hlZHVsaW5nIHJ1bGUgZm9yIHRoaXMgc2VydmVyCi0JICogQHNpbmNlIDIuMAotCSAqIEBkZXByZWNhdGVkIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgaXMgbm93IGEgc2NoZWR1bGluZyBydWxlIGRpcmVjdGx5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2VydmVyU2NoZWR1bGluZ1J1bGUoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvVGFza01vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9UYXNrTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhYjVjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9UYXNrTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLS8qKgotICogQSB0YXNrIG1vZGVsIHJlcHJlc2VudHMgYSBtb2RlbCB0aGF0IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBtdWx0aXBsZQotICogdGFza3MgaW4gYSBjb21tb24gd29ya2Zsb3cuCi0gKiA8cD4KLSAqIFRoZSB0YXNrIG1vZGVsIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdmVyYWxsIHRhc2sgZmxvdyBhbmQgYWxsb3dzCi0gKiB0YXNrcyB0byBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YS4gSXRzIHVzYWdlIGFsbG93cyBtdWx0aXBsZSB0YXNrcyB0byBiZQotICogY2hhaW5lZCB0b2dldGhlciBhbmQgc2hhcmUgZGF0YSBmcm9tIHRoZSBvdXRwdXQgb2Ygb25lIHRhc2sgdG8gdGhlIGlucHV0Ci0gKiBvZiBhbm90aGVyLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTW9kZWwgewotCS8qKgotCSAqIFRhc2sgbW9kZWwgaWQgZm9yIGFuIElSdW50aW1lLgotCSAqIAotCSAqIEBzZWUgI2dldE9iamVjdChTdHJpbmcpCi0JICogQHNlZSAjcHV0T2JqZWN0KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfUlVOVElNRSA9ICJydW50aW1lIjsKLQotCS8qKgotCSAqIFRhc2sgbW9kZWwgaWQgZm9yIGFuIElTZXJ2ZXIuCi0JICogCi0JICogQHNlZSAjZ2V0T2JqZWN0KFN0cmluZykKLQkgKiBAc2VlICNwdXRPYmplY3QoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19TRVJWRVIgPSAic2VydmVyIjsKLQotCS8qKgotCSAqIFRhc2sgbW9kZWwgaWQgZm9yIGFuIGFycmF5IG9mIG1vZHVsZXMuCi0JICogVGhlIHZhbHVlIGlzIGEgTGlzdCBjb250YWluaW5nIElNb2R1bGVbXSBhcnJheXMuCi0JICogCi0JICogQHNlZSAjZ2V0T2JqZWN0KFN0cmluZykKLQkgKiBAc2VlIFRhc2tNb2RlbCNwdXRPYmplY3QoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19NT0RVTEVTID0gIm1vZHVsZXMiOwotCi0JLyoqCi0JICogVGFzayBtb2RlbCBpZCBmb3IgYSBsYXVuY2ggbW9kZS4KLQkgKiAKLQkgKiBAc2VlICNnZXRPYmplY3QoU3RyaW5nKQotCSAqIEBzZWUgI3B1dE9iamVjdChTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0xBVU5DSF9NT0RFID0gImxhdW5jaC1tb2RlIjsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBpbiB0aGUgdGFzayBtb2RlbCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiA8cD4KLQkgKiBUaGUgaWQgY2FuIGJlIGFueSBvZiB0aGUgcHJlZGVmaW5lZCBpZHMgd2l0aGluIFRhc2tNb2RlbCwgb3IKLQkgKiBhbnkgb3RoZXIga2V5IHRvIHJldHJpZXZlIHRhc2stc3BlY2lmaWMgZGF0YS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkIGZvciB0aGUgb2JqZWN0Ci0JICogQHJldHVybiB0aGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgIGlmIG5vIG9iamVjdCBjb3VsZCBiZSBmb3VuZCB3aXRoIHRoYXQgaWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgaWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBtYXAuZ2V0KGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHV0IGFuIG9iamVjdCBpbnRvIHRoZSB0YXNrIG1vZGVsIHdpdGggdGhlIGdpdmVuIGlkLgotCSAqIDxwPgotCSAqIFRoZSBpZCBjYW4gYmUgYW55IG9mIHRoZSBwcmVkZWZpbmVkIGlkcyB3aXRoaW4gVGFza01vZGVsLCBvcgotCSAqIGFueSBvdGhlciBrZXkgdG8gc3RvcmUgdGFzay1zcGVjaWZpYyBkYXRhLiAKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkIHRoZSBpZCB0byBhc3NvY2lhdGUgdGhlIG9iamVjdCB3aXRoCi0JICogQHBhcmFtIG9iaiBhbiBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlc2V0IChjbGVhcikgdGhlIGlkCi0JICovCi0JcHVibGljIHZvaWQgcHV0T2JqZWN0KFN0cmluZyBpZCwgT2JqZWN0IG9iaikgewotCQltYXAucHV0KGlkLCBvYmopOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9CYXNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9CYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMjgwOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBzdG9yaW5nIHJ1bnRpbWUgYW5kIHNlcnZlciBhdHRyaWJ1dGVzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9MT0NLRUQgPSAibG9ja2VkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BSSVZBVEUgPSAicHJpdmF0ZSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9OQU1FID0gIm5hbWUiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSUQgPSAiaWQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSURfU0VUID0gImlkLXNldCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9USU1FU1RBTVAgPSAidGltZXN0YW1wIjsKLQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0JLy8gZmlsZSBsb2FkZWQgZnJvbSwgb3IgbnVsbCBpZiBpdCBpcyBzYXZlZCBpbiBtZXRhZGF0YQotCXByb3RlY3RlZCBJRmlsZSBmaWxlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqLwotCXB1YmxpYyBCYXNlKElGaWxlIGZpbGUpIHsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGlkCi0JICovCi0JcHVibGljIEJhc2UoSUZpbGUgZmlsZSwgU3RyaW5nIGlkKSB7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCWlmIChpZCAhPSBudWxsICYmIGlkLmxlbmd0aCgpID4gMCkgewotCQkJbWFwLnB1dChQUk9QX0lELCBpZCk7Ci0JCQltYXAucHV0KFBST1BfSURfU0VULCBCb29sZWFuLnRvU3RyaW5nKHRydWUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpbWVzdGFtcCBvZiB0aGlzIG9iamVjdC4KLQkgKiBUaW1lc3RhbXBzIGFyZSBtb25vdG9uaWNhbGx5IGluY3JlYXNlZCBlYWNoIHRpbWUgdGhlIG9iamVjdCBpcyBzYXZlZAotCSAqIGFuZCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW55IGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgb24gZGlzawotCSAqIHNpbmNlIHRoZSBvYmplY3Qgd2FzIGxvYWRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QncyB0aW1lc3RhbXAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1RJTUVTVEFNUCwgLTEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgd2hlcmUgdGhpcyBzZXJ2ZXIgaW5zdGFuY2UgaXMgc2VyaWFsaXplZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2Ugd2hlcmUgdGhlIHNlcnZlciBpbnN0YW5jZQotCSAqIGlzIHNlcmlhbGl6ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbmZvcm1hdGlvbiBpcwotCSAqIGluc3RlYWQgdG8gYmUgcGVyc2lzdGVkIHdpdGggdGhlIHdvcmtzcGFjZSBidXQgbm90IHdpdGggYW55Ci0JICogcGFydGljdWxhciB3b3Jrc3BhY2UgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIGlzIGN1cnJlbnRseSBzZXQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgaXMgY3VycmVudGx5IHNldCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlU2V0KFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2JqID0gbWFwLmdldChhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChvYmogIT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IG1hcC5nZXQoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJCXJldHVybiAoU3RyaW5nKSBvYmo7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2JqID0gbWFwLmdldChhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgb2JqKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IG1hcC5nZXQoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoKFN0cmluZykgb2JqKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3Q8U3RyaW5nPiBkZWZhdWx0VmFsdWUpIHsKLQkJdHJ5IHsKLQkJCU9iamVjdCBvYmogPSBtYXAuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCQlyZXR1cm4gKExpc3Q8U3RyaW5nPikgb2JqOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTWFwIGRlZmF1bHRWYWx1ZSkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IG1hcC5nZXQoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJCXJldHVybiAoTWFwKSBvYmo7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9JRCwgIiIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX05BTUUsICIiKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfTE9DS0VELCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJ1bnRpbWUgaXMgcHJpdmF0ZSAobm90IHNob3duCi0JICogaW4gdGhlIFVJIHRvIHRoZSB1c2VycyksIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBydW50aW1lIGlzIHByaXZhdGUsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9QUklWQVRFLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRYTUxSb290KCk7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCS8vSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJwcm9wZXJ0aWVzIik7Ci0JCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50bzsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCU9iamVjdCBvYmogPSBtYXAuZ2V0KGtleSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCWNoaWxkLnB1dFN0cmluZyhrZXksIChTdHJpbmcpIG9iaik7Ci0JCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBvYmo7Ci0JCQkJY2hpbGQucHV0SW50ZWdlcihrZXksIGluLmludFZhbHVlKCkpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQkJQm9vbGVhbiBib29sID0gKEJvb2xlYW4pIG9iajsKLQkJCQljaGlsZC5wdXRCb29sZWFuKGtleSwgYm9vbC5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgb2JqOwotCQkJCXNhdmVMaXN0KGNoaWxkLCBrZXksIGxpc3QpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNYXApIHsKLQkJCQlNYXAgbWFwMiA9IChNYXApIG9iajsKLQkJCQlzYXZlTWFwKGNoaWxkLCBrZXksIG1hcDIpOwotCQkJCQotCQkJfQotCQl9Ci0JCXNhdmVTdGF0ZShjaGlsZCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNhdmVNYXAoSU1lbWVudG8gbWVtZW50bywgU3RyaW5nIGtleSwgTWFwIG1hcDIpIHsKLQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJtYXAiKTsKLQkJY2hpbGQucHV0U3RyaW5nKCJrZXkiLCBrZXkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1hcDIua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQljaGlsZC5wdXRTdHJpbmcocywgKFN0cmluZyltYXAyLmdldChzKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUxpc3QoSU1lbWVudG8gbWVtZW50bywgU3RyaW5nIGtleSwgTGlzdCBsaXN0KSB7Ci0JCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgibGlzdCIpOwotCQljaGlsZC5wdXRTdHJpbmcoImtleSIsIGtleSk7Ci0JCWludCBpID0gMDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBzID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJY2hpbGQucHV0U3RyaW5nKCJ2YWx1ZSIgKyAoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlVG9GaWxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoZ2V0WE1MUm9vdCgpKTsKLQkJCXNhdmUobWVtZW50byk7Ci0KLQkJCUlucHV0U3RyZWFtIGluID0gbWVtZW50by5nZXRJbnB1dFN0cmVhbSgpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDAwKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSAiICsgZ2V0WE1MUm9vdCgpLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JTYXZpbmcsIGdldEZpbGUoKS50b1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJc2F2ZVRvRmlsZShtb25pdG9yKTsKLQkJZWxzZQotCQkJc2F2ZVRvTWV0YWRhdGEobW9uaXRvcik7Ci0JCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlc29sdmVTZXJ2ZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVRvTWV0YWRhdGEoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50byk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCQotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gbWVtZW50by5nZXROYW1lcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBrZXkgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQltYXAucHV0KGtleSwgbWVtZW50by5nZXRTdHJpbmcoa2V5KSk7Ci0JCX0KLQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oImxpc3QiKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWZvciAoSU1lbWVudG8gY2hpbGQgOiBjaGlsZHJlbikKLQkJCQlsb2FkTGlzdChjaGlsZCk7Ci0JCX0KLQkJSU1lbWVudG9bXSBtYXBzID0gbWVtZW50by5nZXRDaGlsZHJlbigibWFwIik7Ci0JCWlmIChtYXBzICE9IG51bGwpIHsKLQkJCWZvciAoSU1lbWVudG8gbSA6IG1hcHMpCi0JCQkJbG9hZE1hcChtKTsKLQkJfQotCQkKLQkJbG9hZFN0YXRlKG1lbWVudG8pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRNYXAoSU1lbWVudG8gbWVtZW50bykgewotCQlTdHJpbmcga2V5ID0gbWVtZW50by5nZXRTdHJpbmcoImtleSIpOwotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHZNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IG1lbWVudG8uZ2V0TmFtZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBzID0gaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIHYgPSBtZW1lbnRvLmdldFN0cmluZyhzKTsKLQkJCXZNYXAucHV0KHMsdik7Ci0JCX0KLQkJbWFwLnB1dChrZXksIHZNYXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRMaXN0KElNZW1lbnRvIG1lbWVudG8pIHsKLQkJU3RyaW5nIGtleSA9IG1lbWVudG8uZ2V0U3RyaW5nKCJrZXkiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaW50IGkgPSAwOwotCQlTdHJpbmcga2V5MiA9IG1lbWVudG8uZ2V0U3RyaW5nKCJ2YWx1ZSIgKyAoaSsrKSk7Ci0JCXdoaWxlIChrZXkyICE9IG51bGwpIHsKLQkJCWxpc3QuYWRkKGtleTIpOwotCQkJa2V5MiA9IG1lbWVudG8uZ2V0U3RyaW5nKCJ2YWx1ZSIgKyAoaSsrKSk7Ci0JCX0KLQkJbWFwLnB1dChrZXksIGxpc3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsb2FkU3RhdGUoSU1lbWVudG8gbWVtZW50byk7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpc1dvcmtpbmdDb3B5KCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICJDYW5ub3QgZGVsZXRlIGEgd29ya2luZyBjb3B5IiwgbnVsbCkpOwotCQkKLQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCWRlbGV0ZUZyb21GaWxlKCk7Ci0JCWVsc2UKLQkJCWRlbGV0ZUZyb21NZXRhZGF0YSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZyb21GaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaWxlLmRlbGV0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVGcm9tTWV0YWRhdGEoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBCYXNlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUJhc2UgYmFzZSA9IChCYXNlKSBvYmo7Ci0JCWlmIChnZXRJZCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZ2V0SWQoKS5lcXVhbHMoYmFzZS5nZXRJZCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChpc1dvcmtpbmdDb3B5KCkgIT0gYmFzZS5pc1dvcmtpbmdDb3B5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoaXNXb3JraW5nQ29weSgpICYmIHRoaXMgIT0gYmFzZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWRGcm9tRmlsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhpbik7Ci0JCQlsb2FkKG1lbWVudG8pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGxvYWQgZnJvbSBmaWxlIiwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTG9hZGluZywgZ2V0RmlsZSgpLnRvU3RyaW5nKCkpLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRnJvbU1lbWVudG8oSU1lbWVudG8gbWVtZW50bywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWxvYWQobWVtZW50byk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWRGcm9tUGF0aChJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgudG9GaWxlKCkpKTsKLQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGluKTsKLQkJCWxvYWQobWVtZW50byk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbG9hZCBmcm9tIHBhdGgiLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JMb2FkaW5nLCBwYXRoLnRvU3RyaW5nKCkpLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoT2JqZWN0IGNvbnRleHQpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQotCQlyZXR1cm4gZmlsZS5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQobmV3IElGaWxlW10geyBmaWxlIH0sIGNvbnRleHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9DaGFpbmVkSm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9DaGFpbmVkSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjQ0YTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQ2hhaW5lZEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotLyoqCi0gKiBBIEpvYiB0aGF0IGNhbiBzdGFydCBhbm90aGVyIGpvYiB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYWluZWRKb2IgZXh0ZW5kcyBKb2IgewotCXByaXZhdGUgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJpdmF0ZSBKb2IgbmV4dEpvYjsKLQlwcml2YXRlIElKb2JDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBkZXBlbmRlbnQgam9iLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBqb2IKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdG8gcHVibGlzaCB0bwotCSAqLwotCXB1YmxpYyBDaGFpbmVkSm9iKFN0cmluZyBuYW1lLCBJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcihuYW1lKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBKb2IjYmVsb25nc1RvKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJcmV0dXJuIFNlcnZlclV0aWwuU0VSVkVSX0pPQl9GQU1JTFkuZXF1YWxzKGZhbWlseSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHRoYXQgdGhpcyBqb2Igd2FzIGNyZWF0ZWQgd2l0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc2VydmVyCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGxpc3RlbmVyIGZvciB3aGVuIHRoaXMgam9iIGZpbmlzaGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpc3RlbmVyKCkgewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWxpc3RlbmVyID0gbmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWpvYkRvbmUoZXZlbnQuZ2V0UmVzdWx0KCkpOwotCQkJfQotCQl9OwotCQkKLQkJYWRkSm9iQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoaXMgam9iIGlzIGNvbXBsZXRlLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMgdGhlIHJlc3VsdCBvZiB0aGUgY3VycmVudCBqb2IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBqb2JEb25lKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJcmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlsaXN0ZW5lciA9IG51bGw7Ci0JCQotCQlpZiAobmV4dEpvYiAhPSBudWxsICYmIHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IKLQkJCQkmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkNBTkNFTCkKLQkJCW5leHRKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG5leHQgam9iLCB3aGljaCBzaG91bGQgYmUgc2NoZWR1bGVkIGlmIGFuZCBvbmx5IGlmIHRoaXMgam9iIGNvbXBsZXRlcwotCSAqIHN1Y2Nlc3NmdWxseS4gVGhlIG5leHQgam9iIHdpbGwgYmUgcnVuIGFzIGxvbmcgYXMgdGhlIHJlc3VsdCBvZiB0aGlzIGpvYiBpcwotCSAqIG5vdCBhbiBFUlJPUiBvciBDQU5DRUwgc3RhdHVzLgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCB0aHJlYWQtc2FmZS4gSG93ZXZlciwgdGhlIG5leHQgam9iIGNhbiBiZSBjaGFuZ2VkIGFueXRpbWUKLQkgKiB1cCB1bnRpbCB0aGUgY3VycmVudCBqb2IgY29tcGxldGVzLgotCSAqIAotCSAqIEBwYXJhbSBqb2IgdGhlIG5leHQgam9iIHRoYXQgc2hvdWxkIGJlIHNjaGVkdWxlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5leHRKb2IoSm9iIGpvYikgewotCQluZXh0Sm9iID0gam9iOwotCQljcmVhdGVMaXN0ZW5lcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9DbGllbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGNjNWMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5DbGllbnREZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnQgaW1wbGVtZW50cyBJQ2xpZW50IHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgQ2xpZW50RGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgY2xpZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIENsaWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNsaWVudCNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbGF0aXZlIHByaW9yaXR5IG9mIHRoaXMgYWRhcHRlci4KLQkgKgotCSAqIEByZXR1cm4gYSBwcmlvcml0eQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgicHJpb3JpdHkiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNsaWVudCNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGF1bmNoYWJsZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJsYXVuY2hhYmxlIik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ2xpZW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJaWYgKGxhYmVsID09IG51bGwpCi0JCQlyZXR1cm4gIm4vYSI7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlbGVnYXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlbGVnYXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBjb3VsZG4ndCBiZSBsb2FkZWQKLQkgKi8KLQlwdWJsaWMgQ2xpZW50RGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbGVnYXRlID0gKENsaWVudERlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNsaWVudCNzdXBwb3J0cyhJU2VydmVyLCBPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlKSB7Ci0JCWlmIChsYXVuY2hhYmxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vaWYgKCFsYXVuY2hhYmxlLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhnZXRMYXVuY2hhYmxlKCkpKQotCQkvLwlyZXR1cm4gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5zdXBwb3J0cyhzZXJ2ZXIsIGxhdW5jaGFibGUsIGxhdW5jaE1vZGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDbGllbnQjbGF1bmNoKElTZXJ2ZXIsIE9iamVjdCwgU3RyaW5nLCBJTGF1bmNoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTGF1bmNoIGxhdW5jaCkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkubGF1bmNoKHNlcnZlciwgbGF1bmNoYWJsZSwgbGF1bmNoTW9kZSwgbGF1bmNoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQ2xpZW50WyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9EZWxldGVkTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9EZWxldGVkTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNmRiYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvRGVsZXRlZE1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVkTW9kdWxlIGltcGxlbWVudHMgSU1vZHVsZSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHJvdGVjdGVkIElNb2R1bGVUeXBlIG1vZHVsZVR5cGUyOwotCi0JcHVibGljIERlbGV0ZWRNb2R1bGUoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSkgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubW9kdWxlVHlwZTIgPSBtb2R1bGVUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgSU1vZHVsZVR5cGUgZ2V0TW9kdWxlVHlwZSgpIHsKLQkJcmV0dXJuIG1vZHVsZVR5cGUyOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBsb2FkQWRhcHRlcihDbGFzcyBhZGFwdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSU1vZHVsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJSU1vZHVsZSBtID0gKElNb2R1bGUpIG9iajsKLQkJaWYgKCFnZXRJZCgpLmVxdWFscyhtLmdldElkKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkRlbGV0ZWRNb2R1bGVbIiArIG5hbWUgKyAiLCIgKyBpZCArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0V4dGVybmFsTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzkzNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZURlbGVnYXRlOwotLyoqCi0gKiBBbiBFeHRlcm5hbE1vZHVsZSBpcyBhIHVuaXQgb2YgImNvbnRlbnQiIHRoYXQgaXMgYWxyZWFkeSBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlcgotICogYnV0IGl0IGRvZXNuJ3QgY29udGFpbiBhIHZhbGlkIHJlc291cmNlIGluIHRoZSB3b3Jrc3BhY2UuCi0gKiA8cD4KLSAqIEV4dGVybmFsTW9kdWxlIGFyZSBjcmVhdGVkIHVzaW5nIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxNb2R1bGUgZXh0ZW5kcyBNb2R1bGUgewotCS8qKgotCSAqIEV4dGVybmFsTW9kdWxlIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBtb2R1bGUgaWQKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbW9kdWxlIG5hbWUKLQkgKiBAcGFyYW0gdHlwZSB0aGUgbW9kdWxlIHR5cGUgaWQKLQkgKiBAcGFyYW0gdmVyc2lvbiB0aGUgbW9kdWxlIHZlcnNpb24gaWQKLQkgKiBAcGFyYW0gZGVsZWdhdGUKLQkgKi8KLQlwdWJsaWMgRXh0ZXJuYWxNb2R1bGUoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBNb2R1bGVEZWxlZ2F0ZSBkZWxlZ2F0ZSkgewotCQlzdXBlcihudWxsLCAiZXh0ZXJuYWw6IiArIGlkLCBuYW1lLCB0eXBlLCB2ZXJzaW9uLCBudWxsKTsKLQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JQ2xpZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MTVlZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogQSBsYXVuY2hhYmxlIGNsaWVudCBpcyBhIGNsaWVudCBzaWRlIGFwcGxpY2F0aW9uIG9yIHRlc3QKLSAqIGhhcm5lc3MgdGhhdCBjYW4gYmUgbGF1bmNoZWQgKHJ1bikgYWdhaW5zdCBhIHJlc291cmNlCi0gKiBydW5uaW5nIG9uIGEgc2VydmVyLgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNsaWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBjbGllbnQuIEVhY2gga25vd24gY2xpZW50IGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgY2xpZW50IGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBjbGllbnQuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgbmFtZSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIGNsaWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgY2xpZW50LgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGRlc2NyaXB0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGlzIGNsaWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGxhdW5jaGFibGUgY2FuIGJlIHJ1biBieSB0aGlzIGNsaWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbGF1bmNoYWJsZSB0aGUgbGF1bmNoYWJsZSBvYmplY3QKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSB0aGUgbW9kZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUpOwotCi0JLyoqCi0JICogTGF1bmNoZXMgdGhlIGNsaWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbGF1bmNoYWJsZSB0aGUgbGF1bmNoYWJsZSBvYmplY3QKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSB0aGUgbW9kZQotCSAqIEBwYXJhbSBsYXVuY2ggdGhlIGxhdW5jaAotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgbGF1bmNoIHdhcwotCSAqICAgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgd2VudCB3cm9uZwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTGF1bmNoIGxhdW5jaCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUluc3RhbGxhYmxlUnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUluc3RhbGxhYmxlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjc4YzA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lJbnN0YWxsYWJsZVJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW5zdGFsbGFibGUgcnVudGltZS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbGxhYmxlUnVudGltZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBydW50aW1lIHR5cGUuCi0JICogRWFjaCBrbm93biBzZXJ2ZXIgcnVudGltZSB0eXBlIGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUHJvdmlkZXMgYSBuYW1lIGZvciB0aGlzIHJ1bnRpbWUuCi0JICogCi0JICogQHJldHVybiBhIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIERvd25sb2FkcyB0aGUgbGljZW5zZSBmcm9tIHRoZSB1cGRhdGUgc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIHRoZSBsaWNlbnNlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWNlbnNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBLaWNrcyBvZmYgYSBiYWNrZ3JvdW5kIGpvYiB0byBpbnN0YWxsIHRoZSBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGluc3RhbGwgdGhlIHJ1bnRpbWUgYXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElQYXRoIHBhdGgpOwotCi0JLyoqCi0JICogSW5zdGFsbCB0aGlzIHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gaW5zdGFsbCB0aGUgcnVudGltZSBhdAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQgCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhpcyBydW50aW1lCi0JICogICAgb3Igc2V0dGluZyBpdCdzIGRlZmF1bHQgdmFsdWVzCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lJbnN0YWxsYWJsZVNlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUluc3RhbGxhYmxlU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTJiZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUluc3RhbGxhYmxlU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW5zdGFsbGFibGUgc2VydmVyIGFkYXB0ZXIuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YWxsYWJsZVNlcnZlciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBydW50aW1lIHR5cGUuCi0JICogRWFjaCBrbm93biBzZXJ2ZXIgcnVudGltZSB0eXBlIGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBydW50aW1lIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgbmFtZSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgcnVudGltZSB0eXBlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGRlc2NyaXB0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGlzIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIHZlbmRvciBuYW1lIGZvciB0aGlzIHJ1bnRpbWUgdHlwZS4gSWYgdGhlCi0JICogcnVudGltZSB0eXBlIGRpZCBub3Qgc3BlY2lmaWMgYSB2ZW5kb3IsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBkZXNjcmlwdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSB2ZW5kb3IgbmFtZSBmb3IgdGhpcyBydW50aW1lIHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlbmRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgdmVyc2lvbiBuYW1lIGZvciB0aGlzIHJ1bnRpbWUgdHlwZS4gSWYgdGhlCi0JICogcnVudGltZSB0eXBlIGRpZCBub3Qgc3BlY2lmaWMgYSB2ZW5kb3IsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBkZXNjcmlwdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSB2ZXJzaW9uIG5hbWUgZm9yIHRoaXMgcnVudGltZSB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBEb3dubG9hZHMgdGhlIGxpY2Vuc2UgZnJvbSB0aGUgdXBkYXRlIHNpdGUuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiB0aGUgbGljZW5zZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGljZW5zZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogSW5zdGFsbCB0aGlzIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoaXMgcnVudGltZQotCSAqICAgIG9yIHNldHRpbmcgaXQncyBkZWZhdWx0IHZhbHVlcwotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTGF1bmNoYWJsZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lMYXVuY2hhYmxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTA5NWNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lMYXVuY2hhYmxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIFRoaXMgaW50ZXJmYWNlLCB0eXBpY2FsbHkgaW1wbGVtZW50ZWQgYnkgdGhlIHNlcnZlcgotICogY29kZSwgY29udmVydHMgZnJvbSBhbiBJTW9kdWxlQXJ0aWZhY3QgdG8gYW4KLSAqIElMYXVuY2hhYmxlLgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxhdW5jaGFibGVBZGFwdGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGFkYXB0ZXIuIEVhY2gga25vd24gYWRhcHRlciBoYXMgYSBkaXN0aW5jdCBpZC4gCi0JICogSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsgdGhleSBhcmUgbm90Ci0JICogaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGF1bmNoYWJsZSBvYmplY3QgZnJvbSB0aGlzIG1vZHVsZSBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZUFydGlmYWN0IGFuIGFydGlmYWN0IGluIHRoZSBtb2R1bGUKLQkgKiBAcmV0dXJuIGEgbGF1bmNoYWJsZSBvYmplY3QKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGhyb3duIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZXR1cm5pbmcgdGhlIGxhdW5jaGFibGUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzFhYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0vKioKLSAqIEludGVyZmFjZSB0byBhIG1lbWVudG8gdXNlZCBmb3Igc2F2aW5nIHRoZSBpbXBvcnRhbnQgc3RhdGUgb2YgYW4gb2JqZWN0Ci0gKiBpbiBhIGZvcm0gdGhhdCBjYW4gYmUgcGVyc2lzdGVkIGluIHRoZSBmaWxlIHN5c3RlbS4KLSAqIDxwPgotICogTWVtZW50b3Mgd2VyZSBkZXNpZ25lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGluIG1pbmQ6Ci0gKiA8b2w+Ci0gKiAgPGxpPkNlcnRhaW4gb2JqZWN0cyBuZWVkIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgcGxhdGZvcm0gc2Vzc2lvbnMuCi0gKiAgICA8L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgYW4gYXBwcm9wcmlhdGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtaWdodCBub3QKLSAqICAgIGJlIGF2YWlsYWJsZS4gSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBza2lwIGFuIG9iamVjdCBpbiB0aGlzIGNhc2UuPC9saT4KLSAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgdGhlIG9iamVjdCBtYXkgYmUKLSAqICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2hlbiB0aGUgb2JqZWN0IHdhcyBvcmlnaW5hbGx5IHNhdmVkLiBJZiBzbywgdGhlCi0gKiAgICBuZXcgY2xhc3Mgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIGZvcm0gb2YgdGhlIGRhdGEuPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1lbWVudG9zIG1lZXQgdGhlc2UgcmVxdWlyZW1lbnRzIGJ5IHByb3ZpZGluZyBzdXBwb3J0IGZvciBzdG9yaW5nIGEKLSAqIG1hcHBpbmcgb2YgYXJiaXRyYXJ5IHN0cmluZyBrZXlzIHRvIHByaW1pdGl2ZSB2YWx1ZXMsIGFuZCBieSBhbGxvd2luZwotICogbWVtZW50b3MgdG8gaGF2ZSBvdGhlciBtZW1lbnRvcyBhcyBjaGlsZHJlbiAoYXJyYW5nZWQgaW50byBhIHRyZWUpLgotICogQSByb2J1c3QgZXh0ZXJuYWwgc3RvcmFnZSBmb3JtYXQgYmFzZWQgb24gWE1MIGlzIHVzZWQuCi0gKiA8L3A+PHA+Ci0gKiBUaGUga2V5IGZvciBhbiBhdHRyaWJ1dGUgbWF5IGJlIGFueSBhbHBoYSBudW1lcmljIHZhbHVlLiAgSG93ZXZlciwgdGhlCi0gKiB2YWx1ZSBvZiA8Y29kZT5UQUdfSUQ8L2NvZGU+IGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVtZW50byB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBvZiB0aGlzIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcwotCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50bwotCSAqIEBzZWUgI2dldENoaWxkCi0JICogQHNlZSAjZ2V0Q2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBpZC4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGlkCi0JICogQHJldHVybiB0aGUgZmlyc3QgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gdHlwZQotCSAqLwotCXB1YmxpYyBJTWVtZW50byBnZXRDaGlsZChTdHJpbmcgdHlwZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW4gdHlwZSBpZC4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGlkCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBjaGlsZHJlbiB3aXRoIHRoZSBnaXZlbiB0eXBlCi0JICovCi0JcHVibGljIElNZW1lbnRvW10gZ2V0Q2hpbGRyZW4oU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZsb2F0aW5nIHBvaW50IHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSB3YXMgbm90IGZvdW5kIG9yIHdhcyBmb3VuZAotCSAqICAgYnV0IHdhcyBub3QgYSBmbG9hdGluZyBwb2ludCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgRmxvYXQgZ2V0RmxvYXQoU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSB3YXMgbm90IGZvdW5kIG9yIHdhcyBmb3VuZAotCSAqICAgYnV0IHdhcyBub3QgYW4gaW50ZWdlcgotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXIoU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogIGJ1dCB3YXMgbm90IGFuIGludGVnZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogIGJ1dCB3YXMgbm90IGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGtleSk7Ci0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5hbWVzKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGtleSB0byB0aGUgZ2l2ZW4gaW50ZWdlci4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRJbnRlZ2VyKFN0cmluZyBrZXksIGludCB2YWx1ZSk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGtleSB0byB0aGUgZ2l2ZW4gYm9vbGVhbiB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGtleSB0byB0aGUgZ2l2ZW4gc3RyaW5nLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNb2R1bGVQdWJsaXNoSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTW9kdWxlUHVibGlzaEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTZkZmFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNb2R1bGVQdWJsaXNoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLS8qKgotICogVGVtcG9yYXJ5IGludGVyZmFjZSB0byBoZWxwIHRoZSB3ZWIgc2VydmljZXMgdGVhbS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlUHVibGlzaEhlbHBlciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCB0aGF0IHRoZSBtb2R1bGUgaXMgcHVibGlzaGVkIHRvLCBvciBudWxsIGlmIHRoZSBtb2R1bGUgaXMgbm90Ci0JICogcHVibGlzaGVkIHRvIHRoZSBzZXJ2ZXIgb3IgdGhlIGxvY2F0aW9uIGlzIHVua25vd24uCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZSBvbiB0aGUgc2VydmVyIAotCSAqIEByZXR1cm4gdGhlIHBhdGggdGhhdCB0aGUgbW9kdWxlIGlzIHB1Ymxpc2hlZCB0bywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90Ci0JICogICBhIHZhbGlkIG1vZHVsZSBvciB0aGUgbG9jYXRpb24gaXMgdW5rbm93bgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQdWJsaXNoRGlyZWN0b3J5KElNb2R1bGVbXSBtb2R1bGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1vZHVsZVZpc2l0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNb2R1bGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZTM2MmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1vZHVsZVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0vKioKLSAqIEEgdmlzaXRvciBvbiBhIHNlcnZlcidzIG1vZHVsZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZVZpc2l0b3IgewotCS8qKgotCSAqIFZpc2l0IGEgc2luZ2xlIG1vZHVsZS4gUmV0dXJucyB0cnVlIHRvIGtlZXAgdmlzaXRpbmcsIGFuZAotCSAqIGZhbHNlIGlmIGl0IHNob3VsZCBzdG9wIHZpc2l0aW5nIHRoZSBtb2R1bGUuIAotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUgb24gdGhlIHNlcnZlcgotCSAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiB0byB2aXNpdCB0aGUgbmV4dCBtb2R1bGUsIG9yCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHN0b3AgdmlzaXRpbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlW10gbW9kdWxlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTW9uaXRvcmVkU2VydmVyUG9ydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1vbml0b3JlZFNlcnZlclBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlhZTIzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTW9uaXRvcmVkU2VydmVyUG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLQotLyoqCi0gKiBBbiBtb25pdG9yZWQgcG9ydCBvbiBhIHNlcnZlci4KLSAqIAotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb25pdG9yZWRTZXJ2ZXJQb3J0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgdGhhdCBpdCBiZWluZyBtb25pdG9yZWQuCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHBvcnQuCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLm1vZGVsLklTZXJ2ZXJQb3J0Ci0JICovCi0JcHVibGljIFNlcnZlclBvcnQgZ2V0U2VydmVyUG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwb3J0IHRoYXQgaXMgYmVpbmcgdXNlZCB0byBtb25pdG9yLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRNb25pdG9yUG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCB0eXBlcyB0aGF0IGFyZSBiZWluZyBtb25pdG9yZWQsIG9yIG51bGwgZm9yIGFsbCBjb250ZW50LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENvbnRlbnRUeXBlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBtb25pdG9yIGlzIGN1cnJlbnRseSBydW5uaW5nL2FjdGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0ZWQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JT3JkZXJlZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU9yZGVyZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmMzAwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JT3JkZXJlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIEFuIG9iamVjdCB0aGF0IGhhcyBhbiBhYnNvbHV0ZSBvcmRlcmluZywgYW5kIGNhbiBiZSBvcmRlcmVkIGFnYWluc3Qgb3RoZXIgb2JqZWN0cy4KLSAqIAotICogPHA+Ci0gKiBbaXNzdWU6IEl0IGlzIG5vdG9yaW91c2x5IGRpZmZpY3VsdCB0byBwbGFjZSBhbnkga2luZCBvZgotICogdXNlZnVsIG9yZGVyIG9uIG9iamVjdHMgdGhhdCBhcmUgY29udHJpYnV0ZWQgaW5kZXBlbmRlbnRseSBieQotICogbm9uLWNvbGxhYm9yYXRpbmcgcGFydGllcy4gVGhlIElPcmRlcmVkIG1lY2hhbmlzbSBpcyB3ZWFrLCBhbmQKLSAqIGNhbid0IHJlYWxseSBzb2x2ZSB0aGUgcHJvYmxlbS4gSXNzdWVzIG9mIHByZXNlbnRhdGlvbiBhcmUgdXN1YWxseQotICogYmVzdCBsZWZ0IHRvIHRoZSBVSSwgd2hpY2ggY2FuIHNvcnQgb2JqZWN0cyBiYXNlZCBvbiBhcmJpdHJhcnkKLSAqIHByb3BlcnRpZXMuXQotICogPC9wPgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9yZGVyZWQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIG9yZGVyIChpbmRleC9wcmlvcml0eSkuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9yZGVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVB1Ymxpc2hUYXNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JUHVibGlzaFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5MTVlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JUHVibGlzaFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hPcGVyYXRpb247Ci0vKioKLSAqIEEgdGFzayBmb3IgYSBzZXJ2ZXIuCi0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUHVibGlzaFRhc2sgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBhZGFwdGVyLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0eXBlIChnaXZlbiBieSB0aGUgaWQpIGNhbiB1c2UgdGhpcyB0YXNrLiBUaGlzCi0JICogcmVzdWx0IGlzIGJhc2VkIG9uIHRoZSByZXN1bHQgb2YgdGhlIGdldFR5cGVJZHMoKSBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIGlkIGEgc2VydmVyIHR5cGUgaWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1R5cGUoU3RyaW5nIGlkKTsKLQotCS8qKgotCSAqIExldHMgdGhlIHRhc2sga25vdyB0aGF0IGl0IGlzIGFib3V0IHRvIGJlIHVzZWQuIFRoaXMgbWV0aG9kIHNob3VsZAotCSAqIGJlIHVzZWQgdG8gY2xlYW4gb3V0IGFueSBwcmV2aW91c2x5IGNhY2hlZCBpbmZvcm1hdGlvbiwgb3Igc3RhcnQgdG8KLQkgKiBjcmVhdGUgYSBuZXcgY2FjaGUuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZXMgYSBsaXN0IGNvbnRhaW5pbmcgSU1vZHVsZSBhcnJheXMKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2Ygb3B0aW9uYWwgdGFza3MgCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcGVyYXRpb25bXSBnZXRUYXNrcyhJU2VydmVyIHNlcnZlciwgTGlzdCBtb2R1bGVzKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhc2tzIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBkdXJpbmcgcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kdWxlcyBhIGxpc3QgY29udGFpbmluZyBJTW9kdWxlIGFycmF5cwotCSAqIEBwYXJhbSBraW5kIG9uZSBvZiB0aGUgSVNlcnZlci5QVUJMSVNIX1hYIGNvbnN0YW50cwotCSAqIEBwYXJhbSBraW5kTGlzdCBvbmUgb2YgdGhlIElTZXJ2ZXIgcHVibGlzaCBjaGFuZ2UgY29uc3RhbnRzCi0JICogQHJldHVybiB0aGUgdGFza3MgdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKElTZXJ2ZXIgc2VydmVyLCBpbnQga2luZCwgTGlzdCBtb2R1bGVzLCBMaXN0IGtpbmRMaXN0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JUnVudGltZUxvY2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lSdW50aW1lTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWJmOWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lSdW50aW1lTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci0vKioKLSAqIEEgcnVudGltZSBsb2NhdG9yIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGxvY2F0ZSBvciBzZWFyY2ggZm9yIGFkZGl0aW9uYWwKLSAqIHJ1bnRpbWVzIG9mIGEgcGFydGljdWxhciB0eXBlLgotICogPHA+Ci0gKiBSdW50aW1lIGxvY2F0b3JzIGFyZSBmb3VuZCB2aWEgU2VydmVyQ29yZS5nZXRSdW50aW1lTG9jYXRvcnMoKS4KLSAqIDwvcD4KLSAqIAotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lTG9jYXRvciB7Ci0JLyoqCi0JICogQSBjYWxsYmFjayBsaXN0ZW5lciBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJUnVudGltZVNlYXJjaExpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIENhbGxlZCB3aGVuIGEgbmV3IHJ1bnRpbWUgaXMgZm91bmQgYnkgdGhlIGxvY2F0b3IuCi0JCSAqIFRoZSBydW50aW1lIG11c3QgbmV2ZXIgYmUgbnVsbC4KLQkJICogCi0JCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRoYXQgd2FzIGZvdW5kLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVudGltZUZvdW5kKElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBydW50aW1lIGxvY2F0b3IuCi0JICogRWFjaCBrbm93biBydW50aW1lIGxvY2F0b3IgaGFzIGEgZGlzdGluY3QgaWQuIAotCSAqIElkcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IGFzIGtleXM7IHRoZXkgYXJlIG5vdAotCSAqIGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lIGxvY2F0b3IgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJ1bnRpbWUgbG9jYXRvciBjYW4gZmluZCBydW50aW1lcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiBUaGUgaWQgc2hvdWxkIG5ldmVyIGJlIG51bGwuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlSWQgdGhlIGlkIG9mIGEgcnVudGltZSB0eXBlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBydW50aW1lVHlwZUlkKTsKLQotCS8qKgotCSAqIFNlYXJjaGVzIGZvciBsb2NhbCBydW50aW1lcy4KLQkgKiBJdCB1c2VzIHRoZSBjYWxsYmFjayBsaXN0ZW5lciB0byByZXBvcnQgcnVudGltZXMgdGhhdCBhcmUgZm91bmQuCi0JICogVGhlIHBhdGggY29udGFpbnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZvbGRlciB0byBzZWFyY2ggaW4sCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gc2VhcmNoIHRoZSBlbnRpcmUgbWFjaGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBzZWFyY2ggZm9yIHJ1bnRpbWVzIGluCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgbGlzdGVuZXIgdG8gcmVwb3J0IHN0YXR1cyB0bwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWFyY2hGb3JSdW50aW1lcyhJUGF0aCBwYXRoLCBJUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTZXJ2ZXJMb2NhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JU2VydmVyTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDJjYWZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTZXJ2ZXJMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIEEgc2VydmVyIGxvY2F0b3IgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gbG9jYXRlIG9yIHNlYXJjaCBmb3IgYWRkaXRpb25hbAotICogc2VydmVycyBvZiBhIHBhcnRpY3VsYXIgdHlwZSwgb24gYSBwYXJ0aWN1bGFyIGhvc3QuCi0gKiA8cD4KLSAqIFNlcnZlciBsb2NhdG9ycyBhcmUgZm91bmQgdmlhIFNlcnZlckNvcmUuZ2V0U2VydmVyTG9jYXRvcnMoKS4KLSAqIDwvcD4KLSAqIAotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJMb2NhdG9yIHsKLQkvKioKLQkgKiBBIGNhbGxiYWNrIGxpc3RlbmVyIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJTZWFyY2hMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBDYWxsZWQgd2hlbiBhIG5ldyBzZXJ2ZXIgaXMgZm91bmQgYnkgdGhlIGxvY2F0b3IuCi0JCSAqIFRoZSBzZXJ2ZXIgbXVzdCBuZXZlciBiZSBudWxsLgotCQkgKiAKLQkJICogQHBhcmFtIHNlcnZlciB0aGUgcnVudGltZSB0aGF0IHdhcyBmb3VuZC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNlcnZlckZvdW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgc2VydmVyIGxvY2F0b3IuCi0JICogRWFjaCBrbm93biBzZXJ2ZXIgbG9jYXRvciBoYXMgYSBkaXN0aW5jdCBpZC4gCi0JICogSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsgdGhleSBhcmUgbm90Ci0JICogaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZlciBsb2NhdG9yIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgbG9jYXRvciBjYW4gZmluZCBzZXJ2ZXJzIG9mIHRoZSBnaXZlbiB0eXBlLgotCSAqIFRoZSBpZCBzaG91bGQgbmV2ZXIgYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyVHlwZUlkIHRoZSBpZCBvZiBhIHNlcnZlciB0eXBlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBzZXJ2ZXJUeXBlSWQpOwotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB0eXBlIG9mIHNlcnZlciBjYW4gcnVuIG9uIGEgcmVtb3RlIGhvc3QuCi0JICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHNlcnZlciB0eXBlIGNhbiBvbmx5IGJlIHJ1biBvbiAibG9jYWxob3N0IgotCSAqICh0aGUgbG9jYWwgbWFjaGluZSkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgb2Ygc2VydmVyIGNhbiBydW4gb24KLQkgKiAgICBhIHJlbW90ZSBob3N0LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGNhbm5vdAotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmVtb3RlSG9zdHMoKTsKLQotCS8qKgotCSAqIFNlYXJjaGVzIGZvciBzZXJ2ZXJzLiAKLQkgKiBJdCB1c2VzIHRoZSBjYWxsYmFjayBsaXN0ZW5lciB0byByZXBvcnQgc2VydmVycyB0aGF0IGFyZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gaG9zdCBhIGhvc3Qgc3RyaW5nIGNvbmZvcm1pbmcgdG8gUkZDIDI3MzIKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBsaXN0ZW5lciB0byByZXBvcnQgc3RhdHVzIHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaEZvclNlcnZlcnMoU3RyaW5nIGhvc3QsIElTZXJ2ZXJTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JU2VydmVyTW9uaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVNlcnZlck1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwZDE4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JU2VydmVyTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIEFuIGludGVyZmFjZSB0byBhIFRDUC9JUCBtb25pdG9yLgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlck1vbml0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBtb25pdG9yLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFiZWwgKG5hbWUpIG9mIHRoaXMgbW9uaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgbW9uaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTdGFydCBtb25pdG9yaW5nIHRoZSBnaXZlbiBwb3J0LCBhbmQgcmV0dXJuIHRoZSBwb3J0IG51bWJlciB0bwotCSAqIHR1bm5lbCByZXF1ZXN0cyB0aHJvdWdoLiBUaGUgbW9uaXRvclBvcnQgaXMgdGhlIG5ldyBwb3J0IHRvIHVzZSwgb3IKLQkgKiAtMSB0byBwaWNrIGEgcmFuZG9tIHBvcnQuCi0JICogCi0JICogQHBhcmFtIHBvcnQKLQkgKiBAcmV0dXJuCi0JICovCi0JLy9wdWJsaWMgaW50IHN0YXJ0TW9uaXRvcmluZyhJU2VydmVyIHNlcnZlciwgU2VydmVyUG9ydCBwb3J0LCBpbnQgbW9uaXRvclBvcnQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU3RvcCBtb25pdG9yaW5nIHRoZSBnaXZlbiBwb3J0LgotCSAqIAotCSAqIEBwYXJhbSBwb3J0Ci0JICovCi0JLy9wdWJsaWMgdm9pZCBzdG9wTW9uaXRvcmluZyhJU2VydmVyIHNlcnZlciwgU2VydmVyUG9ydCBwb3J0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JU2VydmVyTW9uaXRvck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTZXJ2ZXJNb25pdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDFmYWY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTZXJ2ZXJNb25pdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLS8qKgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlck1vbml0b3JNYW5hZ2VyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBwb3J0cyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgbW9uaXRvcmVkLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbW9uaXRvcmVkIHBvcnRzIGZvciB0aGlzIHNlcnZlcgotCSAqLwotCXB1YmxpYyBJTW9uaXRvcmVkU2VydmVyUG9ydFtdIGdldE1vbml0b3JlZFBvcnRzKElTZXJ2ZXIgc2VydmVyKTsKLQotCS8qKgotCSAqIFN0YXJ0cyBtb25pdG9yaW5nIHRoZSBnaXZlbiBwb3J0LCBhbmQgcmV0dXJucyB0aGUgbmV3IHBvcnQgIyB0byB1c2UgdGhhdCB3aWxsCi0JICogcm91dGUgdG8gdGhlIG1vbml0b3JlZCBwb3J0LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcG9ydAotCSAqIEBwYXJhbSBtb25pdG9yUG9ydCAtIHRoZSBuZXcgcG9ydCBudW1iZXIgdG8gdXNlIGZvciBtb25pdG9yaW5nLCBvciAtMSB0byBwaWNrIGEgbmV3IHBvcnQKLQkgKiBAcGFyYW0gY29udGVudAotCSAqIEByZXR1cm4gbW9uaXRvciBwb3J0IG51bWJlcgotCSAqLwotCXB1YmxpYyBJTW9uaXRvcmVkU2VydmVyUG9ydCBjcmVhdGVNb25pdG9yKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQsIGludCBtb25pdG9yUG9ydCwgU3RyaW5nW10gY29udGVudCk7Ci0KLQkvKioKLQkgKiBTdG9wIG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQuIFRocm93cyBhIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbQotCSAqIHN0b3BwaW5nIHRoZSBtb25pdG9yaW5nCi0JICoKLQkgKiBAcGFyYW0gbXNwIHRoZSBtb25pdG9yZWQgcG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1vbml0b3IoSU1vbml0b3JlZFNlcnZlclBvcnQgbXNwKTsKLQotCS8qKgotCSAqIFN0YXJ0IHRoZSBtb25pdG9yLiBJZiB0aGUgbXNwIHBvcnQgaXMgLTEsIGl0IHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgcG9ydCB0aGF0IGlzIGFjdHVhbGx5IGluIHVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbXNwIHRoZSBtb25pdG9yZWQgcG9ydCAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydE1vbml0b3IoSU1vbml0b3JlZFNlcnZlclBvcnQgbXNwKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFN0b3AgbW9uaXRvcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gbXNwIHRoZSBtb25pdG9yZWQgcG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BNb25pdG9yKElNb25pdG9yZWRTZXJ2ZXJQb3J0IG1zcCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb25pdG9yZWQgcG9ydCB0byB1c2Ugd2hlbiBtYWtpbmcgcmVxdWVzdHMgdG8gdGhlIGdpdmVuIHNlcnZlciwgcG9ydCBudW1iZXIsCi0JICogYW5kIGNvbnRlbnQuIFJldHVybnMgdGhlIGV4aXN0aW5nIHBvcnQgbnVtYmVyIGlmIHRoZSBwb3J0IGlzIG5vdCBiZWluZyBtb25pdG9yZWQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEBwYXJhbSBwb3J0Ci0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHJldHVybiB0aGUgbW9uaXRvcmVkIHBvcnQgbnVtYmVyCi0JICovCi0JcHVibGljIGludCBnZXRNb25pdG9yZWRQb3J0KElTZXJ2ZXIgc2VydmVyLCBpbnQgcG9ydCwgU3RyaW5nIGNvbnRlbnRUeXBlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JU3RhcnR1cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVN0YXJ0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIxMzMwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JU3RhcnR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciB0aGUgc3RhcnR1cCBleHRlbnNpb24gcG9pbnQuCi0gKiBQbHVnLWlucyB0aGF0IHJlZ2lzdGVyIGEgc3RhcnR1cCBleHRlbnNpb24gd2lsbCBiZSBhY3RpdmF0ZWQgd2hlbiB0aGUgc2VydmVyCi0gKiBjb3JlIHBsdWctaW4gaW5pdGlhbGl6ZXMgYW5kIGhhdmUgYW4gb3Bwb3J0dW5pdHkgdG8gcnVuIGNvZGUgdGhhdCBjYW4ndCBiZQotICogaW1wbGVtZW50ZWQgdXNpbmcgdGhlIG5vcm1hbCBjb250cmlidXRpb24gbWVjaGFuaXNtcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RhcnR1cCB7Ci0JLyoqCi0JICogV2lsbCBiZSBjYWxsZWQgb24gc2VydmVyIGNvcmUgc3RhcnR1cC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSW5zdGFsbGFibGVSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5NzY4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLkluc3RhbGxDb21tYW5kOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbGFibGVSdW50aW1lIGltcGxlbWVudHMgSUluc3RhbGxhYmxlUnVudGltZSB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQkKLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgTE9DSyA9IG5ldyBPYmplY3QoKTsKLQotCXB1YmxpYyBJbnN0YWxsYWJsZVJ1bnRpbWUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFBhdGgoKSArICIiOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZVZlcnNpb24oKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImZlYXR1cmVWZXJzaW9uIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVJZCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZmVhdHVyZUlkIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZUlkKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJidW5kbGVJZCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCdW5kbGVWZXJzaW9uKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJidW5kbGVWZXJzaW9uIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInBhdGgiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnJvbVNpdGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImZlYXR1cmVTaXRlIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxhYmxlUnVudGltZSNnZXRMaWNlbnNlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWNlbnNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgZmVhdHVyZUlkID0gZ2V0RmVhdHVyZUlkKCk7Ci0JCVN0cmluZyBmZWF0dXJlVmVyc2lvbiA9IGdldEZlYXR1cmVWZXJzaW9uKCk7Ci0JCVN0cmluZyBmcm9tU2l0ZSA9IGdldEZyb21TaXRlKCk7Ci0JCQotCQlpZiAoZmVhdHVyZUlkID09IG51bGwgfHwgZmVhdHVyZVZlcnNpb24gPT0gbnVsbCB8fCBmcm9tU2l0ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJU2l0ZSBzaXRlID0gSW5zdGFsbGFibGVSdW50aW1lLmdldFNpdGUoZnJvbVNpdGUsIG1vbml0b3IpOwotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlUmVmcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUmVmcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHZlciA9IGZlYXR1cmVSZWZzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQkJaW50IGluZCA9IHZlci5pbmRleE9mKCJfIik7Ci0JCQlpZiAoaW5kID49IDApCi0JCQkJdmVyID0gdmVyLnN1YnN0cmluZyhpbmQrMSk7Ci0JCQlpZiAoZmVhdHVyZUlkLmVxdWFscyhmZWF0dXJlUmVmc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKSAmJiBmZWF0dXJlVmVyc2lvbi5lcXVhbHModmVyKSkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlUmVmc1tpXS5nZXRGZWF0dXJlKG1vbml0b3IpOwotCQkJCUlVUkxFbnRyeSBsaWNlbnNlID0gZmVhdHVyZS5nZXRMaWNlbnNlKCk7Ci0JCQkJaWYgKGxpY2Vuc2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGxpY2Vuc2UuZ2V0QW5ub3RhdGlvbigpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBCdW5kbGUgZ2V0QnVuZGxlVmVyc2lvbihCdW5kbGVbXSBidW5kbGVzLCBTdHJpbmcgdmVyc2lvbikgewotCQlpZiAoYnVuZGxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpbnQgc2l6ZSA9IGJ1bmRsZXMubGVuZ3RoOwotCQlyZXR1cm4gYnVuZGxlc1tzaXplIC0gMV07Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsYWJsZVJ1bnRpbWUjaW5zdGFsbChJUGF0aCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKGZpbmFsIElQYXRoIHBhdGgpIHsKLQkJSm9iIGluc3RhbGxSdW50aW1lSm9iID0gbmV3IEpvYihNZXNzYWdlcy5qb2JJbnN0YWxsaW5nUnVudGltZSkgewotCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCQlyZXR1cm4gU2VydmVyUGx1Z2luLlBMVUdJTl9JRC5lcXVhbHMoZmFtaWx5KTsKLQkJCX0KLQkJCQotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXRyeSB7Ci0JCQkJCWluc3RhbGwocGF0aCwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlyZXR1cm4gY2UuZ2V0U3RhdHVzKCk7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQkKLQkJaW5zdGFsbFJ1bnRpbWVKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTaXRlIGdldFNpdGUoU3RyaW5nIGZyb21TaXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCVVSTCBzaXRlVVJMID0gbmV3IFVSTChmcm9tU2l0ZSk7Ci0JCQlyZXR1cm4gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShzaXRlVVJMLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgcGFyc2Ugc2l0ZSIsIGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgcGFyc2Ugc2l0ZSIsIGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBwYXJzZSBzaXRlIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU2l0ZSBnZXRTaXRlKFVSTCBmcm9tU2l0ZVVSTCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJc3luY2hyb25pemVkIChMT0NLKSB7Ci0JCQkJcmV0dXJuIFNpdGVNYW5hZ2VyLmdldFNpdGUoZnJvbVNpdGVVUkwsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgcGFyc2Ugc2l0ZSIsIGUpOwotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgcGFyc2Ugc2l0ZSIsIGUpOwotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE1pcnJvcihTdHJpbmcgZnJvbVNpdGUsIElTaXRlIHNpdGUsIGludCBtaXJyb3IpIHsKLQkJaWYgKHNpdGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1pcnJvclNpdGUgPSBnZXRNaXJyb3Ioc2l0ZSwgbWlycm9yKTsKLQkJCWlmIChtaXJyb3JTaXRlICE9IG51bGwpCi0JCQkJcmV0dXJuIG1pcnJvclNpdGU7Ci0JCX0KLQkJLy8gb25seSByZXR1cm4gZnJvbVNpdGUgaWYgdGhpcyBpcyB0aGUgMHRoIG1pcnJvcgotCQlpZiAobWlycm9yID4gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZnJvbVNpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0TWlycm9yKElTaXRlIHNpdGUsIGludCBtaXJyb3IpIHsKLQkJLy8gaWYgdGhlIHNpdGUgaXMgYSBzaXRlIGNvbnRhaW5pbmcgbWlycm9ycywgc2V0IHRoZSBmcm9tU2l0ZSB0byB0aGUKLQkJLy8gbWlycm9ycyBpbiBvcmRlciBzaXRlIHNpbmNlIG1hbnkgbWlycm9yIGxpc3QgZ2VuZXJhdG9ycyB3aWxsIHNvcnQgdGhlIG1pcnJvcnMKLQkJLy8gdG8gY2xvc2VzdCBnZW9ncmFwaGljIGxvY2F0aW9uCi0JCWlmIChzaXRlICE9IG51bGwgJiYgc2l0ZSBpbnN0YW5jZW9mIElTaXRlV2l0aE1pcnJvcnMpIHsKLQkJCXRyeSB7Ci0JCQkJSVVSTEVudHJ5W10gdXJsRW50cmllcyA9ICgoSVNpdGVXaXRoTWlycm9ycykgc2l0ZSkuZ2V0TWlycm9yU2l0ZUVudHJpZXMoKTsKLQkJCQlpZiAodXJsRW50cmllcy5sZW5ndGggPiBtaXJyb3IpCi0JCQkJCXJldHVybiB1cmxFbnRyaWVzW21pcnJvcl0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZmluZCBtaXJyb3Igc2l0ZSIsIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbGFibGVSdW50aW1lI2luc3RhbGwoSVBhdGgsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9IGdldEZlYXR1cmVJZCgpOwotCQlTdHJpbmcgZmVhdHVyZVZlcnNpb24gPSBnZXRGZWF0dXJlVmVyc2lvbigpOwotCQlTdHJpbmcgZnJvbVNpdGUgPSBnZXRGcm9tU2l0ZSgpOwotCQkKLQkJaWYgKGZlYXR1cmVJZCA9PSBudWxsIHx8IGZlYXR1cmVWZXJzaW9uID09IG51bGwgfHwgZnJvbVNpdGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWludCBtaXJyb3IgPSAwOwotCQlJU2l0ZSBzaXRlID0gZ2V0U2l0ZShmcm9tU2l0ZSwgbW9uaXRvcik7Ci0JCWZyb21TaXRlID0gZ2V0TWlycm9yKGZyb21TaXRlLCBzaXRlLCBtaXJyb3IpOwotCQkKLQkJYm9vbGVhbiBpbnN0YWxsID0gZmFsc2U7Ci0JCWlmIChnZXRCdW5kbGVJZCgpICE9IG51bGwpIHsKLQkJCWluc3RhbGwgPSBQbGF0Zm9ybS5nZXRCdW5kbGVzKGdldEJ1bmRsZUlkKCksIGdldEJ1bmRsZVZlcnNpb24oKSkgPT0gbnVsbDsKLQkJfSBlbHNlIGlmIChnZXRQYXRoKCkgIT0gbnVsbCkgewotCQkJaW5zdGFsbCA9ICFuZXcgRmlsZShnZXRGZWF0dXJlQXJjaGl2ZVBhdGgoKSkuZXhpc3RzKCk7Ci0JCX0KLQkJCi0JCS8vIGRvd25sb2FkIGFuZCBpbnN0YWxsIHBsdWdpbnMKLQkJaWYgKGluc3RhbGwpIHsKLQkJCWJvb2xlYW4gY29tcGxldGUgPSBmYWxzZTsKLQkJCXdoaWxlICghY29tcGxldGUpIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLnNldFRhc2tOYW1lKCJJbnN0YWxsaW5nIGZlYXR1cmUiKTsKLQkJCQkJSW5zdGFsbENvbW1hbmQgY29tbWFuZCA9IG5ldyBJbnN0YWxsQ29tbWFuZChmZWF0dXJlSWQsIGZlYXR1cmVWZXJzaW9uLCBmcm9tU2l0ZSwgbnVsbCwgImZhbHNlIik7Ci0JCQkJCWJvb2xlYW4gYiA9IGNvbW1hbmQucnVuKG1vbml0b3IpOwotCQkJCQlpZiAoIWIpCi0JCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQkJCU1lc3NhZ2VzLmVycm9ySW5zdGFsbGluZ1NlcnZlckZlYXR1cmUsIG51bGwpKTsKLQkJCQkJY29tbWFuZC5hcHBseUNoYW5nZXNOb3coKTsKLQkJCQkJY29tcGxldGUgPSB0cnVlOwotCQkJCX0gY2F0Y2ggKENvbm5lY3RFeGNlcHRpb24gY2UpIHsKLQkJCQkJbWlycm9yKys7Ci0JCQkJCWZyb21TaXRlID0gZ2V0TWlycm9yKGZyb21TaXRlLCBzaXRlLCBtaXJyb3IpOwotCQkJCQlpZiAoZnJvbVNpdGUgPT0gbnVsbCkKLQkJCQkJCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBpbnN0YWxsaW5nIGZlYXR1cmUiLCBlKTsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9ySW5zdGFsbGluZ1NlcnZlciwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQl0cnkgewotCQkJVVJMIHVybCA9IG51bGw7Ci0JCQlpZiAoZ2V0QnVuZGxlSWQoKSAhPSBudWxsKSB7Ci0JCQkJQnVuZGxlW10gYnVuZGxlcyA9IFBsYXRmb3JtLmdldEJ1bmRsZXMoZ2V0QnVuZGxlSWQoKSwgZ2V0QnVuZGxlVmVyc2lvbigpKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlVmVyc2lvbihidW5kbGVzLCBnZXRCdW5kbGVWZXJzaW9uKCkpOwotCQkJCXVybCA9IGJ1bmRsZS5nZXRFbnRyeShnZXRQYXRoKCkpOwotCQkJCXVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZGF0YSBhcmNoaXZlIHVzZWQgc28gZ2V0IHRoZSB1cmwgb2YgdGhlIHJ1bnRpbWUgYXJjaGl2ZSBmcm9tIGluc2lkZSB0aGUgZmVhdHVyZQotCQkJCXVybCA9IG5ldyBGaWxlKGdldEZlYXR1cmVBcmNoaXZlUGF0aCgpKS50b1VSTCgpOwotCQkJfQotCQkJCi0JCQkvLyB1bnppcCBmcm9tIGJ1bmRsZSBpbnRvIHBhdGgKLQkJCUlucHV0U3RyZWFtIGluID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCXVuemlwKGluLCBwYXRoLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHVuemlwcGluZyBydW50aW1lIiwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9ySW5zdGFsbGluZ1NlcnZlciwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBlKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW56aXAoSW5wdXRTdHJlYW0gaW4sIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gdW56aXAgZnJvbSBidW5kbGUgaW50byBwYXRoCi0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW4pOwotCQlaaXBJbnB1dFN0cmVhbSB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0oYmluKTsKLQkJWmlwRW50cnkgZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCk7Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4MTkyXTsKLQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCQkJbW9uaXRvci5zZXRUYXNrTmFtZSgiVW56aXBwaW5nOiAiICsgbmFtZSk7Ci0JCQkKLQkJCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJcGF0aC5hcHBlbmQobmFtZSkudG9GaWxlKCkubWtkaXJzKCk7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGguYXBwZW5kKG5hbWUpLnRvRmlsZSgpKTsKLQkJCQlpbnQgciA9IHppbi5yZWFkKGJ1Zik7Ci0JCQkJd2hpbGUgKHIgPj0gMCkgewotCQkJCQlmb3V0LndyaXRlKGJ1ZiwgMCwgcik7Ci0JCQkJCXIgPSB6aW4ucmVhZChidWYpOwotCQkJCX0KLQkJCX0KLQkJCXppbi5jbG9zZUVudHJ5KCk7Ci0JCQllbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKTsKLQkJfQotCQl6aW4uY2xvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlQXJjaGl2ZVBhdGgoKSB7Ci0JCVN0cmluZyBmZWF0dXJlID0gZ2V0RmVhdHVyZUlkKCkgKyAiXyIgKyBnZXRGZWF0dXJlVmVyc2lvbigpOwotCQlTdHJpbmcgcGxhdGZvcm1Mb2MgPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCXJldHVybiBwbGF0Zm9ybUxvYy5jb25jYXQoRmlsZS5zZXBhcmF0b3IgKyBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIGZlYXR1cmUgKyBGaWxlLnNlcGFyYXRvciArIGdldFBhdGgoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJJbnN0YWxsYWJsZVJ1bnRpbWVbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlUnVudGltZTIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlUnVudGltZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiMzFiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVJ1bnRpbWUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLnRhci5UYXJFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwudGFyLlRhcklucHV0U3RyZWFtOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlUnVudGltZTIgaW1wbGVtZW50cyBJSW5zdGFsbGFibGVSdW50aW1lIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgYnl0ZVtdIEJVRkZFUiA9IG51bGw7Ci0KLQlwdWJsaWMgSW5zdGFsbGFibGVSdW50aW1lMihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXJjaGl2ZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFyY2hpdmVVcmwoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImFyY2hpdmVVcmwiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZVBhdGgoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImFyY2hpdmVQYXRoIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpY2Vuc2VVUkwoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImxpY2Vuc2VVcmwiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbGFibGVSdW50aW1lI2dldExpY2Vuc2UoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpY2Vuc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBsaWNlbnNlVVJMID0gZ2V0TGljZW5zZVVSTCgpOwotCQkJaWYgKGxpY2Vuc2VVUkwgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJdXJsID0gbmV3IFVSTChsaWNlbnNlVVJMKTsKLQkJCUlucHV0U3RyZWFtIGluID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCWNvcHkoaW4sIG91dCk7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgbG9hZGluZyBsaWNlbnNlIiwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9ySW5zdGFsbGluZ1NlcnZlciwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxhYmxlUnVudGltZSNpbnN0YWxsKElQYXRoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoZmluYWwgSVBhdGggcGF0aCkgewotCQlKb2IgaW5zdGFsbFJ1bnRpbWVKb2IgPSBuZXcgSm9iKE1lc3NhZ2VzLmpvYkluc3RhbGxpbmdSdW50aW1lKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJCXJldHVybiBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELmVxdWFscyhmYW1pbHkpOwotCQkJfQotCQkJCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5zdGFsbChwYXRoLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCXJldHVybiBjZS5nZXRTdGF0dXMoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCQotCQlpbnN0YWxsUnVudGltZUpvYi5zY2hlZHVsZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5KElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoQlVGRkVSID09IG51bGwpCi0JCQlCVUZGRVIgPSBuZXcgYnl0ZVs4MTkyXTsKLQkJaW50IHIgPSBpbi5yZWFkKEJVRkZFUik7Ci0JCXdoaWxlIChyID49IDApIHsKLQkJCW91dC53cml0ZShCVUZGRVIsIDAsIHIpOwotCQkJciA9IGluLnJlYWQoQlVGRkVSKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbGFibGVSdW50aW1lI2luc3RhbGwoSVBhdGgsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCUZpbGUgdGVtcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKGdldEFyY2hpdmVVcmwoKSk7Ci0JCQl0ZW1wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgicnVudGltZSIsICIiKTsKLQkJCXRlbXAuZGVsZXRlT25FeGl0KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBjcmVhdGluZyB1cmwgYW5kIHRlbXAgZmlsZSIsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9ySW5zdGFsbGluZ1NlcnZlciwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBlKSk7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSB1cmwuZ2V0UGF0aCgpOwotCQkKLQkJLy8gZG93bmxvYWQKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIGluID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCWZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wKTsKLQkJCWNvcHkoaW4sIGZvdXQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIGRvd25sb2FkaW5nIHJ1bnRpbWUiLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckluc3RhbGxpbmdTZXJ2ZXIsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZm91dCAhPSBudWxsKQotCQkJCQlmb3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJCi0JCUZpbGVJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGVtcCk7Ci0JCQlpZiAobmFtZS5lbmRzV2l0aCgiemlwIikpCi0JCQkJdW56aXAoaW4sIHBhdGgsIG1vbml0b3IpOwotCQkJZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgidGFyIikpCi0JCQkJdW50YXIoaW4sIHBhdGgsIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgdW5jb21wcmVzc2luZyBydW50aW1lIiwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JJbnN0YWxsaW5nU2VydmVyLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksIGUpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbnppcCB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIGluCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgdW56aXAoSW5wdXRTdHJlYW0gaW4sIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGFyY2hpdmVQYXRoID0gZ2V0QXJjaGl2ZVBhdGgoKTsKLQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbik7Ci0JCVppcElucHV0U3RyZWFtIHppbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShiaW4pOwotCQlaaXBFbnRyeSBlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKTsKLQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCQkJbW9uaXRvci5zZXRUYXNrTmFtZSgiVW56aXBwaW5nOiAiICsgbmFtZSk7Ci0JCQlpZiAoYXJjaGl2ZVBhdGggIT0gbnVsbCAmJiBuYW1lLnN0YXJ0c1dpdGgoYXJjaGl2ZVBhdGgpKSB7Ci0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGFyY2hpdmVQYXRoLmxlbmd0aCgpKTsKLQkJCQlpZiAobmFtZS5sZW5ndGgoKSA+IDEpCi0JCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKLQkJCX0KLQkJCQotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKQotCQkJCQlwYXRoLmFwcGVuZChuYW1lKS50b0ZpbGUoKS5ta2RpcnMoKTsKLQkJCQllbHNlIHsKLQkJCQkJRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aC5hcHBlbmQobmFtZSkudG9GaWxlKCkpOwotCQkJCQljb3B5KHppbiwgZm91dCk7Ci0JCQkJCWZvdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQl6aW4uY2xvc2VFbnRyeSgpOwotCQkJZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCk7Ci0JCX0KLQkJemluLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogVW50YXIgdGhlIGlucHV0IHN0cmVhbSBpbnRvIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW50YXIoSW5wdXRTdHJlYW0gaW4sIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGFyY2hpdmVQYXRoID0gZ2V0QXJjaGl2ZVBhdGgoKTsKLQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbik7Ci0JCVRhcklucHV0U3RyZWFtIHppbiA9IG5ldyBUYXJJbnB1dFN0cmVhbShiaW4pOwotCQlUYXJFbnRyeSBlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKTsKLQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCQkJbW9uaXRvci5zZXRUYXNrTmFtZSgiVW50YXJyaW5nOiAiICsgbmFtZSk7Ci0JCQlpZiAoYXJjaGl2ZVBhdGggIT0gbnVsbCAmJiBuYW1lLnN0YXJ0c1dpdGgoYXJjaGl2ZVBhdGgpKSB7Ci0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGFyY2hpdmVQYXRoLmxlbmd0aCgpKTsKLQkJCQlpZiAobmFtZS5sZW5ndGgoKSA+IDEpCi0JCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKLQkJCX0KLQkJCQotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWlmIChlbnRyeS5nZXRGaWxlVHlwZSgpID09IFRhckVudHJ5LkRJUkVDVE9SWSkKLQkJCQkJcGF0aC5hcHBlbmQobmFtZSkudG9GaWxlKCkubWtkaXJzKCk7Ci0JCQkJZWxzZSB7Ci0JCQkJCUZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGguYXBwZW5kKG5hbWUpLnRvRmlsZSgpKTsKLQkJCQkJY29weSh6aW4sIGZvdXQpOwotCQkJCQlmb3V0LmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJemluLmNsb3NlKCk7Ci0JCQllbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKTsKLQkJfQotCQl6aW4uY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkluc3RhbGxhYmxlUnVudGltZTJbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDkzYTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVVSTEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLkluc3RhbGxDb21tYW5kOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlU2VydmVyIGltcGxlbWVudHMgSUluc3RhbGxhYmxlU2VydmVyIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JcHVibGljIEluc3RhbGxhYmxlU2VydmVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZW5kb3IoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgdmVuZG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpOwotCQkJaWYgKHZlbmRvciAhPSBudWxsKQotCQkJCXJldHVybiB2ZW5kb3I7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gTWVzc2FnZXMuZGVmYXVsdFZlbmRvcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgdmVyc2lvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIik7Ci0JCQlpZiAodmVyc2lvbiAhPSBudWxsKQotCQkJCXJldHVybiB2ZXJzaW9uOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIE1lc3NhZ2VzLmRlZmF1bHRWZXJzaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZVZlcnNpb24oKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImZlYXR1cmVWZXJzaW9uIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVJZCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZmVhdHVyZUlkIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZyb21TaXRlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJmZWF0dXJlU2l0ZSIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsYWJsZVNlcnZlciNnZXRMaWNlbnNlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWNlbnNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgZmVhdHVyZUlkID0gZ2V0RmVhdHVyZUlkKCk7Ci0JCVN0cmluZyBmZWF0dXJlVmVyc2lvbiA9IGdldEZlYXR1cmVWZXJzaW9uKCk7Ci0JCVN0cmluZyBmcm9tU2l0ZSA9IGdldEZyb21TaXRlKCk7Ci0JCQotCQlpZiAoZmVhdHVyZUlkID09IG51bGwgfHwgZmVhdHVyZVZlcnNpb24gPT0gbnVsbCB8fCBmcm9tU2l0ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJU2l0ZSBzaXRlID0gSW5zdGFsbGFibGVSdW50aW1lLmdldFNpdGUoZnJvbVNpdGUsIG1vbml0b3IpOwotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlUmVmcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUmVmcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHZlciA9IGZlYXR1cmVSZWZzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQkJaW50IGluZCA9IHZlci5pbmRleE9mKCJfIik7Ci0JCQlpZiAoaW5kID49IDApCi0JCQkJdmVyID0gdmVyLnN1YnN0cmluZyhpbmQrMSk7Ci0JCQlpZiAoZmVhdHVyZUlkLmVxdWFscyhmZWF0dXJlUmVmc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKSAmJiBmZWF0dXJlVmVyc2lvbi5lcXVhbHModmVyKSkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlUmVmc1tpXS5nZXRGZWF0dXJlKG1vbml0b3IpOwotCQkJCUlVUkxFbnRyeSBsaWNlbnNlID0gZmVhdHVyZS5nZXRMaWNlbnNlKCk7Ci0JCQkJaWYgKGxpY2Vuc2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGxpY2Vuc2UuZ2V0QW5ub3RhdGlvbigpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdHJpbmcgZmVhdHVyZUlkID0gZ2V0RmVhdHVyZUlkKCk7Ci0JCVN0cmluZyBmZWF0dXJlVmVyc2lvbiA9IGdldEZlYXR1cmVWZXJzaW9uKCk7Ci0JCVN0cmluZyBmcm9tU2l0ZSA9IGdldEZyb21TaXRlKCk7Ci0JCQotCQlpZiAoZmVhdHVyZUlkID09IG51bGwgfHwgZmVhdHVyZVZlcnNpb24gPT0gbnVsbCB8fCBmcm9tU2l0ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQltb25pdG9yLmJlZ2luVGFzaygiU2VhcmNoaW5nICIgKyBmcm9tU2l0ZSwgMTAwKTsKLQkJaW50IG1pcnJvciA9IDA7Ci0JCUlTaXRlIHNpdGUgPSBJbnN0YWxsYWJsZVJ1bnRpbWUuZ2V0U2l0ZShmcm9tU2l0ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgNTApKTsKLQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlmcm9tU2l0ZSA9IEluc3RhbGxhYmxlUnVudGltZS5nZXRNaXJyb3IoZnJvbVNpdGUsIHNpdGUsIG1pcnJvcik7Ci0JCQotCQlWZXJzaW9uIGxhdGVzdFZlcnNpb24gPSBuZXcgVmVyc2lvbihmZWF0dXJlVmVyc2lvbik7Ci0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBsYXN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhmZWF0dXJlSWQpKSB7Ci0JCQkJCVN0cmluZyB2ZXIgPSBmZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCQkJaW50IGluZCA9IHZlci5pbmRleE9mKCJfIik7Ci0JCQkJCWlmIChpbmQgPj0gMCkKLQkJCQkJCXZlciA9IHZlci5zdWJzdHJpbmcoaW5kKzEpOwotCQkJCQlWZXJzaW9uIG5leHRDYW5kID0gbmV3IFZlcnNpb24odmVyKTsKLQkJCQkJaWYgKG5leHRDYW5kLmNvbXBhcmVUbyhsYXRlc3RWZXJzaW9uKSA+PSAwKSB7Ci0JCQkJCQlsYXRlc3RWZXJzaW9uID0gbmV4dENhbmQ7Ci0JCQkJCQlsYXN0ID0gZmVhdHVyZXNbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobGFzdCAhPSBudWxsKQotCQkJCXJldHVybiBsYXN0LmdldEZlYXR1cmUoUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgNTApKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHNlYXJjaGluZyBmb3IgbGF0ZXN0IGZlYXR1cmUgdmVyc2lvbiIsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsYWJsZVNlcnZlciNpbnN0YWxsKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9IGdldEZlYXR1cmVJZCgpOwotCQlTdHJpbmcgZmVhdHVyZVZlcnNpb24gPSBnZXRGZWF0dXJlVmVyc2lvbigpOwotCQlTdHJpbmcgZnJvbVNpdGUgPSBnZXRGcm9tU2l0ZSgpOwotCQkKLQkJaWYgKGZlYXR1cmVJZCA9PSBudWxsIHx8IGZlYXR1cmVWZXJzaW9uID09IG51bGwgfHwgZnJvbVNpdGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWludCBtaXJyb3IgPSAwOwotCQlJU2l0ZSBzaXRlID0gSW5zdGFsbGFibGVSdW50aW1lLmdldFNpdGUoZnJvbVNpdGUsIG1vbml0b3IpOwotCQlmcm9tU2l0ZSA9IEluc3RhbGxhYmxlUnVudGltZS5nZXRNaXJyb3IoZnJvbVNpdGUsIHNpdGUsIG1pcnJvcik7Ci0JCWZlYXR1cmVWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbihzaXRlLCBmZWF0dXJlVmVyc2lvbiwgZmVhdHVyZUlkKTsKLQkJCi0JCWJvb2xlYW4gY29tcGxldGUgPSBmYWxzZTsKLQkJd2hpbGUgKCFjb21wbGV0ZSkgewotCQkJdHJ5IHsKLQkJCQlJbnN0YWxsQ29tbWFuZCBjb21tYW5kID0gbmV3IEluc3RhbGxDb21tYW5kKGZlYXR1cmVJZCwgZmVhdHVyZVZlcnNpb24sIGZyb21TaXRlLCBudWxsLCAiZmFsc2UiKTsKLQkJCQlib29sZWFuIGIgPSBjb21tYW5kLnJ1bihtb25pdG9yKTsKLQkJCQlpZiAoIWIpCi0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJCQlNZXNzYWdlcy5lcnJvckluc3RhbGxpbmdTZXJ2ZXJGZWF0dXJlLCBudWxsKSk7Ci0JCQkJLy9jb21tYW5kLmFwcGx5Q2hhbmdlc05vdygpOwotCQkJfSBjYXRjaCAoQ29ubmVjdEV4Y2VwdGlvbiBjZSkgewotCQkJCW1pcnJvcisrOwotCQkJCWZyb21TaXRlID0gSW5zdGFsbGFibGVSdW50aW1lLmdldE1pcnJvcihmcm9tU2l0ZSwgc2l0ZSwgbWlycm9yKTsKLQkJCQlpZiAoZnJvbVNpdGUgPT0gbnVsbCkKLQkJCQkJY29tcGxldGUgPSB0cnVlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBpbnN0YWxsaW5nIGZlYXR1cmUiLCBlKTsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckluc3RhbGxpbmdTZXJ2ZXIsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwgZSkpOwotCQkJfQotCQl9Ci0JCQotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYXRlc3RWZXJzaW9uKElTaXRlIHNpdGUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgZmVhdHVyZUlkKSB7Ci0JCVZlcnNpb24gbGF0ZXN0VmVyc2lvbiA9IG5ldyBWZXJzaW9uKHZlcnNpb24pOwotCQl0cnkgewotCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGZlYXR1cmVJZCkpIHsKLQkJCQkJU3RyaW5nIHZlciA9IGZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQkJCQlpbnQgaW5kID0gdmVyLmluZGV4T2YoIl8iKTsKLQkJCQkJaWYgKGluZCA+PSAwKQotCQkJCQkJdmVyID0gdmVyLnN1YnN0cmluZyhpbmQrMSk7Ci0JCQkJCVZlcnNpb24gbmV4dENhbmQgPSBuZXcgVmVyc2lvbih2ZXIpOwotCQkJCQlpZiAobmV4dENhbmQuY29tcGFyZVRvKGxhdGVzdFZlcnNpb24pID4gMCkgewotCQkJCQkJbGF0ZXN0VmVyc2lvbiA9IG5leHRDYW5kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc2VhcmNoaW5nIGZvciBsYXRlc3QgZmVhdHVyZSB2ZXJzaW9uIiwgZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBsYXRlc3RWZXJzaW9uLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJJbnN0YWxsYWJsZVNlcnZlclsiICsgZ2V0SWQoKSArICIsICIgKyBnZXROYW1lKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0xhdW5jaGFibGVBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9MYXVuY2hhYmxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTE4ODY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0xhdW5jaGFibGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoYWJsZUFkYXB0ZXIgaW1wbGVtZW50cyBJTGF1bmNoYWJsZUFkYXB0ZXIgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogTGF1bmNoYWJsZUFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBMYXVuY2hhYmxlQWRhcHRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgTGF1bmNoYWJsZUFkYXB0ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbGF0aXZlIHByaW9yaXR5IG9mIHRoaXMgYWRhcHRlci4KLQkgKgotCSAqIEByZXR1cm4gYSBwcmlvcml0eQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgicHJpb3JpdHkiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXB1YmxpYyBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIGdldERlbGVnYXRlKCkgewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUiICsgdG9TdHJpbmcoKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUxhdW5jaGFibGVBZGFwdGVyI2dldExhdW5jaGFibGUoSVNlcnZlciwgSU1vZHVsZUFydGlmYWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF1bmNoYWJsZShJU2VydmVyIHNlcnZlciwgSU1vZHVsZUFydGlmYWN0IG9iamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuZ2V0TGF1bmNoYWJsZShzZXJ2ZXIsIG9iamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXRocm93IGNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJMYXVuY2hhYmxlQWRhcHRlclsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzhkNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFRyYW5zbGF0ZWQgbWVzc2FnZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJ1bnRpbWVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRHVwbGljYXRlUnVudGltZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTYXZpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JMb2FkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ2Fubm90QWRkTW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRWZW5kb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUGVyZm9ybWluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGluZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFNlcnZlclByb2plY3ROYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRSdW50aW1lTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0UnVudGltZU5hbWUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJOYW1lMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0U2VydmVyTmFtZTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFNlcnZlck5hbWU0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tNb2RpZnlNb2R1bGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yV29ya2luZ0NvcHlUaW1lc3RhbXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoU3RhcnRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoTm9SdW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaE5vQ29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vQ29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoaW5nU3RhdHVzSW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoaW5nU3RhdHVzV2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoaW5nU3RhdHVzRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hpbmdTdG9wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hpbmdNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaGVkTW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3RhcnRUaW1lb3V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3RhcnRGYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTdG9wRmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUmVzdGFydEZhaWxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1vZHVsZVJlc3RhcnRGYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnN0YWxsaW5nU2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW5zdGFsbGluZ1NlcnZlckZlYXR1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZXN0YXJ0TW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhblN0YXJ0RXJyb3JTdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckxhdW5jaE1vZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZXN0YXJ0Tm90U3RhcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclN0b3BBbHJlYWR5U3RvcHBlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2R1bGVUeXBlVW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqb2JTdGFydGluZ1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqb2JTdG9wcGluZ1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqb2JSZXN0YXJ0aW5nU2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvYlVwZGF0ZVNlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqb2JJbnN0YWxsaW5nUnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdBZGFwdGVyOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ29weWluZ0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEZWxldGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1rZGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUmVhZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNyZWF0aW5nWmlwRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclJlbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vdEFEaXJlY3Rvcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vUnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckZhY2V0OwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOTZjMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFRhc2tzIChwcm9ncmVzcyBtb25pdG9ycykgLS0tLS0tLS0tLS0tLS0tCi1zYXZpbmdUYXNrPVNhdmluZyB7MH0KLWRlbGV0aW5nVGFzaz1EZWxldGluZyB7MH0KLQotdGFza1BlcmZvcm1pbmc9UGVyZm9ybWluZyBUYXNrcwotdGFza01vZGlmeU1vZHVsZXM9QWRkaW5nIGFuZC9vciByZW1vdmluZyBwcm9qZWN0cy4KLQotcHVibGlzaGluZz1QdWJsaXNoaW5nIHRvIHswfS4uLgotcHVibGlzaGluZ1N0YXR1c0luZm89UHVibGlzaGluZyBjb21wbGV0ZWQgd2l0aCBpbmZvcm1hdGlvbgotcHVibGlzaGluZ1N0YXR1c1dhcm5pbmc9UHVibGlzaGluZyBjb21wbGV0ZWQgd2l0aCBhIHdhcm5pbmcKLXB1Ymxpc2hpbmdTdGF0dXNFcnJvcj1QdWJsaXNoaW5nIGZhaWxlZAotcHVibGlzaGluZ1N0b3A9RGlzY29ubmVjdGluZyBmcm9tIHNlcnZlcgotCi1wdWJsaXNoaW5nTW9kdWxlPVB1Ymxpc2hpbmc6IHswfQotcHVibGlzaGVkTW9kdWxlPXswfSBwdWJsaXNoZWQgc3VjY2Vzc2Z1bGx5Ci0KLWpvYlN0YXJ0aW5nU2VydmVyPVN0YXJ0aW5nIHswfQotam9iU3RvcHBpbmdTZXJ2ZXI9U3RvcHBpbmcgezB9Ci1qb2JSZXN0YXJ0aW5nU2VydmVyPVJlc3RhcnRpbmcgezB9Ci1qb2JVcGRhdGVTZXJ2ZXI9VXBkYXRpbmcgc3RhdHVzIGZvciB7MH0uLi4KLWpvYkluc3RhbGxpbmdSdW50aW1lPUluc3RhbGxpbmcgc2VydmVyIHJ1bnRpbWUgZW52aXJvbm1lbnQKLQotIyAtLS0tLS0tLS0tLS0tLS0gTWlzYyBVSSAtLS0tLS0tLS0tLS0tLS0KLQotIyBFcnJvciBNZXNzYWdlcwotZXJyb3JQdWJsaXNoaW5nPUNvdWxkIG5vdCBwdWJsaXNoIHRvIHRoZSBzZXJ2ZXIuCi1lcnJvck5vQ29uZmlndXJhdGlvbj1UaGUgc2VydmVyIGhhcyBubyBjb25maWd1cmF0aW9uLgotZXJyb3JMb2FkaW5nPUVycm9yIGxvYWRpbmcgZnJvbSB7MH0uCi1lcnJvclNhdmluZz1Db3VsZCBub3Qgc2F2ZSB0byB7MH0uCi1lcnJvck1vZHVsZVJlc3RhcnRGYWlsZWQ9Q291bGQgbm90IHJlc3RhcnQgdGhlIG1vZHVsZS4KLWVycm9yV29ya2luZ0NvcHlUaW1lc3RhbXA9Q291bGQgbm90IHNhdmUgYmVjYXVzZSB0aGUgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgc3RhcnQgb2YgZWRpdGluZy4KLWVycm9yUnVudGltZU5hbWU9RW50ZXIgYSBuYW1lIGZvciB0aGUgcnVudGltZSBlbnZpcm9ubWVudC4KLWVycm9yRHVwbGljYXRlUnVudGltZU5hbWU9VGhlIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuIFNwZWNpZnkgYSBkaWZmZXJlbnQgbmFtZS4KLWVycm9yU3RhcnRUaW1lb3V0PVNlcnZlciB7MH0gd2FzIHVuYWJsZSB0byBzdGFydCB3aXRoaW4gezF9IHNlY29uZHMuIElmIHRoZSBzZXJ2ZXIgcmVxdWlyZXMgbW9yZSB0aW1lLCB0cnkgaW5jcmVhc2luZyB0aGUgdGltZW91dCBpbiB0aGUgc2VydmVyIGVkaXRvci4KLWVycm9yU3RhcnRGYWlsZWQ9U2VydmVyIHswfSBmYWlsZWQgdG8gc3RhcnQuCi1lcnJvclN0b3BGYWlsZWQ9U2VydmVyIHswfSBmYWlsZWQgdG8gc3RvcC4KLWVycm9yUmVzdGFydEZhaWxlZD1TZXJ2ZXIgezB9IGZhaWxlZCB0byByZXN0YXJ0LgotZXJyb3JDYW5ub3RBZGRNb2R1bGU9VGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHZlcnNpb24gezF9IG9mIHRoZSB7MH0gc3BlY2lmaWNhdGlvbi4KLWVycm9ySW5zdGFsbGluZ1NlcnZlcj1FcnJvciBvY2N1cnJlZCBpbnN0YWxsaW5nIHNlcnZlcjogezB9Ci1lcnJvckluc3RhbGxpbmdTZXJ2ZXJGZWF0dXJlPUNvdWxkIG5vdCBkb3dubG9hZCBhbmQgaW5zdGFsbCB1cGRhdGUgZmVhdHVyZS4KLQotIyBEZWZhdWx0IHNlcnZlciBjcmVhdGlvbiBuYW1lcwotIyB7MH0gd2lsbCBiZSByZXBsYWNlZCBieSBhIG51bWJlciBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhbHJlYWR5IGJlaW5nIHVzZWQKLWRlZmF1bHRTZXJ2ZXJQcm9qZWN0TmFtZT1TZXJ2ZXJzezB9Ci1kZWZhdWx0UnVudGltZU5hbWU9ezB9Ci1kZWZhdWx0UnVudGltZU5hbWUyPXswfSAoezF9KQotZGVmYXVsdFNlcnZlck5hbWU9ezB9IGF0IHsxfQotZGVmYXVsdFNlcnZlck5hbWUyPXswfSBhdCB7MX0gKHsyfSkKLWRlZmF1bHRTZXJ2ZXJOYW1lMz17MH0KLWRlZmF1bHRTZXJ2ZXJOYW1lND17MH0gKHsxfSkKLQotIyBVc2VkIHdoZW4gYSBuYW1lIGNhbid0IGJlIGZvdW5kCi1kZWZhdWx0VmVuZG9yPUJhc2ljCi1kZWZhdWx0VmVyc2lvbj1Ob25lCi1tb2R1bGVUeXBlVW5rbm93bj1Vbmtub3duIG1vZHVsZQotCi1jYW5TdGFydEVycm9yU3RhdGU9VGhlIHNlcnZlciBjYW5ub3Qgc3RhcnQgYmVjYXVzZSBpdCBpcyBjdXJyZW50bHkgc3RhcnRpbmcgb3Igc3RvcHBpbmcuIFdhaXQgZm9yIHRoZSBjdXJyZW50IG9wZXJhdGlvbiB0byBjb21wbGV0ZS4KLWVycm9yTGF1bmNoTW9kZT1UaGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGdpdmVuIGxhdW5jaCBtb2RlLgotZXJyb3JSZXN0YXJ0Tm90U3RhcnRlZD1DYW5ub3QgcmVzdGFydCB0aGUgc2VydmVyIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBydW5uaW5nLgotZXJyb3JQdWJsaXNoU3RhcnRpbmc9Q2Fubm90IHB1Ymxpc2ggdG8gdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIGN1cnJlbnRseSBzdGFydGluZyBvciBzdG9wcGluZy4KLWVycm9yUHVibGlzaE5vUnVudGltZT1DYW5ub3QgcHVibGlzaCB0byB0aGUgc2VydmVyIGJlY2F1c2UgaXQgaXMgbWlzc2luZyBpdHMgcnVudGltZSBlbnZpcm9ubWVudC4KLWVycm9yUHVibGlzaE5vQ29uZmlndXJhdGlvbj1DYW5ub3QgcHVibGlzaCB0byB0aGUgc2VydmVyIGJlY2F1c2UgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbWlzc2luZy4KLWVycm9yU3RvcEFscmVhZHlTdG9wcGVkPVRoZSBzZXJ2ZXIgY2Fubm90IGJlIHN0b3BwZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHN0b3BwZWQgb3Igc3RvcHBpbmcuCi1lcnJvclJlc3RhcnRNb2R1bGU9VGhlIG1vZHVsZSBjYW5ub3QgYmUgcmVzdGFydGVkLgotZXJyb3JNaXNzaW5nQWRhcHRlcj1Db3VsZCBub3QgbG9hZCBzZXJ2ZXIgYWRhcHRlci4gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZS4KLQotCi1lcnJvckNvcHlpbmdGaWxlPUVycm9yIGNvcHlpbmcgZmlsZSB7MH06IHsxfQotZXJyb3JEZWxldGluZz1Db3VsZCBub3QgZGVsZXRlIHswfS4gTWF5IGJlIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuCi1lcnJvck1rZGlyPUNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5IHswfS4KLWNvcHlpbmdUYXNrPUNvcHlpbmcgZnJvbSB7MH0gdG8gezF9Ci1lcnJvclJlYWRpbmc9RXJyb3IgcmVhZGluZyBmaWxlIHswfQotZXJyb3JDcmVhdGluZ1ppcEZpbGU9RXJyb3IgY3JlYXRpbmcgemlwIGZpbGUgezB9OiB7MX0KLWVycm9yUmVuYW1lPUNvdWxkIG5vdCByZXBsYWNlIHdpdGggdGVtcCBmaWxlIHswfS4KLWVycm9yTm90QURpcmVjdG9yeT1Db3VsZCBub3QgZGVsZXRlIHswfSBzaW5jZSBpdCBpcyBub3QgYSBkaXJlY3RvcnkuCi0KLWVycm9yTm9SdW50aW1lPUNhbm5vdCB2ZXJpZnkgZmFjZXRzIGJlY2F1c2UgdGhlcmUgaXMgbm8gcnVudGltZSBlbnZpcm9ubWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci4KLWVycm9yRmFjZXQ9UHJvamVjdCBmYWNldCB7MH0gdmVyc2lvbiB7MX0gaXMgbm90IHN1cHBvcnRlZC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjFmZjk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZURlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZSBpbXBsZW1lbnRzIElNb2R1bGUgewotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBNb2R1bGVGYWN0b3J5IGZhY3Rvcnk7Ci0JcHJvdGVjdGVkIE1vZHVsZVR5cGUgbW9kdWxlVHlwZTsKLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQlwcm90ZWN0ZWQgTW9kdWxlRGVsZWdhdGUgZGVsZWdhdGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDI7Ci0KLQkvKioKLQkgKiBNb2R1bGUgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGZhY3RvcnkKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIHZlcnNpb24KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqLwotCXB1YmxpYyBNb2R1bGUoTW9kdWxlRmFjdG9yeSBmYWN0b3J5LCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24sIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5tb2R1bGVUeXBlID0gTW9kdWxlVHlwZS5nZXRNb2R1bGVUeXBlKHR5cGUsIHZlcnNpb24pOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQlpZDIgPSBmYWN0b3J5LmdldElkKCkgKyAiOiI7Ci0JCWVsc2UKLQkJCWlkMiA9ICI6IjsKLQkJaWQyICs9IGlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgbW9kdWxlLgotCSAqCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVybmFsIChwYXJ0aWFsKSBpZCBvZiB0aGlzIG1vZHVsZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHBhcnRpYWwgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEludGVybmFsSWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSB0eXBlCi0JICovCi0JcHVibGljIElNb2R1bGVUeXBlIGdldE1vZHVsZVR5cGUoKSB7Ci0JCXJldHVybiBtb2R1bGVUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtiZW5jaCBwcm9qZWN0IHRoYXQgdGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluLAotCSAqIG9yIG51bGwgaWYgdGhlIG1vZHVsZSBpcyBvdXRzaWRlIG9mIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvamVjdCB0aGF0IHRoZSBtb2R1bGUgaXMgY29udGFpbmVkIGluCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qCi0JICogQHNlZSBJTW9kdWxlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+TW9kdWxlRmFjdG9yeTwvY29kZT4gdGhhdCBjcmVhdGVkIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBmYWN0b3J5IHRoYXQgY3JlYXRlZCB0aGlzIG1vZHVsZQotCSAqLwotCXB1YmxpYyBNb2R1bGVGYWN0b3J5IGdldE1vZHVsZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCBNb2R1bGVEZWxlZ2F0ZSBnZXREZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCWRlbGVnYXRlID0gZmFjdG9yeS5nZXREZWxlZ2F0ZShtb25pdG9yKS5nZXRNb2R1bGVEZWxlZ2F0ZSh0aGlzKTsKLQkJCQkJZGVsZWdhdGUuaW5pdGlhbGl6ZSh0aGlzKTsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEVSRk9STUFOQ0UsICJNb2R1bGUuZ2V0RGVsZWdhdGUoKTogPCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICIgIiArIGZhY3RvcnkuZ2V0SWQoKSk7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlcyBvZiB0aGlzIG1vZHVsZS4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUobW9uaXRvcikuZ2V0Q2hpbGRNb2R1bGVzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIGdldENoaWxkTW9kdWxlcygpICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoaXMgbW9kdWxlLgotCSAqIDxwPgotCSAqIFtpc3N1ZTogQ29uamVjdHVyZTogRWFjaCBkaWZmZXJlbnQgdHlwZSBvZiBtb2R1bGUgcHJlc2NyaWJlcwotCSAqIGxlZ2FsIGFycmFuZ2VtZW50cyBvZiwgYW5kIHRoZSBzaWduaWZpY2FuY2Ugb2YsIHRoZSBmaWxlcyB3aXRoaW4KLQkgKiBpdC4gVGhpcyB3b3VsZCBiZSBzcGVsbGVkIG91dCBpbiB0aGUgc3BlYyBmb3IgdGhlIHBhcnRpY3VsYXIKLQkgKiBtb2R1bGUgdHlwZXMuCi0JICogVGhpcyB2YWxpZGF0ZSBvcGVyYXRpb24gaXMgc3VwcG9zZSB0byBjaGVjayB0aGUgYWN0dWFsCi0JICogYXJyYW5nZW1lbnQgb2YgZmlsZXMgaW4gdGhpcyBtb2R1bGUgdG8gc2VlIHdoZXRoZXIgdGhleQotCSAqIG1lZXQgZXhwZWN0YXRpb25zLgotCSAqIEl0J3MgYW4gb3BlbiBxdWVzdGlvbiBhcyB0byBob3cgInN0cmVudW91cyIgYSBjaGVjayB0aGlzCi0JICogaXMuXQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IE9sZCBjb21tZW50IHNhaWQ6ICJJZiB0aGVyZSBpcyBhbiBlcnJvcgotCSAqIHRoYXQgc2hvdWxkIGJsb2NrIHRoZSBzZXJ2ZXIgZnJvbSBzdGFydGluZyAoZS5nLiBtYWpvciBlcnJvcnMpCi0JICogaXQgc2hvdWxkIGJlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QuIFRoaXMgbWV0aG9kIGNhbiBhbHNvIGJlIHVzZWQgdG8KLQkgKiByZXR1cm4gd2FybmluZyBmb3Igc3VjaCB0aGluZ3MgYXMgYW4gb3BlbiAoYW5kIGRpcnR5KSBlZGl0b3IuIl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBBbGwgZXhpc3RpbmcgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgcmV0dXJuIG51bGwsCi0JICogd2hpY2ggaXMgaWxsZWdhbC5dCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogT2xkIGNvbW1lbnQgc2FpZDogIlJldHVybnMgYW4gSVN0YXR1cyB0aGF0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgb2JqZWN0IGNhbgotCSAqIGJlIHB1Ymxpc2hlZCB0byB0aGUgc2VydmVyLiIgU2luY2UgdGhlIHNhbWUgbW9kdWxlIGNhbgotCSAqIGJlIGFzc29jaWF0ZWQgd2l0aCBhbnkgbnVtYmVyIG9mIHNlcnZlcnMsICJ0aGUgc2VydmVyIiBpcwotCSAqIGlsbC1kZWZpbmVkLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBPbGQgY29tbWVudCBzYWlkOiAiU2hvdWxkIHJldHVybiBhbiBlcnJvciBpZiB0aGVyZQotCSAqIGlzIGEgbWFqb3IgcHJvYmxlbSB3aXRoIHRoZSByZXNvdXJjZXMsIG9yIGNhbiBiZSB1c2VkIHRvCi0JICogcmV0dXJuIHdhcm5pbmdzIG9uIHVuc2F2ZWQgZmlsZXMsIGV0Yy4iIEl0IGlzIHVzdWFsbHkKLQkgKiBkaWZmaWN1bHQgaW4gcHJpbmNpcGxlIGZvciBjb3JlLWxldmVsIGluZnJhc3RydWN0dXJlIHRvCi0JICogZGV0ZWN0IHdoZXRoZXIgdGhlcmUgYXJlIG9wZW4gZWRpdG9ycyB3aXRoIHVuc2F2ZWQgY2hhbmdlcy5dCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqICAgIHByb2dyZXNzIHJlcG9ydGluZyBpcyByZXF1aXJlZAotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgZ2l2ZW4KLQkgKiAgICBtb2R1bGUgaXMgdmFsaWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzCi0JICogICAgd3Jvbmcgd2l0aCBpdAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKG1vbml0b3IpLnZhbGlkYXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHZhbGlkYXRlKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2R1bGUjZ2V0QWRhcHRlcihDbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJaWYgKGFkYXB0ZXIuaXNJbnN0YW5jZShkZWxlZ2F0ZSkpCi0JCQkJcmV0dXJuIGRlbGVnYXRlOwotCQl9Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kdWxlI2xvYWRBZGFwdGVyKENsYXNzLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBPYmplY3QgbG9hZEFkYXB0ZXIoQ2xhc3MgYWRhcHRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldERlbGVnYXRlKG1vbml0b3IpOwotCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGRlbGVnYXRlKSkKLQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIodGhpcywgYWRhcHRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gdGhpcykKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSU1vZHVsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlJTW9kdWxlIG0gPSAoSU1vZHVsZSkgb2JqOwotCQlpZiAoIWlkMi5lcXVhbHMobS5nZXRJZCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBtLmdldFByb2plY3QoKSAhPSBudWxsICYmICFwcm9qZWN0LmVxdWFscyhtLmdldFByb2plY3QoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vaWYgKCFnZXRNb2R1bGVUeXBlKCkuZXF1YWxzKG0uZ2V0TW9kdWxlVHlwZSgpKSkKLQkJLy8JcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IHJlc3VsdCA9IGlkMi5oYXNoQ29kZSgpICsgMTc7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpCi0JCQlyZXN1bHQgKz0gcHJvamVjdC5oYXNoQ29kZSgpICogMzc7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUjaXNFeHRlcm5hbCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk1vZHVsZVsiICsgbmFtZSArICIsIiArIGlkMiArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlQXJ0aWZhY3RBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVBcnRpZmFjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkMzllOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVBcnRpZmFjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgRXhwcmVzc2lvbiBmQ29udGV4dHVhbExhdW5jaEV4cHIgPSBudWxsOwotCXByaXZhdGUgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBNb2R1bGVBcnRpZmFjdEFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIE1vZHVsZUFydGlmYWN0QWRhcHRlci4KLQkgKgotCSAqIEByZXR1cm4gYW4gaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcHJpb3JpdHkgb2YgdGhpcyBhZGFwdGVyLgotCSAqCi0JICogQHJldHVybiBhIHByaW9yaXR5Ci0JICovCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJwcmlvcml0eSIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBwbHVnaW4gdGhhdCBsb2FkZWQgdGhpcyBjbGFzcyBoYXMgYmVlbiBsb2FkZWQuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BsdWdpbkFjdGl2YXRlZCgpIHsKLQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QnVuZGxlKG5hbWUpLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGV4cHJlc3Npb24gdGhhdCByZXByZXNlbnRzIHRoZSBlbmFibGVtZW50IGxvZ2ljIGZvciB0aGUKLQkgKiBjb250ZXh0dWFsIGxhdW5jaCBlbGVtZW50IG9mIHRoaXMgbGF1bmNoIHNob3J0Y3V0IGRlc2NyaXB0aW9uIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiBAcmV0dXJuIGFuIGV2YWx1YXRhYmxlIGV4cHJlc3Npb24gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBjYW4ndCBiZQotCSAqICBjb252ZXJ0ZWQuIFJlYXNvbnMgaW5jbHVkZTogKGEpIG5vIGhhbmRsZXIgaXMgYXZhaWxhYmxlIHRvCi0JICogIGNvcGUgd2l0aCBhIGNlcnRhaW4gY29uZmlndXJhdGlvbiBlbGVtZW50IG9yIChiKSB0aGUgWE1MCi0JICogIGV4cHJlc3Npb24gdHJlZSBpcyBtYWxmb3JtZWQuCi0JICovCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZkNvbnRleHR1YWxMYXVuY2hFeHByID09IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFeHByZXNzaW9uVGFnTmFtZXMuRU5BQkxFTUVOVCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZW5hYmxlbWVudCA9IGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBlbGVtZW50c1swXSA6IG51bGw7IAotCi0JCQlpZiAoZW5hYmxlbWVudCAhPSBudWxsKQotCQkJCWZDb250ZXh0dWFsTGF1bmNoRXhwciA9IEV4cHJlc3Npb25Db252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLnBlcmZvcm0oZW5hYmxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0dWFsTGF1bmNoRXhwcjsKLQl9Ci0KLQkvKioKLQkgKiBFdmFsdWF0ZSB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiB3aXRoaW4gdGhlIGdpdmVuIGNvbnRleHQgYW5kIHJldHVybgotCSAqIHRoZSByZXN1bHQuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHJlc3VsdCBpcyBlaXRoZXIgVFJVRSBvciBOT1RfTE9BREVELgotCSAqIFRoaXMgYWxsb3dzIG9wdGltaXN0aWMgaW5jbHVzaW9uIG9mIHNob3J0Y3V0cyBiZWZvcmUgcGx1Z2lucyBhcmUgbG9hZGVkLgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGV4cCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwIHRoZSBlbmFibGVtZW50IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgZXZhbHVhdGlvbi4gVXN1YWxseSwgdGhlCi0JICogIHVzZXIncyBzZWxlY3Rpb24uCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBldmFsRW5hYmxlbWVudEV4cHJlc3Npb24oSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQsIEV4cHJlc3Npb24gZXhwKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoZXhwICE9IG51bGwpID8gKChleHAuZXZhbHVhdGUoY29udGV4dCkpICE9IEV2YWx1YXRpb25SZXN1bHQuRkFMU0UpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbiBFdmFsdWF0aW9uIGNvbnRleHQgd2l0aCBkZWZhdWx0IHZhcmlhYmxlID0gc2VsZWN0aW9uCi0JICovCi0JLypwcm90ZWN0ZWQgSUV2YWx1YXRpb25Db250ZXh0IGNyZWF0ZUNvbnRleHQoT2JqZWN0IG9iaikgewotCQlMaXN0IGxpc3QgPSBudWxsOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IERlYnVnVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkgICAgSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IHBhZ2UuZ2V0QWN0aXZlUGFydCgpOwotCQkJICAgIGlmIChhY3RpdmVQYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCSAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCSAgICAgICAgbGlzdC5hZGQoKChJRWRpdG9yUGFydClhY3RpdmVQYXJ0KS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCSAgICB9IGVsc2UgaWYgKGFjdGl2ZVBhcnQgIT0gbnVsbCkgewotCQkJICAgICAgICBJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IGFjdGl2ZVBhcnQuZ2V0U2l0ZSgpOwotCQkJICAgICAgICBpZiAoc2l0ZSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBzaXRlLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCSAgICAgICAgICAgIGxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7Ci0JCQkJCSAgICAgICAgfQotCSAgICAgICAgICAgICAgICAgICAgfQotCQkJICAgICAgICB9Ci0JCQkgICAgfQotCQkJfQotCQl9Ci0JCS8vIGNyZWF0ZSBhIGRlZmF1bHQgZXZhbHVhdGlvbiBjb250ZXh0IHdpdGggZGVmYXVsdCB2YXJpYWJsZQotCQkvLyBvZiB0aGUgdXNlciBzZWxlY3Rpb24gb3IgZWRpdG9yIGlucHV0Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJICAgIGxpc3QgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUlFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KG51bGwsIGxpc3QpOwotCQljb250ZXh0LmFkZFZhcmlhYmxlKCJzZWxlY3Rpb24iLCBsaXN0KTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfSovCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgZW5hYmxlZCBmb3IgdGhlIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqIGFuIG9iamVjdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZW5hYmxlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKE9iamVjdCBvYmopIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgb2JqKTsKLQkJY29udGV4dC5hZGRWYXJpYWJsZSgic2VsZWN0aW9uIiwgb2JqKTsKLQkJcmV0dXJuIGV2YWxFbmFibGVtZW50RXhwcmVzc2lvbihjb250ZXh0LCBnZXRDb250ZXh0dWFsTGF1bmNoRW5hYmxlbWVudEV4cHJlc3Npb24oKSk7Ci0JfQotCi0JcHVibGljIE1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIGdldERlbGVnYXRlKCkgewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCksIHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGVnYXRlTG9hZGVkKCkgewotCQlyZXR1cm4gKGRlbGVnYXRlICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSBhcnRpZmFjdHMuCi0JICogCi0JICogQHBhcmFtIG9iaiBhbiBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgYXJ0aWZhY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIElNb2R1bGVBcnRpZmFjdFtdIGdldE1vZHVsZUFydGlmYWN0cyhPYmplY3Qgb2JqKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5nZXRNb2R1bGVBcnRpZmFjdHMob2JqKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBhIHN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9kdWxlQXJ0aWZhY3RBZGFwdGVyWyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMDc3OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkludGVybmFsSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUZhY3RvcnlEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVGYWN0b3J5IGltcGxlbWVudHMgSU9yZGVyZWQgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHVibGljIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQlwcml2YXRlIExpc3Q8SU1vZHVsZVR5cGU+IG1vZHVsZVR5cGVzOwotCi0JLyoqCi0JICogTW9kdWxlRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIE1vZHVsZUZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGZhY3RvcnkuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5kZXggKG9yZGVyaW5nKSBvZiB0aGlzIHRhc2suCi0JICoKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgib3JkZXIiKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN1cHBvcnRlZCBtb2R1bGUgdHlwZXMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtb2R1bGUgdHlwZXMKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVR5cGVbXSBnZXRNb2R1bGVUeXBlcygpIHsKLQkJaWYgKG1vZHVsZVR5cGVzID09IG51bGwpCi0JCQltb2R1bGVUeXBlcyA9IFNlcnZlclBsdWdpbi5nZXRNb2R1bGVUeXBlcyhlbGVtZW50LmdldENoaWxkcmVuKCJtb2R1bGVUeXBlIikpOwotCQkKLQkJSU1vZHVsZVR5cGVbXSBtdCA9IG5ldyBJTW9kdWxlVHlwZVttb2R1bGVUeXBlcy5zaXplKCldOwotCQltb2R1bGVUeXBlcy50b0FycmF5KG10KTsKLQkJcmV0dXJuIG10OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1vZHVsZXMgZmFjdG9yeSBwcm9kdWNlcyBwcm9qZWN0IG1vZHVsZXMuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RNb2R1bGVGYWN0b3J5KCkgewotCQlyZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInByb2plY3RzIikpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTW9kdWxlRmFjdG9yeURlbGVnYXRlI2dldERlbGVnYXRlKCkKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmFjdG9yeURlbGVnYXRlIGdldERlbGVnYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlkZWxlZ2F0ZSA9IChNb2R1bGVGYWN0b3J5RGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQlJbnRlcm5hbEluaXRpYWxpemVyLmluaXRpYWxpemVNb2R1bGVGYWN0b3J5RGVsZWdhdGUoZGVsZWdhdGUsIHRoaXMsIG1vbml0b3IpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBFUkZPUk1BTkNFLCAiTW9kdWxlRmFjdG9yeS5nZXREZWxlZ2F0ZSgpOiA8IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIj4gIiArIGdldElkKCkpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSNnZXRNb2R1bGVzKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoKSB7Ci0JCXJldHVybiBnZXRNb2R1bGVzKG51bGwpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVGYWN0b3J5RGVsZWdhdGUjZ2V0TW9kdWxlcygpCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBnZXREZWxlZ2F0ZShtb25pdG9yKS5nZXRNb2R1bGVzKCk7Ci0JCQlpZiAoaGFzSW52YWxpZE1vZHVsZXMobW9kdWxlcykpCi0JCQkJbW9kdWxlcyA9IGZpbHRlcihtb2R1bGVzKTsKLQkJCXJldHVybiBtb2R1bGVzOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgdCk7Ci0JCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlRmFjdG9yeURlbGVnYXRlI2dldE1vZHVsZXMoSVByb2plY3QpCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBnZXREZWxlZ2F0ZShtb25pdG9yKS5nZXRNb2R1bGVzKHByb2plY3QpOwotCQkJaWYgKGhhc0ludmFsaWRNb2R1bGVzKG1vZHVsZXMpKQotCQkJCW1vZHVsZXMgPSBmaWx0ZXIobW9kdWxlcyk7Ci0JCQlyZXR1cm4gbW9kdWxlczsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOwotCQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSNmaW5kTW9kdWxlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZSBmaW5kTW9kdWxlKFN0cmluZyBpZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlJTW9kdWxlIG1vZHVsZSA9IGdldERlbGVnYXRlKG1vbml0b3IpLmZpbmRNb2R1bGUoaWQpOwotCQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJCi0JCQlnZXRNb2R1bGVUeXBlcygpOwotCQkJaWYgKCFtb2R1bGVUeXBlcy5jb250YWlucyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJcmV0dXJuIG1vZHVsZTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzSW52YWxpZE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZXMpIHsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWdldE1vZHVsZVR5cGVzKCk7Ci0JCQotCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKCFtb2R1bGVUeXBlcy5jb250YWlucyhtb2R1bGVzW2ldLmdldE1vZHVsZVR5cGUoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgSU1vZHVsZVtdIGZpbHRlcihJTW9kdWxlW10gbW9kdWxlcykgewotCQlpZiAobW9kdWxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG1vZHVsZXM7Ci0JCQotCQlnZXRNb2R1bGVUeXBlcygpOwotCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCQotCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSU1vZHVsZSBtID0gbW9kdWxlc1tpXTsKLQkJCWlmIChtb2R1bGVUeXBlcy5jb250YWlucyhtLmdldE1vZHVsZVR5cGUoKSkpCi0JCQkJbGlzdC5hZGQobSk7Ci0JCQllbHNlCi0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkludmFsaWQgbW9kdWxlIHJldHVybmVkIGZyb20gZmFjdG9yeSwgaWdub3JlZDogIiArIG0pOwotCQl9Ci0JCQotCQlJTW9kdWxlW10gbSA9IG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KG0pOwotCQlyZXR1cm4gbTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVGYWN0b3J5WyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTNkOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLk1vZHVsZUZpbGUgaW5zdGVhZAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlRmlsZSBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLk1vZHVsZUZpbGUgewotCXB1YmxpYyBNb2R1bGVGaWxlKElGaWxlIGZpbGUsIFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoKSB7Ci0JCXN1cGVyKGZpbGUsIG5hbWUsIHBhdGgpOwotCX0KLQotCXB1YmxpYyBNb2R1bGVGaWxlKFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoLCBsb25nIHN0YW1wKSB7Ci0JCXN1cGVyKG5hbWUsIHBhdGgsIHN0YW1wKTsKLQl9Ci0KLQlwdWJsaWMgTW9kdWxlRmlsZShGaWxlIGZpbGUsIFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoKSB7Ci0JCXN1cGVyKGZpbGUsIG5hbWUsIHBhdGgpOwotCX0KLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgdXNlIGFub3RoZXIgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZShJRmlsZSBmaWxlLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCwgbG9uZyBzdGFtcCkgewotCQlzdXBlcihmaWxlLCBuYW1lLCBwYXRoLCBzdGFtcCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZvbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZjdhZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Nb2R1bGVGb2xkZXIgaW5zdGVhZAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlRm9sZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTW9kdWxlRm9sZGVyIHsKLQlwdWJsaWMgTW9kdWxlRm9sZGVyKElDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCkgewotCQlzdXBlcihjb250YWluZXIsIG5hbWUsIHBhdGgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVLaW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYmJkYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlS2luZCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQlwdWJsaWMgTW9kdWxlS2luZChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pZCA9IGNlLmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJdGhpcy5uYW1lID0gY2UuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIE1vZHVsZUtpbmQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVUeXBlWyIgKyBpZCArICIsICIgKyBuYW1lICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMDI3OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBzdG9yZXMgcHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHNlcnZlciB0b29scy4KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVByb3BlcnRpZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfREFUQV9GSUxFID0gIm1vZHVsZXMueG1sIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgTW9kdWxlUHJvcGVydGllcyBpbnN0YW5jZTsKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBtb2R1bGVzOwotCi0JLyoqCi0JICogTW9kdWxlUHJvcGVydGllcyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlUHJvcGVydGllcygpIHsKLQkJc3VwZXIoKTsKLQkJbG9hZCgpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RhdGljIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBzdGF0aWMgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZHVsZVByb3BlcnRpZXMgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJbmV3IE1vZHVsZVByb3BlcnRpZXMoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGRhdGEuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWQoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgbW9kdWxlIGluZm8iKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChNT0RVTEVfREFUQV9GSUxFKS50b09TU3RyaW5nKCk7Ci0JCW1vZHVsZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJaWYgKCEobmV3IEZpbGUoZmlsZW5hbWUpLmV4aXN0cygpKSkKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQlJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhmaWxlbmFtZSk7Ci0JCQkKLQkJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvLmdldENoaWxkcmVuKCJtb2R1bGUiKTsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVN0cmluZyBtb2R1bGVJZCA9IGNoaWxkcmVuW2ldLmdldFN0cmluZygibW9kdWxlSWQiKTsKLQkJCQlTdHJpbmcgc2VydmVySWQgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoInNlcnZlcklkIik7Ci0JCQkJbW9kdWxlcy5wdXQobW9kdWxlSWQsIHNlcnZlcklkKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBzZXJ2ZXJzIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChNT0RVTEVfREFUQV9GSUxFKS50b09TU3RyaW5nKCk7Ci0JCQotCQl0cnkgewotCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoIm1vZHVsZXMiKTsKLQkJCQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIG1vZHVsZUlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZyBzZXJ2ZXJJZCA9IG1vZHVsZXMuZ2V0KG1vZHVsZUlkKTsKLQkJCQkKLQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoIm1vZHVsZSIpOwotCQkJCWNoaWxkLnB1dFN0cmluZygibW9kdWxlSWQiLCBtb2R1bGVJZCk7Ci0JCQkJY2hpbGQucHV0U3RyaW5nKCJzZXJ2ZXJJZCIsIHNlcnZlcklkKTsKLQkJCX0KLQkJCQotCQkJbWVtZW50by5zYXZlVG9GaWxlKGZpbGVuYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIHNlcnZlcnMiLCBlKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBTZXJ2ZXJDb3JlI2dldERlZmF1bHRTZXJ2ZXIoSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVNlcnZlciBnZXREZWZhdWx0U2VydmVyKElNb2R1bGUgbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCVN0cmluZyBzZXJ2ZXJJZCA9IG1vZHVsZXMuZ2V0KG1vZHVsZS5nZXRJZCgpKTsKLQkJaWYgKHNlcnZlcklkID09IG51bGwgfHwgc2VydmVySWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJZCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFNlcnZlckNvcmUjc2V0RGVmYXVsdFNlcnZlcihJTW9kdWxlLCBJU2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTZXJ2ZXIoSU1vZHVsZSBtb2R1bGUsIElTZXJ2ZXIgc2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJU3RyaW5nIG5ld1NlcnZlcklkID0gbnVsbDsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJbmV3U2VydmVySWQgPSBzZXJ2ZXIuZ2V0SWQoKTsKLQkJCi0JCVN0cmluZyBzZXJ2ZXJJZCA9IG1vZHVsZXMuZ2V0KG1vZHVsZS5nZXRJZCgpKTsKLQkJaWYgKHNlcnZlcklkID09IG51bGwgJiYgbmV3U2VydmVySWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHNlcnZlcklkICE9IG51bGwgJiYgc2VydmVySWQuZXF1YWxzKG5ld1NlcnZlcklkKSkKLQkJCXJldHVybjsKLQkJCi0JCW1vZHVsZXMucHV0KG1vZHVsZS5nZXRJZCgpLCBuZXdTZXJ2ZXJJZCk7Ci0JCXNhdmUobW9uaXRvcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVQcm9wZXJ0aWVzW10iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVQdWJsaXNoSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlUHVibGlzaEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjODdlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVQdWJsaXNoSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dDsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXQ7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLk1vZHVsZUZvbGRlcjsKLS8qKgotICogUHVibGlzaCBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBtb2R1bGUgb24gYSBzcGVjaWZpYyBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVQdWJsaXNoSW5mbyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU1vZHVsZVJlc291cmNlW10gRU1QVFlfTU9EVUxFX1JFU09VUkNFID0gbmV3IElNb2R1bGVSZXNvdXJjZVswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIEVNUFRZX01PRFVMRV9SRVNPVVJDRV9ERUxUQSA9IG5ldyBJTW9kdWxlUmVzb3VyY2VEZWx0YVswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0lEID0gIm1vZHVsZS1pZHMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVFlQRV9JRCA9ICJtb2R1bGUtdHlwZS1pZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9UWVBFX1ZFUlNJT04gPSAibW9kdWxlLXR5cGUtdmVyc2lvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU1QID0gInN0YW1wIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRSA9ICJmaWxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSID0gImZvbGRlciI7Ci0KLQlwcml2YXRlIFN0cmluZyBtb2R1bGVJZDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzID0gRU1QVFlfTU9EVUxFX1JFU09VUkNFOwotCXByaXZhdGUgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VDYWNoZTsKLQlwcml2YXRlIElNb2R1bGVSZXNvdXJjZVtdIGN1cnJlbnRSZXNvdXJjZXMgPSBudWxsOwotCXByaXZhdGUgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0RlbHRhOwotCi0JLyoqCi0JICogTW9kdWxlUHVibGlzaEluZm8gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZUlkIGEgbW9kdWxlIGlkCi0JICogQHBhcmFtIG5hbWUgdGhlIG1vZHVsZSdzIG5hbWUKLQkgKiBAcGFyYW0gbW9kdWxlVHlwZSB0aGUgbW9kdWxlIHR5cGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlUHVibGlzaEluZm8oU3RyaW5nIG1vZHVsZUlkLCBTdHJpbmcgbmFtZSwgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMubW9kdWxlSWQgPSBtb2R1bGVJZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5tb2R1bGVUeXBlID0gbW9kdWxlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBNb2R1bGVQdWJsaXNoSW5mbyBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVtZW50byBhIG1lbWVudG8KLQkgKi8KLQlwdWJsaWMgTW9kdWxlUHVibGlzaEluZm8oSU1lbWVudG8gbWVtZW50bykgewotCQlzdXBlcigpOwotCQkKLQkJbG9hZChtZW1lbnRvKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2R1bGVQdWJsaXNoSW5mbyBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gaW4gYW4gaW5wdXQgc3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgbG9hZCBmYWlscwotCSAqLwotCXB1YmxpYyBNb2R1bGVQdWJsaXNoSW5mbyhEYXRhSW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCQotCQlsb2FkKGluKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1vZHVsZUlkKCkgewotCQlyZXR1cm4gbW9kdWxlSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgSU1vZHVsZVR5cGUgZ2V0TW9kdWxlVHlwZSgpIHsKLQkJcmV0dXJuIG1vZHVsZVR5cGU7Ci0JfQotCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZVtdIGdldFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoSU1vZHVsZVJlc291cmNlW10gcmVzKSB7Ci0JCXJlc291cmNlcyA9IHJlczsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIG9ubHkgZm9yIHJlYWRpbmcgZnJvbSBXVFAgMS54IHdvcmtzcGFjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZChJTWVtZW50byBtZW1lbnRvKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgbW9kdWxlIHB1Ymxpc2ggaW5mbyBmb3I6ICIgKyBtZW1lbnRvKTsKLQkJCi0JCXRyeSB7Ci0JCQltb2R1bGVJZCA9IG1lbWVudG8uZ2V0U3RyaW5nKE1PRFVMRV9JRCk7Ci0JCQluYW1lID0gbWVtZW50by5nZXRTdHJpbmcoTkFNRSk7Ci0JCQlTdHJpbmcgbXQgPSBtZW1lbnRvLmdldFN0cmluZyhNT0RVTEVfVFlQRV9JRCk7Ci0JCQlTdHJpbmcgbXYgPSBtZW1lbnRvLmdldFN0cmluZyhNT0RVTEVfVFlQRV9WRVJTSU9OKTsKLQkJCWlmIChtdCAhPSBudWxsICYmIG10Lmxlbmd0aCgpID4gMCkKLQkJCQltb2R1bGVUeXBlID0gTW9kdWxlVHlwZS5nZXRNb2R1bGVUeXBlKG10LCBtdik7Ci0JCQkKLQkJCXJlc291cmNlcyA9IGxvYWRSZXNvdXJjZShtZW1lbnRvLCBuZXcgUGF0aCgiIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIG1vZHVsZSBwdWJsaXNoIGluZm8gaW5mb3JtYXRpb24iLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZWQgb25seSBmb3IgcmVhZGluZyBmcm9tIFdUUCAxLnggd29ya3NwYWNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gbG9hZFJlc291cmNlKElNZW1lbnRvIG1lbWVudG8sIElQYXRoIHBhdGgpIHsKLQkJaWYgKG1lbWVudG8gPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWV9NT0RVTEVfUkVTT1VSQ0U7Ci0JCQotCQlMaXN0PElNb2R1bGVSZXNvdXJjZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZVJlc291cmNlPigxMCk7Ci0JCQotCQkvLyBsb2FkIGZpbGVzCi0JCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvLmdldENoaWxkcmVuKEZJTEUpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVN0cmluZyBuYW1lMiA9IGNoaWxkcmVuW2ldLmdldFN0cmluZyhOQU1FKTsKLQkJCQlsb25nIHN0YW1wID0gTG9uZy5wYXJzZUxvbmcoY2hpbGRyZW5baV0uZ2V0U3RyaW5nKFNUQU1QKSk7Ci0JCQkJTW9kdWxlRmlsZSBmaWxlID0gbmV3IE1vZHVsZUZpbGUobmFtZTIsIHBhdGgsIHN0YW1wKTsKLQkJCQlsaXN0LmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gbG9hZCBmb2xkZXJzCi0JCWNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbihGT0xERVIpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVN0cmluZyBuYW1lMiA9IGNoaWxkcmVuW2ldLmdldFN0cmluZyhOQU1FKTsKLQkJCQlNb2R1bGVGb2xkZXIgZm9sZGVyID0gbmV3IE1vZHVsZUZvbGRlcihudWxsLCBuYW1lMiwgcGF0aCk7Ci0JCQkJZm9sZGVyLnNldE1lbWJlcnMobG9hZFJlc291cmNlKGNoaWxkcmVuW2ldLCBwYXRoLmFwcGVuZChuYW1lMikpKTsKLQkJCQlsaXN0LmFkZChmb2xkZXIpOwotCQkJfQotCQl9Ci0JCQotCQlJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMyID0gbmV3IElNb2R1bGVSZXNvdXJjZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXNvdXJjZXMyKTsKLQkJcmV0dXJuIHJlc291cmNlczI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZChEYXRhSW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgbW9kdWxlIHB1Ymxpc2ggaW5mbyIpOwotCQkKLQkJbW9kdWxlSWQgPSBpbi5yZWFkVVRGKCk7Ci0JCWJ5dGUgYiA9IGluLnJlYWRCeXRlKCk7IC8vIDg/Ci0JCQotCQlpZiAoKGIgJiAxKSAhPSAwKQotCQkJbmFtZSA9IGluLnJlYWRVVEYoKTsKLQkJZWxzZQotCQkJbmFtZSA9IG51bGw7Ci0JCQotCQlpZiAoKGIgJiAyKSAhPSAwKSB7Ci0JCQlTdHJpbmcgbXQgPSBpbi5yZWFkVVRGKCk7Ci0JCQlTdHJpbmcgbXYgPSBpbi5yZWFkVVRGKCk7Ci0JCQlpZiAobXQgIT0gbnVsbCAmJiBtdC5sZW5ndGgoKSA+IDApCi0JCQkJbW9kdWxlVHlwZSA9IE1vZHVsZVR5cGUuZ2V0TW9kdWxlVHlwZShtdCwgbXYpOwotCQl9IGVsc2UKLQkJCW1vZHVsZVR5cGUgPSBudWxsOwotCQkKLQkJcmVzb3VyY2VzID0gbG9hZFJlc291cmNlKGluLCBuZXcgUGF0aCgiIikpOwotCX0KLQotCXByaXZhdGUgSU1vZHVsZVJlc291cmNlW10gbG9hZFJlc291cmNlKERhdGFJbnB1dCBpbiwgSVBhdGggcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHNpemUgPSBpbi5yZWFkSW50KCk7Ci0JCWlmIChzaXplID4gMTAwMDAwMCkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRm9sZGVyIGNhcGFjaXR5IGxpbWl0IHJlYWNoZWQiKTsKLQkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMiA9IG5ldyBJTW9kdWxlUmVzb3VyY2Vbc2l6ZV07Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJYnl0ZSBiID0gaW4ucmVhZEJ5dGUoKTsKLQkJCWlmIChiID09IDApIHsKLQkJCQlTdHJpbmcgbmFtZTIgPSBpbi5yZWFkVVRGKCk7Ci0JCQkJbG9uZyBzdGFtcCA9IGluLnJlYWRMb25nKCk7Ci0JCQkJcmVzb3VyY2VzMltpXSA9IG5ldyBNb2R1bGVGaWxlKG5hbWUyLCBwYXRoLCBzdGFtcCk7Ci0JCQl9IGVsc2UgaWYgKGIgPT0gMSkgewotCQkJCVN0cmluZyBuYW1lMiA9IGluLnJlYWRVVEYoKTsKLQkJCQlNb2R1bGVGb2xkZXIgZm9sZGVyID0gbmV3IE1vZHVsZUZvbGRlcihudWxsLCBuYW1lMiwgcGF0aCk7Ci0JCQkJZm9sZGVyLnNldE1lbWJlcnMobG9hZFJlc291cmNlKGluLCBwYXRoLmFwcGVuZChuYW1lMikpKTsKLQkJCQlyZXNvdXJjZXMyW2ldID0gZm9sZGVyOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVzb3VyY2VzMjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKERhdGFPdXRwdXQgb3V0KSB7Ci0JCXRyeSB7Ci0JCQlvdXQud3JpdGVVVEYobW9kdWxlSWQpOwotCQkJYnl0ZSBiID0gMDsKLQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJYiB8PSAxOwotCQkJaWYgKG1vZHVsZVR5cGUgIT0gbnVsbCkKLQkJCQliIHw9IDI7Ci0JCQlvdXQud3JpdGVCeXRlKGIpOwotCQkJCi0JCQlpZiAobmFtZSAhPSBudWxsKQotCQkJCW91dC53cml0ZVVURihuYW1lKTsKLQkJCQotCQkJaWYgKG1vZHVsZVR5cGUgIT0gbnVsbCkgewotCQkJCW91dC53cml0ZVVURihtb2R1bGVUeXBlLmdldElkKCkpOwotCQkJCW91dC53cml0ZVVURihtb2R1bGVUeXBlLmdldFZlcnNpb24oKSk7Ci0JCQl9Ci0JCQlzYXZlUmVzb3VyY2Uob3V0LCByZXNvdXJjZXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgbW9kdWxlIHB1Ymxpc2ggaW5mbyIsIGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVJlc291cmNlKERhdGFPdXRwdXQgb3V0LCBJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2VzMiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgc2l6ZSA9IHJlc291cmNlczIubGVuZ3RoOwotCQlvdXQud3JpdGVJbnQoc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAocmVzb3VyY2VzMltpXSBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSB7Ci0JCQkJSU1vZHVsZUZpbGUgZmlsZSA9IChJTW9kdWxlRmlsZSkgcmVzb3VyY2VzMltpXTsKLQkJCQlvdXQud3JpdGVCeXRlKDApOwotCQkJCW91dC53cml0ZVVURihmaWxlLmdldE5hbWUoKSk7Ci0JCQkJb3V0LndyaXRlTG9uZyhmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlJTW9kdWxlRm9sZGVyIGZvbGRlciA9IChJTW9kdWxlRm9sZGVyKSByZXNvdXJjZXMyW2ldOwotCQkJCW91dC53cml0ZUJ5dGUoMSk7Ci0JCQkJb3V0LndyaXRlVVRGKGZvbGRlci5nZXROYW1lKCkpOwotCQkJCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczMgPSBmb2xkZXIubWVtYmVycygpOwotCQkJCXNhdmVSZXNvdXJjZShvdXQsIHJlc291cmNlczMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgdXNpbmcgdGhlIG1vZHVsZSBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydENhY2hpbmcoKSB7Ci0JCXVzZUNhY2hlID0gdHJ1ZTsKLQkJY3VycmVudFJlc291cmNlcyA9IG51bGw7Ci0JCWRlbHRhID0gbnVsbDsKLQkJaGFzRGVsdGEgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxsIHRoZSBtb2R1bGUgY2FjaGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZQotCSAqLwotCXByaXZhdGUgdm9pZCBmaWxsQ2FjaGUoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAoIXVzZUNhY2hlKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKGN1cnJlbnRSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCUlNb2R1bGUgbSA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07Ci0JCQlNb2R1bGVEZWxlZ2F0ZSBwbSA9IChNb2R1bGVEZWxlZ2F0ZSkgbS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbnVsbCk7Ci0JCQlpZiAocG0gPT0gbnVsbCB8fCAobS5nZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiAhbS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpKQotCQkJCWN1cnJlbnRSZXNvdXJjZXMgPSBFTVBUWV9NT0RVTEVfUkVTT1VSQ0U7Ci0JCQllbHNlCi0JCQkJY3VycmVudFJlc291cmNlcyA9IHBtLm1lbWJlcnMoKTsKLQkJCQotCQkJZGVsdGEgPSBTZXJ2ZXJQdWJsaXNoSW5mby5nZXREZWx0YShyZXNvdXJjZXMsIGN1cnJlbnRSZXNvdXJjZXMpOwotCQkJaGFzRGVsdGEgPSAoZGVsdGEgIT0gbnVsbCAmJiBkZWx0YS5sZW5ndGggPiAwKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBFUkZPUk1BTkNFLCAiRmlsbGluZyBwdWJsaXNoIGNhY2hlIGZvciAiICsgbS5nZXROYW1lKCkgKyAiOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGRuJ3QgZmlsbCBwdWJsaXNoIGNhY2hlIGZvciAiICsgbW9kdWxlKTsKLQkJfQotCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCWRlbHRhID0gRU1QVFlfTU9EVUxFX1JFU09VUkNFX0RFTFRBOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0JCXVzZUNhY2hlID0gZmFsc2U7Ci0JCWN1cnJlbnRSZXNvdXJjZXMgPSBudWxsOwotCQlkZWx0YSA9IG51bGw7Ci0JCWhhc0RlbHRhID0gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGdldE1vZHVsZVJlc291cmNlcyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWV9NT0RVTEVfUkVTT1VSQ0U7Ci0JCQotCQlpZiAodXNlQ2FjaGUpIHsKLQkJCWZpbGxDYWNoZShtb2R1bGUpOwotCQkJcmV0dXJuIGN1cnJlbnRSZXNvdXJjZXM7Ci0JCX0KLQkJCi0JCWludCBzaXplID0gbW9kdWxlLmxlbmd0aDsKLQkJSU1vZHVsZSBtID0gbW9kdWxlW3NpemUgLSAxXTsKLQkJTW9kdWxlRGVsZWdhdGUgcG0gPSAoTW9kdWxlRGVsZWdhdGUpIG0ubG9hZEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG51bGwpOwotCQlpZiAocG0gPT0gbnVsbCB8fCAobS5nZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiAhbS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpKQotCQkJcmV0dXJuIEVNUFRZX01PRFVMRV9SRVNPVVJDRTsKLQkJCi0JCXRyeSB7Ci0JCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCUlNb2R1bGVSZXNvdXJjZVtdIHggPSBwbS5tZW1iZXJzKCk7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QRVJGT1JNQU5DRSwgIlRpbWUgdG8gZ2V0IG1lbWJlcnMoKSBmb3IgIiArIG1vZHVsZVtzaXplIC0gMV0uZ2V0TmFtZSgpICsgIjogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKLQkJCXJldHVybiB4OwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiUG9zc2libGUgZmFpbHVyZSBpbiBnZXRNb2R1bGVSZXNvdXJjZXMiLCBjZSk7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX01PRFVMRV9SRVNPVVJDRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXREZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWV9NT0RVTEVfUkVTT1VSQ0VfREVMVEE7Ci0JCQotCQlpZiAodXNlQ2FjaGUpIHsKLQkJCWZpbGxDYWNoZShtb2R1bGUpOwotCQkJcmV0dXJuIGRlbHRhOwotCQl9Ci0JCQotCQlJTW9kdWxlIG0gPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOwotCQlNb2R1bGVEZWxlZ2F0ZSBwbSA9IChNb2R1bGVEZWxlZ2F0ZSkgbS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbnVsbCk7Ci0JCWlmIChwbSA9PSBudWxsIHx8IChtLmdldFByb2plY3QoKSAhPSBudWxsICYmICFtLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkpCi0JCQlyZXR1cm4gRU1QVFlfTU9EVUxFX1JFU09VUkNFX0RFTFRBOwotCQkKLQkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZXMyID0gcG0ubWVtYmVycygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiUG9zc2libGUgZmFpbHVyZSBpbiBnZXREZWx0YSIsIGNlKTsKLQkJfQotCQlpZiAocmVzb3VyY2VzMiA9PSBudWxsKQotCQkJcmVzb3VyY2VzMiA9IEVNUFRZX01PRFVMRV9SRVNPVVJDRTsKLQkJcmV0dXJuIFNlcnZlclB1Ymxpc2hJbmZvLmdldERlbHRhKGdldFJlc291cmNlcygpLCByZXNvdXJjZXMyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNEZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmICh1c2VDYWNoZSkgewotCQkJZmlsbENhY2hlKG1vZHVsZSk7Ci0JCQlyZXR1cm4gaGFzRGVsdGE7Ci0JCX0KLQkJCi0JCUlNb2R1bGUgbSA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07Ci0JCU1vZHVsZURlbGVnYXRlIHBtID0gKE1vZHVsZURlbGVnYXRlKSBtLmxvYWRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMiA9IG51bGw7Ci0JCWlmIChwbSA9PSBudWxsIHx8IChtLmdldFByb2plY3QoKSAhPSBudWxsICYmICFtLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQl0cnkgewotCQkJcmVzb3VyY2VzMiA9IHBtLm1lbWJlcnMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlBvc3NpYmxlIGZhaWx1cmUgaW4gaGFzRGVsdGEiLCBjZSk7Ci0JCX0KLQkJaWYgKHJlc291cmNlczIgPT0gbnVsbCkKLQkJCXJlc291cmNlczIgPSBFTVBUWV9NT0RVTEVfUkVTT1VSQ0U7Ci0JCXJldHVybiBTZXJ2ZXJQdWJsaXNoSW5mby5oYXNEZWx0YShnZXRSZXNvdXJjZXMoKSwgcmVzb3VyY2VzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgZmlsbChJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmICh1c2VDYWNoZSkgewotCQkJZmlsbENhY2hlKG1vZHVsZSk7Ci0JCQlzZXRSZXNvdXJjZXMoY3VycmVudFJlc291cmNlcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlNb2R1bGUgbSA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07Ci0JCU1vZHVsZURlbGVnYXRlIHBtID0gKE1vZHVsZURlbGVnYXRlKSBtLmxvYWRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJaWYgKHBtID09IG51bGwgfHwgKG0uZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgIW0uZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSkgewotCQkJc2V0UmVzb3VyY2VzKEVNUFRZX01PRFVMRV9SRVNPVVJDRSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlzZXRSZXNvdXJjZXMocG0ubWVtYmVycygpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlBvc3NpYmxlIGZhaWx1cmUgaW4gZmlsbCIsIGNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGRlbGV0ZWQgbW9kdWxlIHRoYXQgcmVwcmVzZW50cyB0aGlzIG1vZHVsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbW9kdWxlCi0JICovCi0JcHJvdGVjdGVkIElNb2R1bGUgZ2V0RGVsZXRlZE1vZHVsZSgpIHsKLQkJU3RyaW5nIGlkID0gbW9kdWxlSWQ7Ci0JCWludCBpbmRleCA9IGlkLmxhc3RJbmRleE9mKCIjIik7Ci0JCWlmIChpbmRleCA+IDApCi0JCQlpZCA9IGlkLnN1YnN0cmluZyhpbmRleCsxKTsKLQkJcmV0dXJuIG5ldyBEZWxldGVkTW9kdWxlKGlkLCBuYW1lLCBtb2R1bGVUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk1vZHVsZVB1Ymxpc2hJbmZvIFsiICsgbW9kdWxlSWQgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZVJlc291cmNlRGVsdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZVJlc291cmNlRGVsdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjNDBiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVSZXNvdXJjZURlbHRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVJlc291cmNlRGVsdGEgaW1wbGVtZW50cyBJTW9kdWxlUmVzb3VyY2VEZWx0YSB7Ci0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZSByZXNvdXJjZTsKLQlwcm90ZWN0ZWQgaW50IGtpbmQ7Ci0JCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZURlbHRhW10gY2hpbGRyZW47Ci0KLQlwdWJsaWMgTW9kdWxlUmVzb3VyY2VEZWx0YShJTW9kdWxlUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kKSB7Ci0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJdGhpcy5raW5kID0ga2luZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oSU1vZHVsZVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbikgewotCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZSNnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSB7Ci0JCXJldHVybiByZXNvdXJjZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlRGVsdGEjZ2V0TW9kdWxlUmVzb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2UgZ2V0TW9kdWxlUmVzb3VyY2UoKSB7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlRGVsdGEjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlRGVsdGEjZ2V0QWZmZWN0ZWRDaGlsZHJlbigpCi0JICovCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0QWZmZWN0ZWRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9kdWxlUmVzb3VyY2VEZWx0YSBbIiArIHJlc291cmNlICsgIiwgIiArIGtpbmQgKyAiXSI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRyYWNlKFN0cmluZyBpbmRlbnQpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGluZGVudCArIHRvU3RyaW5nKCkpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCSgoTW9kdWxlUmVzb3VyY2VEZWx0YSljaGlsZHJlbltpXSkudHJhY2UoaW5kZW50ICsgIiAgIik7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjBkY2JkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVUeXBlIGltcGxlbWVudHMgSU1vZHVsZVR5cGUgewotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOwotCi0JLy8JY2FjaGVkIGNvcHkgb2YgYWxsIG1vZHVsZSBraW5kcwotCXByaXZhdGUgc3RhdGljIExpc3Q8TW9kdWxlS2luZD4gbW9kdWxlS2luZHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PE1vZHVsZVR5cGU+IG1vZHVsZVR5cGVzOwotCi0JcHVibGljIE1vZHVsZVR5cGUoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJTW9kdWxlS2luZCBtdCA9IGZpbmRNb2R1bGVUeXBlKGlkKTsKLQkJaWYgKG10ICE9IG51bGwpCi0JCQlyZXR1cm4gbXQuZ2V0TmFtZSgpOwotCQlyZXR1cm4gTWVzc2FnZXMubW9kdWxlVHlwZVVua25vd247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgdHlwZSB3aXRoIHRoZSBnaXZlbiBpZCBhbmQgdmVyc2lvbiwgb3IgY3JlYXRlIGEgbmV3IG9uZSBpZgotCSAqIG5vbmUgYWxyZWFkeSBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBtb2R1bGUgdHlwZSBpZAotCSAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBtb2R1bGUgdHlwZSB2ZXJzaW9uCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHR5cGUKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBNb2R1bGVUeXBlIGdldE1vZHVsZVR5cGUoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbikgewotCQlpZiAobW9kdWxlVHlwZXMgPT0gbnVsbCkKLQkJCW1vZHVsZVR5cGVzID0gbmV3IEFycmF5TGlzdDxNb2R1bGVUeXBlPigpOwotCQkKLQkJLy8gbG9vayBmb3IgYW4gZXhpc3Rpbmcgb25lIGZpcnN0Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlVHlwZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTW9kdWxlVHlwZSBtdCA9IChNb2R1bGVUeXBlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoKGlkID09IG51bGwgJiYgbXQuaWQgPT0gbnVsbCkgfHwgKGlkICE9IG51bGwgJiYgaWQuZXF1YWxzKG10LmlkKSkpIHsKLQkJCQlpZiAoKHZlcnNpb24gPT0gbnVsbCAmJiBtdC52ZXJzaW9uID09IG51bGwpIHx8ICh2ZXJzaW9uICE9IG51bGwgJiYgdmVyc2lvbi5lcXVhbHMobXQudmVyc2lvbikpKQotCQkJCQlyZXR1cm4gbXQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIG90aGVyd2lzZSBjcmVhdGUgb25lCi0JCU1vZHVsZVR5cGUgbXQgPSBuZXcgTW9kdWxlVHlwZShpZCwgdmVyc2lvbik7Ci0JCW1vZHVsZVR5cGVzLmFkZChtdCk7Ci0JCXJldHVybiBtdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgdHlwZSB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgotCSAqIG1vZHVsZSB0eXBlcyBmb3IgdGhlIG9uZSBhIG1hdGNoaW5nCi0JICogbW9kdWxlIHR5cGUgaWQgKHtAbGluayBNb2R1bGVUeXBlI2dldElkKCl9KS4gVGhlIGlkIG1heSBub3QgYmUgbnVsbC4KLQkgKgotCSAqIEBwYXJhbSBpZCB0aGUgbW9kdWxlIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gbW9kdWxlIHR5cGUKLQkgKiB3aXRoIHRoZSBnaXZlbiBpZAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1vZHVsZUtpbmQgZmluZE1vZHVsZVR5cGUoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0JCWlmIChtb2R1bGVLaW5kcyA9PSBudWxsKQotCQkJbG9hZE1vZHVsZVR5cGVzKCk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZUtpbmRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZHVsZUtpbmQgbW9kdWxlVHlwZSA9IChNb2R1bGVLaW5kKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKG1vZHVsZVR5cGUuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIG1vZHVsZVR5cGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgbW9kdWxlIHR5cGVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRNb2R1bGVUeXBlcygpIHsKLQkJaWYgKG1vZHVsZUtpbmRzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5tb2R1bGVUeXBlcyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJtb2R1bGVUeXBlcyIpOwotCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQltb2R1bGVLaW5kcyA9IG5ldyBBcnJheUxpc3Q8TW9kdWxlS2luZD4oc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCU1vZHVsZUtpbmQgbW9kdWxlVHlwZSA9IG5ldyBNb2R1bGVLaW5kKGNmW2ldKTsKLQkJCQltb2R1bGVLaW5kcy5hZGQobW9kdWxlVHlwZSk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiICBMb2FkZWQgbW9kdWxlVHlwZTogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgbW9kdWxlVHlwZTogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi08LSBEb25lIGxvYWRpbmcgLm1vZHVsZVR5cGVzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaGFzaCA9IDE3OwotCQlpZiAoaWQgIT0gbnVsbCkKLQkJCWhhc2ggKz0gaWQuaGFzaENvZGUoKTsKLQkJaWYgKHZlcnNpb24gIT0gbnVsbCkKLQkJCWhhc2ggKz0gdmVyc2lvbi5oYXNoQ29kZSgpOwotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmICghKG9iaiBpbnN0YW5jZW9mIE1vZHVsZVR5cGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJTW9kdWxlVHlwZSBtdCA9IChNb2R1bGVUeXBlKSBvYmo7Ci0JCWlmICghU2VydmVyUGx1Z2luLm1hdGNoZXMoaWQsIG10LmlkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmICghU2VydmVyUGx1Z2luLm1hdGNoZXModmVyc2lvbiwgbXQudmVyc2lvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk1vZHVsZVR5cGVbIiArIGlkICsgIiwgIiArIHZlcnNpb24gKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTBkMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBQcm9ncmVzcyBNb25pdG9yIHV0aWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ncmVzc1V0aWwgewotCS8qKgotCSAqIFByb2dyZXNzVXRpbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgUHJvZ3Jlc3NVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZhbGlkIHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgaW50Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHBhcmFtIHRpY2tzIHRoZSBudW1iZXIgb2YgdGlja3MKLQkgKiBAcGFyYW0gc3R5bGUgYSBzdHlsZQotCSAqIEByZXR1cm4gYSBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFN1Yk1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MsIGludCBzdHlsZSkgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKLQkJCXJldHVybiBtb25pdG9yOwotCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcywgc3R5bGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Qcm9qZWN0UHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvamVjdFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlZjdkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Qcm9qZWN0UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgc3RvcmVzIHByZWZlcmVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBzZXJ2ZXIgdG9vbHMuCi0gKiAKLSAqIFRoaXMgY2xhc3MgY3VycmVudGx5IGFsd2F5cyByZWFkcyBmcm9tIGRpc2suIEl0IHNob3VsZCBjYWNoZSB0aGUgZmlsZQotICogYW5kIGhhdmUgYSByZXNvdXJjZSBsaXN0ZW5lci4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RQcm9wZXJ0aWVzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9GT0xERVIgPSAiLnNldHRpbmdzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9GSUxFID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5wcmVmcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9QUk9KRUNUX1BSRUYgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmlzU2VydmVyUHJvamVjdCI7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQotCXByb3RlY3RlZCBib29sZWFuIHNlcnZlclByb2plY3QgPSBmYWxzZTsKLQotCS8qKgotCSAqIFByb2plY3RQcm9wZXJ0aWVzIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqLwotCXB1YmxpYyBQcm9qZWN0UHJvcGVydGllcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmVmZXJlbmNlcygpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyBwcm9qZWN0IHByZWZlcmVuY2VzOiAiICsgcHJvamVjdCk7Ci0JCQotCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGb2xkZXIoUFJFRkVSRU5DRV9GT0xERVIpLmdldEZpbGUoUFJFRkVSRU5DRV9GSUxFKTsKLQkJCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlwLmxvYWQoaW4pOwotCQkJCi0JCQlTdHJpbmcgcyA9IHAuZ2V0UHJvcGVydHkoU0VSVkVSX1BST0pFQ1RfUFJFRik7Ci0JCQlpZiAocyAhPSBudWxsICYmICJ0cnVlIi5lcXVhbHMocykpCi0JCQkJc2VydmVyUHJvamVjdCA9IHRydWU7Ci0JCQllbHNlCi0JCQkJc2VydmVyUHJvamVjdCA9IGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGxvYWQgcHJlZmVyZW5jZXMiLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVQcmVmZXJlbmNlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybjsKLQkJCi0JCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoUFJFRkVSRU5DRV9GT0xERVIpOwotCQlpZiAoIWZvbGRlci5leGlzdHMoKSkKLQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7Ci0JCQotCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGb2xkZXIoUFJFRkVSRU5DRV9GT0xERVIpLmdldEZpbGUoUFJFRkVSRU5DRV9GSUxFKTsKLQkJCi0JCWlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQobmV3IElGaWxlW10geyBmaWxlIH0sIG51bGwpOwotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJLy8gZGlkbid0IHdvcmsgb3Igbm90IHVuZGVyIHNvdXJjZSBjb250cm9sCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCQkKLQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcC5wdXQoImVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbiIsICIxIik7Ci0JCWlmIChzZXJ2ZXJQcm9qZWN0KQotCQkJcC5wdXQoU0VSVkVSX1BST0pFQ1RfUFJFRiwgInRydWUiKTsKLQkJZWxzZQotCQkJcC5wdXQoU0VSVkVSX1BST0pFQ1RfUFJFRiwgImZhbHNlIik7Ci0JCQotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJcC5zdG9yZShvdXQsIG51bGwpOwotCQkKLQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKTsKLQkJCQotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7Ci0JCQllbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJ1bnRpbWUgdGFyZ2V0IHR5cGUgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgdGFyZ2V0Ci0JICovCi0JcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWVUYXJnZXQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBwcm9qZWN0IGNhbiBjb250YWluIHNlcnZlciBhcnRpZmFjdHMsIGFuZAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHByb2plY3QgY2FuIGNvbnRhaW4gc2VydmVyIGFydGlmYWN0cywgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VydmVyUHJvamVjdCgpIHsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBzZXJ2ZXJQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgcHJvamVjdCBjYW4gY29udGFpbiBzZXJ2ZXIgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBiIDxjb2RlPnRydWU8L2NvZGU+IHRvIGFsbG93IHRoZSBwcm9qZWN0IHRvIGNvbnRhaW4gc2VydmVyCi0JICogICAgcmVzb3VyY2VzLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsbG93IHRoZSBwcm9qZWN0IHRvIGNvbnRhaW4KLQkgKiAgICBzZXJ2ZXJzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2V0dGluZyB0aGUgc2VydmVyIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KGJvb2xlYW4gYiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCQlzZXJ2ZXJQcm9qZWN0ID0gYjsKLQkJc2F2ZVByZWZlcmVuY2VzKG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUHJvamVjdFByb3BlcnRpZXNbIiArIHByb2plY3QgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDlmNjA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIEhlbHBlciB0byBvYnRhaW4gYW5kIHN0b3JlIHRoZSBnbG9iYWwgcHVibGlzaCBpbmZvcm1hdGlvbi4KLSAqICh3aGF0IGZpbGVzIHdlcmUgcHVibGlzaGVkIGFuZCB3aGVuKSBEZWxlZ2F0ZXMgdG8gUHVibGlzaFN0YXRlCi0gKiBmb3IgYWxsIHNlcnZlciBzcGVjaWZpYyBwdWJsaXNoaW5nIGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaEluZm8gewotCXByb3RlY3RlZCBzdGF0aWMgUHVibGlzaEluZm8gaW5zdGFuY2U7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0RJUiA9ICJwdWJsaXNoIjsKLQotCS8vIG1hcCBvZiBzZXJ2ZXIgaWRzIHRvIFN0cmluZ3Mgb2YgZmlsZW5hbWUgY29udGFpbmluZyBwdWJsaXNoIGRhdGEKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBzZXJ2ZXJJZFRvUGF0aDsKLQotCS8vIG1hcCBvZiBsb2FkZWQgc2VydmVySWRzIHRvIHB1Ymxpc2ggaW5mbwotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBTZXJ2ZXJQdWJsaXNoSW5mbz4gc2VydmVySWRUb1B1Ymxpc2hJbmZvOwotCi0JLyoqCi0JICogUHVibGlzaEluZm8gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFB1Ymxpc2hJbmZvKCkgewotCQlzdXBlcigpOwotCQotCQlzZXJ2ZXJJZFRvUGF0aCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlzZXJ2ZXJJZFRvUHVibGlzaEluZm8gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZlclB1Ymxpc2hJbmZvPigpOwotCQlsb2FkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwdWJsaXNoIGluZm8uCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUHVibGlzaEluZm8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFB1Ymxpc2hJbmZvIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChQVUJMSVNIX0RJUikgewotCQkJCWluc3RhbmNlID0gbmV3IFB1Ymxpc2hJbmZvKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHVibGlzaCBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5QdWJsaXNoU3RhdGUKLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHVibGljIFNlcnZlclB1Ymxpc2hJbmZvIGdldFNlcnZlclB1Ymxpc2hJbmZvKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCS8vIGhhdmUgd2UgdHJpZWQgbG9hZGluZyB5ZXQ/Ci0JCVN0cmluZyBzZXJ2ZXJJZCA9IHNlcnZlci5nZXRJZCgpOwotCQlpZiAoc2VydmVySWRUb1BhdGguY29udGFpbnNLZXkoc2VydmVySWQpKSB7Ci0JCQlpZiAoc2VydmVySWRUb1B1Ymxpc2hJbmZvLmNvbnRhaW5zS2V5KHNlcnZlcklkKSkKLQkJCQlyZXR1cm4gc2VydmVySWRUb1B1Ymxpc2hJbmZvLmdldChzZXJ2ZXJJZCk7Ci0JCQkKLQkJCS8vIGZvcmNlIC5kYXQgZXh0ZW5zaW9uCi0JCQlTdHJpbmcgcGFydGlhbFBhdGggPSBzZXJ2ZXJJZFRvUGF0aC5nZXQoc2VydmVySWQpOwotCQkJcGFydGlhbFBhdGggPSBwYXJ0aWFsUGF0aC5zdWJzdHJpbmcoMCwgcGFydGlhbFBhdGgubGVuZ3RoKCkgLSAzKSArICJkYXQiOwotCQkJSVBhdGggcGF0aCA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoUFVCTElTSF9ESVIpLmFwcGVuZChwYXJ0aWFsUGF0aCk7Ci0JCQlTZXJ2ZXJQdWJsaXNoSW5mbyBzcGkgPSBuZXcgU2VydmVyUHVibGlzaEluZm8ocGF0aCk7Ci0JCQlzZXJ2ZXJJZFRvUHVibGlzaEluZm8ucHV0KHNlcnZlcklkLCBzcGkpOwotCQkJcmV0dXJuIHNwaTsKLQkJfQotCQkKLQkJLy8gZmlyc3QgdGltZSBzZXJ2ZXIgaXMgYmVpbmcgdXNlZAotCQlJUGF0aCBwYXRoID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChQVUJMSVNIX0RJUik7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgudG9PU1N0cmluZygpKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJZmlsZS5ta2RpcigpOwotCQkKLQkJZmlsZSA9IG51bGw7Ci0JCWludCBpID0gMDsKLQkJU3RyaW5nIHBhcnRpYWxQYXRoID0gbnVsbDsKLQkJU2VydmVyUHVibGlzaEluZm8gc3BpID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChQVUJMSVNIX0RJUikgewotCQkJd2hpbGUgKGZpbGUgPT0gbnVsbCB8fCBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJcGFydGlhbFBhdGggPSAicHVibGlzaCIgKyBpICsgIi5kYXQiOwotCQkJCXBhdGggPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKFBVQkxJU0hfRElSKS5hcHBlbmQocGFydGlhbFBhdGgpOwotCQkJCWlmIChzZXJ2ZXJJZFRvUGF0aC5nZXQocGFydGlhbFBhdGgpID09IG51bGwpCi0JCQkJCWZpbGUgPSBuZXcgRmlsZShwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQkJaSsrOwotCQkJfQotCQkJCi0JCQlzcGkgPSBuZXcgU2VydmVyUHVibGlzaEluZm8ocGF0aCk7Ci0JCQlzZXJ2ZXJJZFRvUGF0aC5wdXQoc2VydmVySWQsIHBhcnRpYWxQYXRoKTsKLQkJCXNlcnZlcklkVG9QdWJsaXNoSW5mby5wdXQoc2VydmVySWQsIHNwaSk7Ci0JCQlzYXZlKCk7Ci0JCX0KLQkJcmV0dXJuIHNwaTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNlcnZlciBwdWJsaXNoIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXJ2ZXJQdWJsaXNoSW5mbyhJU2VydmVyIHNlcnZlcikgewotCQlJUGF0aCBwYXRoID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChQVUJMSVNIX0RJUik7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgudG9PU1N0cmluZygpKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQkKLQkJU3RyaW5nIHNlcnZlcklkID0gc2VydmVyLmdldElkKCk7Ci0JCVN0cmluZyBwYXRoMiA9IHNlcnZlcklkVG9QYXRoLmdldChzZXJ2ZXJJZCk7Ci0JCXN5bmNocm9uaXplZCAoUFVCTElTSF9ESVIpIHsKLQkJCXNlcnZlcklkVG9QYXRoLnJlbW92ZShzZXJ2ZXJJZCk7Ci0JCQlzZXJ2ZXJJZFRvUHVibGlzaEluZm8ucmVtb3ZlKHNlcnZlcklkKTsKLQkJCXNhdmUoKTsKLQkJfQotCQlpZiAocGF0aDIgIT0gbnVsbCkgewotCQkJcGF0aC5hcHBlbmQocGF0aDIpLnRvRmlsZSgpLmRlbGV0ZSgpOwotCQkJcGF0aDIgPSBwYXRoMi5zdWJzdHJpbmcoMCwgcGF0aDIubGVuZ3RoKCkgLSAzKSArICJ4bWwiOwotCQkJcGF0aC5hcHBlbmQocGF0aDIpLnRvRmlsZSgpLmRlbGV0ZSgpOwotCQkJcGF0aDIgPSBwYXRoMi5zdWJzdHJpbmcoMCwgcGF0aDIubGVuZ3RoKCkgLSAzKSArICJkYXQiOwotCQkJcGF0aC5hcHBlbmQocGF0aDIpLnRvRmlsZSgpLmRlbGV0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZCgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyBwdWJsaXNoIGluZm8iKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgicHVibGlzaC54bWwiKS50b09TU3RyaW5nKCk7Ci0JCQotCQl0cnkgewotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oZmlsZW5hbWUpOwotCQkJCi0JCQlJTWVtZW50b1tdIHNlcnZlckNoaWxkID0gbWVtZW50by5nZXRDaGlsZHJlbigic2VydmVyIik7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlckNoaWxkLmxlbmd0aDsKLQkJCXNlcnZlcklkVG9QYXRoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KHNpemUgKyAyKTsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTdHJpbmcgaWQgPSBzZXJ2ZXJDaGlsZFtpXS5nZXRTdHJpbmcoImlkIik7Ci0JCQkJU3RyaW5nIHBhcnRpYWxQYXRoID0gc2VydmVyQ2hpbGRbaV0uZ2V0U3RyaW5nKCJwYXRoIik7Ci0JCQkJc2VydmVySWRUb1BhdGgucHV0KGlkLCBwYXJ0aWFsUGF0aCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgZ2xvYmFsIHB1Ymxpc2ggaW5mbyIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZSgpIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgicHVibGlzaC54bWwiKS50b09TU3RyaW5nKCk7Ci0JCQotCQl0cnkgewotCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoInB1Ymxpc2gtaW5mbyIpOwotCQkJCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlcklkVG9QYXRoLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIHNlcnZlcklkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZyBwYXJ0aWFsUGF0aCA9IHNlcnZlcklkVG9QYXRoLmdldChzZXJ2ZXJJZCk7Ci0JCQkJCi0JCQkJSU1lbWVudG8gc2VydmVyID0gbWVtZW50by5jcmVhdGVDaGlsZCgic2VydmVyIik7Ci0JCQkJc2VydmVyLnB1dFN0cmluZygiaWQiLCBzZXJ2ZXJJZCk7Ci0JCQkJc2VydmVyLnB1dFN0cmluZygicGF0aCIsIHBhcnRpYWxQYXRoKTsKLQkJCX0KLQkJCQotCQkJbWVtZW50by5zYXZlVG9GaWxlKGZpbGVuYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIGdsb2JhbCBwdWJsaXNoIGluZm8iLCBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hTZXJ2ZXJKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hTZXJ2ZXJKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkYmRlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoU2VydmVySm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotLyoqCi0gKiBKb2IgdG8gcHVibGlzaCB0byBhIHBhcnRpY3VsYXIgc2VydmVyLgotICogCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBBUEkgZGlyZWN0bHksIGl0IHdpbGwga2ljayBvZmYgam9icyBhcyByZXF1aXJlZAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaFNlcnZlckpvYiBleHRlbmRzIENoYWluZWRKb2IgewotCXByb3RlY3RlZCBpbnQga2luZDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjazsKLQlwcm90ZWN0ZWQgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXM7Ci0JcHJvdGVjdGVkIElBZGFwdGFibGUgaW5mbzsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBwdWJsaXNoaW5nIGpvYi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdG8gcHVibGlzaCB0bwotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIHB1Ymxpc2gKLQkgKiBAcGFyYW0gaW5mbyB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZQotCSAqICAgIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUKLQkgKiAgICB1c2VyIGlmIG5lY2Vzc2FyeS4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3QKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIKLQkgKiAgICBmb3IgdGhlIFNoZWxsIGNsYXNzLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoU2VydmVySm9iKElTZXJ2ZXIgc2VydmVyLCBpbnQga2luZCwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCXRoaXMoc2VydmVyLCBraW5kLCBudWxsLCBpbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcHVibGlzaGluZyBqb2IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHB1Ymxpc2ggdG8KLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBwdWJsaXNoCi0JICogQHBhcmFtIG1vZHVsZXMgYSBsaXN0IG9mIG1vZHVsZXMgdG8gcHVibGlzaCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiAgICBwdWJsaXNoIGFsbCBtb2R1bGVzCi0JICogQHBhcmFtIGluZm8gdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUKLQkgKiAgICBjYWxsZXIgaW4gb3JkZXIgdG8gc3VwcGx5IFVJIGluZm9ybWF0aW9uIGZvciBwcm9tcHRpbmcgdGhlCi0JICogICAgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90Ci0JICogICAgPGNvZGU+bnVsbDwvY29kZT4sIGl0IHNob3VsZCBtaW5pbWFsbHkgY29udGFpbiBhbiBhZGFwdGVyCi0JICogICAgZm9yIHRoZSBTaGVsbCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaFNlcnZlckpvYihJU2VydmVyIHNlcnZlciwgaW50IGtpbmQsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVzLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGluZywgc2VydmVyLmdldE5hbWUoKSksIHNlcnZlcik7Ci0JCXRoaXMua2luZCA9IGtpbmQ7Ci0JCXRoaXMubW9kdWxlcyA9IG1vZHVsZXM7Ci0JCXRoaXMuaW5mbyA9IGluZm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHB1Ymxpc2hpbmcgam9iLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0byBwdWJsaXNoIHRvCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgcHVibGlzaAotCSAqIEBwYXJhbSBjaGVjayB0byBjaGVjayBpZiBhdXRvLXB1Ymxpc2hpbmcgaXMgYWxyZWFkeSBjb3ZlcmluZyB0aGUgcHVibGlzaAotCSAqLwotCXB1YmxpYyBQdWJsaXNoU2VydmVySm9iKElTZXJ2ZXIgc2VydmVyLCBpbnQga2luZCwgYm9vbGVhbiBjaGVjaykgewotCQl0aGlzKHNlcnZlciwga2luZCwgbnVsbCwgbnVsbCk7Ci0JCXRoaXMuY2hlY2sgPSBjaGVjazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcHVibGlzaGluZyBqb2IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHB1Ymxpc2ggdG8KLQkgKiBAZGVwcmVjYXRlZCB1c2Ugb25lIG9mIHRoZSBvdGhlciBjb25zdHJ1Y3RvcnMgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBQdWJsaXNoU2VydmVySm9iKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXRoaXMoc2VydmVyLCBJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3J1bihJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy9pZiAoIWdldFNlcnZlcigpLnNob3VsZFB1Ymxpc2goKSkKLQkJLy8JcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlpZiAoY2hlY2sgJiYgIVNlcnZlckNvcmUuaXNBdXRvUHVibGlzaGluZygpKSB7Ci0JCQkvLyBkb24ndCBydW4gaWYgd2UncmUgYXV0by1wdWJsaXNoaW5nIGFuZCB0aGVyZSBpcyBubyBuZWVkIGZvciBhIHB1Ymxpc2guCi0JCQkvLyBjYW4ndCBleGVjdXRlIHRoaXMgY29kZSBpbiBzaG91bGRSdW4oKSBiZWNhdXNlIGl0IHdpbGwgY2FuY2VsIHRoZSBqb2IKLQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIGltbWVkaWF0ZWx5Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJCi0JCWZpbmFsIElTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKLQkJZ2V0U2VydmVyKCkucHVibGlzaChraW5kLCBtb2R1bGVzLCBpbmZvLCBuZXcgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0KSB7Ci0JCQkJc3RhdHVzWzBdID0gcmVzdWx0OwotCQkJfQotCQl9KTsKLQkJCi0JCXdoaWxlIChzdGF0dXNbMF0gPT0gbnVsbCAmICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJaWYgKHN0YXR1c1swXSAhPSBudWxsKQotCQkJcmV0dXJuIHN0YXR1c1swXTsKLQkJCi0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaFRhc2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Mzk2ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoVGFza0RlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hUYXNrIGltcGxlbWVudHMgSVB1Ymxpc2hUYXNrIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgUHVibGlzaFRhc2tEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIFB1Ymxpc2hUYXNrIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQgCi0JICovCi0JcHVibGljIFB1Ymxpc2hUYXNrKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlSWRzKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFNlcnZlclBsdWdpbi50b2tlbml6ZShlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZUlkcyIpLCAiLCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1R5cGUoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBTZXJ2ZXJQbHVnaW4uY29udGFpbnMoZ2V0VHlwZUlkcygpLCBpZCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQdWJsaXNoVGFzayNnZXREZWxlZ2F0ZSgpCi0JICovCi0JcHVibGljIFB1Ymxpc2hUYXNrRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCWRlbGVnYXRlID0gKFB1Ymxpc2hUYXNrRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5QRVJGT1JNQU5DRSwgIlB1Ymxpc2hUYXNrLmdldERlbGVnYXRlKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0SWQoKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUiICsgdG9TdHJpbmcoKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCS8qCi0JICogQHNlZQotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uW10gZ2V0VGFza3MoSVNlcnZlciBzZXJ2ZXIsIExpc3QgbW9kdWxlcykgewotCQl0cnkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiVGFzay5pbml0ICIgKyB0aGlzKTsKLQkJCVB1Ymxpc2hPcGVyYXRpb25bXSBwbyA9IGdldERlbGVnYXRlKCkuZ2V0VGFza3Moc2VydmVyLCBtb2R1bGVzKTsKLQkJCWlmIChwbyAhPSBudWxsKQotCQkJCXJldHVybiBwbzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JCXJldHVybiBuZXcgUHVibGlzaE9wZXJhdGlvblswXTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKElTZXJ2ZXIgc2VydmVyLCBpbnQga2luZCwgTGlzdCBtb2R1bGVzLCBMaXN0IGtpbmRMaXN0KSB7Ci0JCXRyeSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJUYXNrLmluaXQgIiArIHRoaXMpOwotCQkJUHVibGlzaE9wZXJhdGlvbltdIHBvID0gZ2V0RGVsZWdhdGUoKS5nZXRUYXNrcyhzZXJ2ZXIsIGtpbmQsIG1vZHVsZXMsIGtpbmRMaXN0KTsKLQkJCWlmIChwbyAhPSBudWxsKQotCQkJCXJldHVybiBwbzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JCXJldHVybiBuZXcgUHVibGlzaE9wZXJhdGlvblswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJQdWJsaXNoVGFza1siICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlODc4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hlckRlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hlciB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFB1Ymxpc2hlckRlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogUHVibGlzaGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQgCi0JICovCi0JcHVibGljIFB1Ymxpc2hlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qCi0JICogQHNlZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBTZXJ2ZXJQbHVnaW4udG9rZW5pemUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKSwgIiwiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCkgewotCQlyZXR1cm4gU2VydmVyUGx1Z2luLmNvbnRhaW5zKGdldFR5cGVJZHMoKSwgaWQpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHVibGlzaGVyI2dldERlbGVnYXRlKCkKLQkgKi8KLQlwdWJsaWMgUHVibGlzaGVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCWRlbGVnYXRlID0gKFB1Ymxpc2hlckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuUEVSRk9STUFOQ0UsICJQdWJsaXNoVGFzay5nZXREZWxlZ2F0ZSgpOiA8IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIj4gIiArIGdldElkKCkpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCksIHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiVGFzay5pbml0ICIgKyB0aGlzKTsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLmV4ZWN1dGUoa2luZCwgbW9uaXRvciwgaW5mbyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJFcnJvciBpbiBkZWxlZ2F0ZSIsIGUpOyAvLyBUT0RPCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQl0cnkgewotCQkJZ2V0RGVsZWdhdGUoKS5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gYSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlB1Ymxpc2hlclsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRkM2Q1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SZXNvdXJjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGU7Ci0vKioKLSAqIFJlc291cmNlTWFuYWdlciBoYW5kbGVzIHRoZSBtYXBwaW5ncyBiZXR3ZWVuIHJlc291cmNlcwotICogYW5kIHNlcnZlcnMgb3Igc2VydmVyIGNvbmZpZ3VyYXRpb25zLCBhbmQgY3JlYXRlcwotICogbm90aWZpY2F0aW9uIG9mIHNlcnZlcnMgb3Igc2VydmVyIGNvbmZpZ3VyYXRpb25zCi0gKiBiZWluZyBhZGRlZCBhbmQgcmVtb3ZlZC4KLSAqIAotICogPHA+U2VydmVycyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zIG1heSBiZSBhIHNpbmdsZQotICogcmVzb3VyY2UsIG9yIHRoZXkgbWF5IGJlIGEgZm9sZGVyIHRoYXQgY29udGFpbnMgYSBncm91cAotICogb2YgZmlsZXMuIEZvbGRlci1yZXNvdXJjZSBtYXkgbm90IGNvbnRhaW4gb3RoZXIgc2VydmVycwotICogb3IgY29uZmlndXJhdGlvbnMuPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0RBVEFfRklMRSA9ICJzZXJ2ZXJzLnhtbCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVWRU5UX0FEREVEID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVWRU5UX0NIQU5HRUQgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRVZFTlRfUkVNT1ZFRCA9IDI7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgaW5zdGFuY2UgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyKCk7Ci0KLQkvLyBjdXJyZW50bHkgYWN0aXZlIHJ1bnRpbWVzIGFuZCBzZXJ2ZXJzCi0JcHJvdGVjdGVkIExpc3Q8SVJ1bnRpbWU+IHJ1bnRpbWVzOwotCXByb3RlY3RlZCBMaXN0PElTZXJ2ZXI+IHNlcnZlcnM7Ci0KLQkvLyBsaWZlY3ljbGUgbGlzdGVuZXJzCi0JcHJvdGVjdGVkIExpc3Q8SVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcj4gcnVudGltZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcj4oMyk7Ci0JcHJvdGVjdGVkIExpc3Q8SVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyPiBzZXJ2ZXJMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcj4oMyk7Ci0KLQkvLyBjYWNoZSBmb3IgZGlzcG9zaW5nIHNlcnZlcnMgJiBydW50aW1lcwotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYWN0aXZlQnVuZGxlczsKLQotCS8vIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lcnMKLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwY2w7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBMaXN0IG1vZHVsZVNlcnZlckV2ZW50SGFuZGxlcnM7Ci0JcHJvdGVjdGVkIExpc3QgbW9kdWxlU2VydmVyRXZlbnRIYW5kbGVySW5kZXhlczsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXppbmc7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIExpc3Q8U3RyaW5nPiBzZXJ2ZXJQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0JLyoqCi0JICogU2VydmVyIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lci4KLQkgKiAKLQkgKiBSZXNvdXJjZSBsaXN0ZW5lciAtIHRyYWNrcyBjaGFuZ2VzIG9uIHNlcnZlciByZXNvdXJjZXMgc28gdGhhdAotCSAqIHdlIGNhbiByZWxvYWQvZHJvcCBzZXJ2ZXIgaW5zdGFuY2VzIGFuZCBjb25maWd1cmF0aW9ucyB0aGF0Ci0JICogbWF5IGNoYW5nZSBvdXRzaWRlIG9mIG91ciBjb250cm9sLgotCSAqIExpc3RlbnMgZm9yIHR3byB0eXBlcyBvZiBjaGFuZ2VzOgotCSAqIDEuIFNlcnZlcnMgb3IgY29uZmlndXJhdGlvbnMgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZAotCSAqICAgIGZyb20gdGhlaXIgcmVzcGVjdGl2ZSBmb2xkZXJzLiAoaW4gdGhlIGZ1dHVyZSwgaW5jbHVkaW5nCi0JICogICAgdGhlIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYSBmdWxsIHNlcnZlciBwcm9qZWN0LCB3aGljaAotCSAqICAgIHdlIGN1cnJlbnRseSBjYW4ndCBsaXN0ZW4gZm9yIGJlY2F1c2UgdGhlcmUgaXMgbm8gbmF0dXJlCi0JICogICAgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QgYXQgdGhpcyBwb2ludCAtIE9USSBkZWZlY3QpCi0JICogMi4gUHJvamVjdHMgYmVpbmcgZGVsZXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU2VydmVyUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIENyZWF0ZSBhIG5ldyBTZXJ2ZXJSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLgotCQkgKi8KLQkJcHVibGljIFNlcnZlclJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIExpc3RlbiBmb3IgcHJvamVjdHMgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZCBhbmQgYWN0IGFjY29yZGluZ2x5LgotCQkgKiAKLQkJICogQHBhcmFtIGV2ZW50IGEgcmVzb3VyY2UgY2hhbmdlIGV2ZW50Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCQotCQkJLy8gaWdub3JlIGNsZWFuIGJ1aWxkcwotCQkJaWYgKGV2ZW50LmdldEJ1aWxkS2luZCgpID09IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlUcmFjZS50cmFjZShUcmFjZS5SRVNPVVJDRVMsICItPi0gU2VydmVyUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNwb25kaW5nIHRvIHJlc291cmNlIGNoYW5nZTogIiArIGV2ZW50LmdldFR5cGUoKSArICIgLT4tIik7Ci0JCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBjaGlsZHJlbltpXS5nZXRSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCQlwcm9qZWN0Q2hhbmdlZCgoSVByb2plY3QpIHJlc291cmNlLCBjaGlsZHJlbltpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIHNlYXJjaCBmb3IgY2hhbmdlcyB0byBhbnkgcHJvamVjdCB1c2luZyBhIHZpc2l0b3IKLQkJCXRyeSB7Ci0JCQkJZGVsdGEuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIHZpc2l0b3JEZWx0YSkgewotCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gdmlzaXRvckRlbHRhLmdldFJlc291cmNlKCk7Ci0KLQkJCQkJCS8vIG9ubHkgcmVzcG9uZCB0byBwcm9qZWN0IGNoYW5nZXMKLQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJCQlwdWJsaXNoSGFuZGxlUHJvamVjdENoYW5nZSh2aXNpdG9yRGVsdGEpOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlc3BvbmRpbmcgdG8gcmVzb3VyY2UgY2hhbmdlIiwgZSk7Ci0JCQl9Ci0JCQkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgIi08LSBEb25lIFNlcnZlclJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzcG9uZGluZyB0byByZXNvdXJjZSBjaGFuZ2UgLTwtIik7Ci0JCX0KLQotCQkvKioKLQkJICogUmVhY3QgdG8gYSBjaGFuZ2Ugd2l0aGluIGEgcG9zc2libGUgc2VydmVyIHByb2plY3QuCi0JCSAqCi0JCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCQkgKiBAcGFyYW0gZGVsdGEgYSByZXNvdXJjZSBkZWx0YQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcHJvamVjdENoYW5nZWQoSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3QuZ2V0TmFtZSgpOwotCQkJaWYgKCFTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuaXNTZXJ2ZXJQcm9qZWN0KCkpIHsKLQkJCQlpZiAoIXNlcnZlclByb2plY3RzLmNvbnRhaW5zKHByb2plY3ROYW1lKSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5SRVNPVVJDRVMsICJOb3QgYSBzZXJ2ZXIgcHJvamVjdDogIiArIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlzZXJ2ZXJQcm9qZWN0cy5yZW1vdmUocHJvamVjdE5hbWUpOwotCQkJfSBlbHNlIGlmICghc2VydmVyUHJvamVjdHMuY29udGFpbnMocHJvamVjdE5hbWUpKQotCQkJCXNlcnZlclByb2plY3RzLmFkZChwcm9qZWN0TmFtZSk7Ci0JCQkKLQkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJUmVzb3VyY2VEZWx0YSBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJCQotCQkJCS8vIGxvb2sgZm9yIHNlcnZlcnMgYW5kIHNlcnZlciBjb25maWd1cmF0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCWNoaWxkLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEyKSB7Ci0JCQkJCQkJcmV0dXJuIGhhbmRsZVJlc291cmNlRGVsdGEoZGVsdGEyKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVzcG9uZGluZyB0byByZXNvdXJjZSBjaGFuZ2UiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYW5ub3QgZGlyZWN0bHkgY3JlYXRlIGEgUmVzb3VyY2VNYW5hZ2VyLiBVc2UKLQkgKiBTZXJ2ZXJzQ29yZS5nZXRSZXNvdXJjZU1hbmFnZXIoKS4KLQkgKi8KLQlwcml2YXRlIFJlc291cmNlTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzZXJ2ZXIgc3RhcnR1cCBleHRlbnNpb24gcG9pbnRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGV4ZWN1dGVTdGFydHVwcygpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLnN0YXJ0dXAgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiaW50ZXJuYWxTdGFydHVwIik7Ci0JCQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSVN0YXJ0dXAgc3RhcnR1cCA9IChJU3RhcnR1cCkgY2ZbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQl0cnkgewotCQkJCQlzdGFydHVwLnN0YXJ0dXAoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiU3RhcnR1cCBmYWlsZWQiICsgc3RhcnR1cC50b1N0cmluZygpLCBleCk7Ci0JCQkJfQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIHN0YXJ0dXA6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHN0YXJ0dXA6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5zdGFydHVwIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgaW5pdCgpIHsKLQkJaWYgKGluaXRpYWxpemVkIHx8IGluaXRpYWxpemluZykKLQkJCXJldHVybjsKLQkJCi0JCWluaXRpYWxpemluZyA9IHRydWU7Ci0JCQotCQkvLyBzZWUgd2hvJ3MgdHJpZ2dlcmluZyBBUEkgc3RhcnR1cAotCQkvKnRyeSB7Ci0JCQl0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ki8KLQkJCi0JCXNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7Ci0JCWFjdGl2ZUJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCWxvYWRSdW50aW1lc0xpc3QoKTsKLQkJbG9hZFNlcnZlcnNMaXN0KCk7Ci0JCQotCQlleGVjdXRlU3RhcnR1cHMoKTsKLQkJCi0JCXBjbCA9IG5ldyBQcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMpCi0JCQkJCXJldHVybjsKLQkJCQlTdHJpbmcgcHJvcGVydHkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJCWlmIChwcm9wZXJ0eS5lcXVhbHMoInJ1bnRpbWVzIikpIHsKLQkJCQkJbG9hZFJ1bnRpbWVzTGlzdCgpOwotCQkJCQlzYXZlUnVudGltZXNMaXN0KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBjbCk7Ci0JCQotCQlyZXNvbHZlU2VydmVycygpOwotCQkKLQkJLy8ga2VlcCB0cmFjayBvZiBmdXR1cmUgY2hhbmdlcyB0byB0aGUgZmlsZSBzeXN0ZW0KLQkJcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBTZXJ2ZXJSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFKTsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiTG9hZGluZyB3b3Jrc3BhY2Ugc2VydmVycyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zIik7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHByb2plY3RzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKFNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0c1tpXSkuaXNTZXJ2ZXJQcm9qZWN0KCkpIHsKLQkJCQkJU3RyaW5nIHByb2plY3ROYW1lID0gcHJvamVjdHNbaV0uZ2V0TmFtZSgpOwotCQkJCQlpZiAoIXNlcnZlclByb2plY3RzLmNvbnRhaW5zKHByb2plY3ROYW1lKSkKLQkJCQkJCXNlcnZlclByb2plY3RzLmFkZChwcm9qZWN0TmFtZSk7Ci0JCQkJCWxvYWRGcm9tUHJvamVjdChwcm9qZWN0c1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlhZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihTZXJ2ZXJMaXN0ZW5lci5nZXRJbnN0YW5jZSgpKTsKLQkJCi0JCWluaXRpYWxpemVkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGFsbCBvZiB0aGUgc2VydmVycyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zIGZyb20gdGhlIGdpdmVuIHByb2plY3QuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvYWRGcm9tUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiSW5pdGlhbCBzZXJ2ZXIgcmVzb3VyY2UgbG9hZCBmb3IgIiArIHByb2plY3QuZ2V0TmFtZSgpLCBudWxsKTsKLQkJZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJtID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCQotCQl0cnkgewotCQkJcHJvamVjdC5hY2NlcHQobmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgewotCQkJCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmCi0JCQkJCQlTZXJ2ZXIuRklMRV9FWFRFTlNJT04uZXF1YWxzKGdldEZpbGVFeHRlbnNpb24ocHJveHkuZ2V0TmFtZSgpKSkpIHsKLQkJCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlybS5oYW5kbGVOZXdGaWxlKGZpbGUsIG51bGwpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGR1cmluZyBpbml0aWFsIHNlcnZlciByZXNvdXJjZSBsb2FkIiwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSwgMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbG9hZCBzZXJ2ZXIgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCksIGUpOwotCQl9Ci0JfQotCQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKFN0cmluZyBuYW1lKSB7Ci0JCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpbmRleCA9PSAobmFtZS5sZW5ndGgoKSAtIDEpKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQlpbnN0YW5jZS5zaHV0ZG93bkltcGwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGR1cmluZyBzaHV0ZG93biIsIGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBY3RpdmVCdW5kbGUoU3RyaW5nIGJ1bmRsZUlkKSB7Ci0JCWlmIChhY3RpdmVCdW5kbGVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhY3RpdmVCdW5kbGVzLmNvbnRhaW5zKGJ1bmRsZUlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzaHV0ZG93bkJ1bmRsZShTdHJpbmcgaWQpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGRpc3Bvc2Ugc2VydmVycwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyIHNlcnZlciA9IChTZXJ2ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKFNlcnZlclR5cGUpIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7Ci0JCQkJaWYgKHNlcnZlclR5cGUgIT0gbnVsbCAmJiBpZC5lcXVhbHMoc2VydmVyVHlwZS5nZXROYW1lc3BhY2UoKSkpIHsKLQkJCQkJLy9zZXJ2ZXIuc3RvcCh0cnVlKTsKLQkJCQkJc2VydmVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBkaXNwb3Npbmcgc2VydmVyIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGRpc3Bvc2UgcnVudGltZXMKLQkJaXRlcmF0b3IgPSBydW50aW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSdW50aW1lIHJ1bnRpbWUgPSAoUnVudGltZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChSdW50aW1lVHlwZSkgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJCWlmIChydW50aW1lVHlwZSAhPSBudWxsICYmIGlkICE9IG51bGwgJiYgaWQuZXF1YWxzKHJ1bnRpbWVUeXBlLmdldE5hbWVzcGFjZSgpKSkgewotCQkJCQlydW50aW1lLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBkaXNwb3Npbmcgc2VydmVyIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNodXRkb3duSW1wbCgpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCWlmICh3b3Jrc3BhY2UgIT0gbnVsbCkKLQkJCXdvcmtzcGFjZS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBjbCk7Ci0JCQotCQlyZW1vdmVTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihTZXJ2ZXJMaXN0ZW5lci5nZXRJbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcihJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIkFkZGluZyBydW50aW1lIGxpZmVjeWNsZSBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHRvICIgKyB0aGlzKTsKLQkJCi0JCXN5bmNocm9uaXplZCAocnVudGltZUxpc3RlbmVycykgewotCQkJcnVudGltZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcihJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIlJlbW92aW5nIHJ1bnRpbWUgbGlmZWN5Y2xlIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgZnJvbSAiICsgdGhpcyk7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHJ1bnRpbWVMaXN0ZW5lcnMpIHsKLQkJCXJ1bnRpbWVMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIkFkZGluZyBzZXJ2ZXIgbGlmZWN5Y2xlIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgdG8gIiArIHRoaXMpOwotCQkKLQkJc3luY2hyb25pemVkIChzZXJ2ZXJMaXN0ZW5lcnMpIHsKLQkJCXNlcnZlckxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICJSZW1vdmluZyBzZXJ2ZXIgbGlmZWN5Y2xlIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgZnJvbSAiICsgdGhpcyk7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHNlcnZlckxpc3RlbmVycykgewotCQkJc2VydmVyTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZXJlZ2lzdGVyIGFuIGV4aXN0aW5nIHJ1bnRpbWUuCi0JICoKLQkgKiBAcGFyYW0gcnVudGltZQotCSAqLwotCXByaXZhdGUgdm9pZCBkZXJlZ2lzdGVyUnVudGltZShJUnVudGltZSBydW50aW1lKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5SRVNPVVJDRVMsICJEZXJlZ2lzdGVyaW5nIHJ1bnRpbWU6ICIgKyBydW50aW1lLmdldE5hbWUoKSk7Ci0JCQotCQlydW50aW1lcy5yZW1vdmUocnVudGltZSk7Ci0JCWZpcmVSdW50aW1lRXZlbnQocnVudGltZSwgRVZFTlRfUkVNT1ZFRCk7Ci0JCSgoUnVudGltZSlydW50aW1lKS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRGVyZWdpc3RlciBhbiBleGlzdGluZyBzZXJ2ZXIgcmVzb3VyY2UuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlcmVnaXN0ZXJTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiRGVyZWdpc3RlcmluZyBzZXJ2ZXI6ICIgKyBzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCSgoU2VydmVyKSBzZXJ2ZXIpLmRlbGV0ZU1ldGFkYXRhKCk7Ci0JCQotCQlzZXJ2ZXJzLnJlbW92ZShzZXJ2ZXIpOwotCQlmaXJlU2VydmVyRXZlbnQoc2VydmVyLCBFVkVOVF9SRU1PVkVEKTsKLQkJKChTZXJ2ZXIpc2VydmVyKS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHJ1bnRpbWUgZXZlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVSdW50aW1lRXZlbnQoZmluYWwgSVJ1bnRpbWUgcnVudGltZSwgYnl0ZSBiKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIi0+LSBGaXJpbmcgcnVudGltZSBldmVudDogIiArIHJ1bnRpbWUuZ2V0TmFtZSgpICsgIiAtPi0iKTsKLQkJCi0JCWlmIChydW50aW1lTGlzdGVuZXJzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJCi0JCXN5bmNocm9uaXplZCAocnVudGltZUxpc3RlbmVycykgewotCQkJZm9yIChJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIHNybCA6IHJ1bnRpbWVMaXN0ZW5lcnMpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICIgIEZpcmluZyBydW50aW1lIGV2ZW50IHRvICIgKyBzcmwpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChiID09IEVWRU5UX0FEREVEKQotCQkJCQkJc3JsLnJ1bnRpbWVBZGRlZChydW50aW1lKTsKLQkJCQkJZWxzZSBpZiAoYiA9PSBFVkVOVF9DSEFOR0VEKQotCQkJCQkJc3JsLnJ1bnRpbWVDaGFuZ2VkKHJ1bnRpbWUpOwotCQkJCQllbHNlCi0JCQkJCQlzcmwucnVudGltZVJlbW92ZWQocnVudGltZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBFcnJvciBmaXJpbmcgcnVudGltZSBldmVudCB0byAiICsgc3JsLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLTwtIERvbmUgZmlyaW5nIHJ1bnRpbWUgZXZlbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHNlcnZlciBldmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZVNlcnZlckV2ZW50KGZpbmFsIElTZXJ2ZXIgc2VydmVyLCBieXRlIGIpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLT4tIEZpcmluZyBzZXJ2ZXIgZXZlbnQ6ICIgKyBzZXJ2ZXIuZ2V0TmFtZSgpICsgIiAtPi0iKTsKLQkJCi0JCWlmIChzZXJ2ZXJMaXN0ZW5lcnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQkKLQkJc3luY2hyb25pemVkIChzZXJ2ZXJMaXN0ZW5lcnMpIHsKLQkJCWZvciAoSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIHNybCA6IHNlcnZlckxpc3RlbmVycykgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIiAgRmlyaW5nIHNlcnZlciBldmVudCB0byAiICsgc3JsKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoYiA9PSBFVkVOVF9BRERFRCkKLQkJCQkJCXNybC5zZXJ2ZXJBZGRlZChzZXJ2ZXIpOwotCQkJCQllbHNlIGlmIChiID09IEVWRU5UX0NIQU5HRUQpCi0JCQkJCQlzcmwuc2VydmVyQ2hhbmdlZChzZXJ2ZXIpOwotCQkJCQllbHNlCi0JCQkJCQlzcmwuc2VydmVyUmVtb3ZlZChzZXJ2ZXIpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgRXJyb3IgZmlyaW5nIHNlcnZlciBldmVudCB0byAiICsgc3JsLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLTwtIERvbmUgZmlyaW5nIHNlcnZlciBldmVudCAtPC0iKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUnVudGltZXNMaXN0KCkgewotCQl0cnkgewotCQkJaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSB0cnVlOwotCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoInJ1bnRpbWVzIik7Ci0JCQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcnVudGltZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlSdW50aW1lIHJ1bnRpbWUgPSAoUnVudGltZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQotCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgicnVudGltZSIpOwotCQkJCXJ1bnRpbWUuc2F2ZShjaGlsZCk7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyB4bWxTdHJpbmcgPSBtZW1lbnRvLnNhdmVUb1N0cmluZygpOwotCQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJcHJlZnMuc2V0VmFsdWUoInJ1bnRpbWVzIiwgeG1sU3RyaW5nKTsKLQkJCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgcnVudGltZXMiLCBlKTsKLQkJfQotCQlpZ25vcmVQcmVmZXJlbmNlQ2hhbmdlcyA9IGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlU2VydmVyc0xpc3QoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoU0VSVkVSX0RBVEFfRklMRSkudG9PU1N0cmluZygpOwotCQkKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJzZXJ2ZXJzIik7Ci0JCQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVNlcnZlciBzZXJ2ZXIgPSAoU2VydmVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJaWYgKHNlcnZlci5nZXRGaWxlKCkgPT0gbnVsbCkgewotCQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoInNlcnZlciIpOwotCQkJCQlzZXJ2ZXIuc2F2ZShjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQltZW1lbnRvLnNhdmVUb0ZpbGUoZmlsZW5hbWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgc2VydmVycyIsIGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFJ1bnRpbWVzTGlzdCgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyBydW50aW1lIGluZm8iKTsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgeG1sU3RyaW5nID0gcHJlZnMuZ2V0U3RyaW5nKCJydW50aW1lcyIpOwotCQkKLQkJcnVudGltZXMgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lPigpOwotCQlpZiAoeG1sU3RyaW5nICE9IG51bGwgJiYgeG1sU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoIlVURi04IikpOwotCQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGluKTsKLQkJCQkKLQkJCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigicnVudGltZSIpOwotCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCVJ1bnRpbWUgcnVudGltZSA9IG5ldyBSdW50aW1lKG51bGwpOwotCQkJCQlydW50aW1lLmxvYWRGcm9tTWVtZW50byhjaGlsZHJlbltpXSwgbnVsbCk7Ci0JCQkJCXJ1bnRpbWVzLmFkZChydW50aW1lKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBydW50aW1lcyIsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFNlcnZlcnNMaXN0KCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMb2FkaW5nIHNlcnZlciBpbmZvIik7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoU0VSVkVSX0RBVEFfRklMRSkudG9PU1N0cmluZygpOwotCQkKLQkJdHJ5IHsKLQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGZpbGVuYW1lKTsKLQkJCQotCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oInNlcnZlciIpOwotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmVyIHNlcnZlciA9IG5ldyBTZXJ2ZXIobnVsbCk7Ci0JCQkJc2VydmVyLmxvYWRGcm9tTWVtZW50byhjaGlsZHJlbltpXSwgbnVsbCk7Ci0JCQkJc2VydmVycy5hZGQoc2VydmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBzZXJ2ZXJzIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmICghaW5pdGlhbGl6ZWQpCi0JCQlpbml0KCk7Ci0JCQotCQlpZiAoIXJ1bnRpbWVzLmNvbnRhaW5zKHJ1bnRpbWUpKQotCQkJcmVnaXN0ZXJSdW50aW1lKHJ1bnRpbWUpOwotCQllbHNlCi0JCQlmaXJlUnVudGltZUV2ZW50KHJ1bnRpbWUsIEVWRU5UX0NIQU5HRUQpOwotCQlzYXZlUnVudGltZXNMaXN0KCk7Ci0JCXJlc29sdmVTZXJ2ZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUnVudGltZShJUnVudGltZSBydW50aW1lKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpCi0JCQlpbml0KCk7Ci0JCQotCQlpZiAocnVudGltZXMuY29udGFpbnMocnVudGltZSkpIHsKLQkJCWRlcmVnaXN0ZXJSdW50aW1lKHJ1bnRpbWUpOwotCQkJc2F2ZVJ1bnRpbWVzTGlzdCgpOwotCQkJcmVzb2x2ZVNlcnZlcnMoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZlcihJU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoIWluaXRpYWxpemVkKQotCQkJaW5pdCgpOwotCQkKLQkJaWYgKCFzZXJ2ZXJzLmNvbnRhaW5zKHNlcnZlcikpCi0JCQlyZWdpc3RlclNlcnZlcihzZXJ2ZXIpOwotCQllbHNlCi0JCQlmaXJlU2VydmVyRXZlbnQoc2VydmVyLCBFVkVOVF9DSEFOR0VEKTsKLQkJc2F2ZVNlcnZlcnNMaXN0KCk7Ci0JCXJlc29sdmVTZXJ2ZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VydmVyKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpCi0JCQlpbml0KCk7Ci0JCQotCQlpZiAoc2VydmVycy5jb250YWlucyhzZXJ2ZXIpKSB7Ci0JCQlkZXJlZ2lzdGVyU2VydmVyKHNlcnZlcik7Ci0JCQlzYXZlU2VydmVyc0xpc3QoKTsKLQkJCXJlc29sdmVTZXJ2ZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBydW50aW1lcy4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcnVudGltZXMKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVbXSBnZXRSdW50aW1lcygpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCWluaXQoKTsKLQkJCi0JCUxpc3Q8SVJ1bnRpbWU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lPihydW50aW1lcyk7Ci0JCQotCQlJUnVudGltZVtdIHIgPSBuZXcgSVJ1bnRpbWVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocik7Ci0JCXJldHVybiByOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICogCi0JICogQHBhcmFtIGlkIGEgcnVudGltZSBpZAotCSAqIEByZXR1cm4gSVJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0UnVudGltZShTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlpZiAoIWluaXRpYWxpemVkKQotCQkJaW5pdCgpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBydW50aW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocnVudGltZS5nZXRJZCgpLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIHJ1bnRpbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJ1bnRpbWVzKCkgewotCQlpZiAoIWluaXRpYWxpemVkKQotCQkJaW5pdCgpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBydW50aW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSdW50aW1lIHJ1bnRpbWUgPSAoUnVudGltZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJcnVudGltZS5yZXNvbHZlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlU2VydmVycygpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCWluaXQoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXIgc2VydmVyID0gKFNlcnZlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJc2VydmVyLnJlc29sdmUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgc2VydmVycy4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgc2VydmVycwotCSAqLwotCXB1YmxpYyBJU2VydmVyW10gZ2V0U2VydmVycygpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCWluaXQoKTsKLQkJCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzMiA9IG5ldyBJU2VydmVyW3NlcnZlcnMuc2l6ZSgpXTsKLQkJc2VydmVycy50b0FycmF5KHNlcnZlcnMyKTsKLQkJCi0JCXJldHVybiBzZXJ2ZXJzMjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICogCi0JICogQHBhcmFtIGlkIGEgc2VydmVyIGlkCi0JICogQHJldHVybiBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcihTdHJpbmcgaWQpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCWluaXQoKTsKLQkJCi0JCWlmIChpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyIHNlcnZlciA9IChTZXJ2ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpZC5lcXVhbHMoc2VydmVyLmdldElkKCkpKQotCQkJCXJldHVybiBzZXJ2ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXNvdXJjZSBjaGFuZ2Ugd2FzIGhhbmRsZWQuCi0JICoKLQkgKiBAcGFyYW0gZGVsdGEgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZURlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCWludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwotCQlpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UyID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCi0JCS8vIGlnbm9yZSBtYXJrZXJzCi0JCWlmIChraW5kID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgKGZsYWdzICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgIT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgIlJlc291cmNlIGNoYW5nZWQ6ICIgKyByZXNvdXJjZTIgKyAiICIgKyBraW5kKTsKLQkJCi0JCWlmIChyZXNvdXJjZTIgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2UyOwotCQkJaWYgKFNlcnZlci5GSUxFX0VYVEVOU0lPTi5lcXVhbHMoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7Ci0JCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbnVsbDsKLQkJCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgIT0gMCB8fCAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkKLQkJCQkJaGFuZGxlTW92ZWRGaWxlKGZpbGUsIGRlbHRhLCBtb25pdG9yKTsKLQkJCQllbHNlIGlmIChraW5kID09IElSZXNvdXJjZURlbHRhLkFEREVEKQotCQkJCQloYW5kbGVOZXdGaWxlKGZpbGUsIG1vbml0b3IpOwotCQkJCWVsc2UgaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkKLQkJCQkJaGFuZGxlUmVtb3ZlZEZpbGUoZmlsZSk7Ci0JCQkJZWxzZQotCQkJCQloYW5kbGVDaGFuZ2VkRmlsZShmaWxlLCBtb25pdG9yKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSByZXNvdXJjZTI7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpICYmIGZvbGRlci5lcXVhbHMoc2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSkKLQkJCQkJJiYgc2VydmVyLmdldEFkYXB0ZXIoU2VydmVyRGVsZWdhdGUuY2xhc3MpICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQkoKFNlcnZlcilzZXJ2ZXIpLmdldERlbGVnYXRlKG51bGwpLmNvbmZpZ3VyYXRpb25DaGFuZ2VkKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlNlcnZlciBmYWlsZWQgb24gY29uZmlndXJhdGlvbiBjaGFuZ2UiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIElTZXJ2ZXIgbG9hZFNlcnZlcihJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU2VydmVyIHNlcnZlciA9IG5ldyBTZXJ2ZXIoZmlsZSk7Ci0JCXNlcnZlci5sb2FkRnJvbUZpbGUobW9uaXRvcik7Ci0JCXJldHVybiBzZXJ2ZXI7Ci0JfQotCi0JLyoqCi0JICogVHJpZXMgdG8gbG9hZCBhIG5ldyBzZXJ2ZXIgcmVzb3VyY2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBsb2FkIGFuZCByZWdpc3RlciB3ZXJlIHN1Y2Nlc3NmdWwuCi0JICoKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlTmV3RmlsZShJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiaGFuZGxlTmV3RmlsZTogIiArIGZpbGUpOwotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAyMDAwKTsKLQkJCi0JCS8vIHRyeSBsb2FkaW5nIGEgc2VydmVyCi0JCWlmIChmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoU2VydmVyLkZJTEVfRVhURU5TSU9OKSkgewotCQkJdHJ5IHsKLQkJCQlJU2VydmVyIHNlcnZlciA9IGxvYWRTZXJ2ZXIoZmlsZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCkpOwotCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCQlpZiAoZ2V0U2VydmVyKHNlcnZlci5nZXRJZCgpKSA9PSBudWxsKQotCQkJCQkJYWRkU2VydmVyKHNlcnZlcik7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGxvYWRpbmcgc2VydmVyIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCW1vbml0b3IuZG9uZSgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVHJpZXMgdG8gbG9hZCBhIG5ldyBzZXJ2ZXIgcmVzb3VyY2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBsb2FkIGFuZCByZWdpc3RlciB3ZXJlIHN1Y2Nlc3NmdWwuCi0JICoKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhbmRsZU1vdmVkRmlsZShJRmlsZSBmaWxlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgImhhbmRsZU1vdmVkRmlsZTogIiArIGZpbGUpOwotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAyMDAwKTsKLQkJCi0JCUlQYXRoIGZyb21QYXRoID0gZGVsdGEuZ2V0TW92ZWRGcm9tUGF0aCgpOwotCQlpZiAoZnJvbVBhdGggIT0gbnVsbCkgewotCQkJSUZpbGUgZnJvbUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZnJvbVBhdGgpOwotCQkJaWYgKFNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyhmcm9tRmlsZS5nZXRQcm9qZWN0KCkpLmlzU2VydmVyUHJvamVjdCgpKSB7Ci0JCQkJU2VydmVyIHNlcnZlciA9IChTZXJ2ZXIpIGZpbmRTZXJ2ZXIoZnJvbUZpbGUpOwotCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQkJc2VydmVyLmZpbGUgPSBmaWxlOwotCQkJfSBlbHNlIHsKLQkJCQloYW5kbGVOZXdGaWxlKGZpbGUsIG1vbml0b3IpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSVBhdGggdG9QYXRoID0gZGVsdGEuZ2V0TW92ZWRUb1BhdGgoKTsKLQkJCUlGaWxlIHRvRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSh0b1BhdGgpOwotCQkJaWYgKFNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyh0b0ZpbGUuZ2V0UHJvamVjdCgpKS5pc1NlcnZlclByb2plY3QoKSkgewotCQkJCVNlcnZlciBzZXJ2ZXIgPSAoU2VydmVyKSBmaW5kU2VydmVyKGZpbGUpOwotCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQkJc2VydmVyLmZpbGUgPSB0b0ZpbGU7Ci0JCQl9IGVsc2UgewotCQkJCWhhbmRsZVJlbW92ZWRGaWxlKGZpbGUpOwotCQkJfQotCQl9Ci0JCQotCQltb25pdG9yLmRvbmUoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB0aGF0IGNhbWUgZnJvbSB0aGUgZ2l2ZW4gZmlsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgotCSAqIHNlcnZlcnMgKHtAbGluayAjZ2V0U2VydmVycygpfSkgZm9yIHRoZSBvbmUgd2l0aCBhIG1hdGNoaW5nCi0JICogbG9jYXRpb24gKHtAbGluayBTZXJ2ZXIjZ2V0RmlsZSgpfSkuIFRoZSBmaWxlIG1heSBub3QgYmUgbnVsbC4KLQkgKgotCSAqIEBwYXJhbSBmaWxlIGEgc2VydmVyIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAotCSAqICAgIHRoZXJlIGlzIG5vIHNlcnZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZmluZFNlcnZlcihJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoZmlsZS5lcXVhbHMoKChTZXJ2ZXIpc2VydmVyc1tpXSkuZ2V0RmlsZSgpKSkKLQkJCQkJcmV0dXJuIHNlcnZlcnNbaV07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVHJpZXMgdG8gaGFuZGxlIGEgcmVzb3VyY2UgY2hhbmdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlbG9hZAotCSAqIHdhcyBzdWNjZXNzZnVsLgotCSAqCi0JICogQHBhcmFtIGZpbGUgYSBmaWxlCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFuZGxlQ2hhbmdlZEZpbGUoSUZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgImhhbmRsZUNoYW5nZWRGaWxlOiAiICsgZmlsZSk7Ci0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEwMDApOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCi0JCUlTZXJ2ZXIgc2VydmVyID0gZmluZFNlcnZlcihmaWxlKTsKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlmb3VuZCA9IHRydWU7Ci0JCQl0cnkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgIlJlbG9hZGluZyBzZXJ2ZXI6ICIgKyBzZXJ2ZXIpOwotCQkJCSgoU2VydmVyKSBzZXJ2ZXIpLmxvYWRGcm9tRmlsZShtb25pdG9yKTsKLQkJCQlmaXJlU2VydmVyRXZlbnQoc2VydmVyLCBFVkVOVF9DSEFOR0VEKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVsb2FkaW5nIHNlcnZlciAiICsgc2VydmVyLmdldE5hbWUoKSArICIgZnJvbSAiICsgZmlsZSwgZSk7Ci0JCQkJcmVtb3ZlU2VydmVyKHNlcnZlcik7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiTm8gc2VydmVyIGZvdW5kIGF0OiAiICsgZmlsZSk7Ci0JCQotCQltb25pdG9yLmRvbmUoKTsKLQkJcmV0dXJuIGZvdW5kOwotCX0KLQotCS8qKgotCSAqIFRyaWVzIHRvIHJlbW92ZSBhIGN1cnJlbnQgcmVzb3VyY2UuIFJldHVybnMgdHJ1ZSBpZiB0aGUKLQkgKiBkZXJlZ2lzdGVyaW5nIHdhcyBzdWNjZXNzZnVsLgotCSAqCi0JICogQHBhcmFtIGZpbGUgYSBmaWxlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhbmRsZVJlbW92ZWRGaWxlKElGaWxlIGZpbGUpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiaGFuZGxlUmVtb3ZlZEZpbGU6ICIgKyBmaWxlKTsKLQkJCi0JCUlTZXJ2ZXIgc2VydmVyID0gZmluZFNlcnZlcihmaWxlKTsKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlyZW1vdmVTZXJ2ZXIoc2VydmVyKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5SRVNPVVJDRVMsICJObyBzZXJ2ZXIgZm91bmQgYXQ6ICIgKyBmaWxlKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEEgcHJvamVjdCBoYXMgY2hhbmdlZC4gSWYgdGhpcyBpcyBhbiBhZGQgb3IgcmVtb3ZlLCBjaGVjawotCSAqIHRvIHNlZSBpZiBpdCBpcyBwYXJ0IG9mIGEgY3VycmVudCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBkZWx0YSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hIYW5kbGVQcm9qZWN0Q2hhbmdlKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIj4gcHVibGlzaEhhbmRsZVByb2plY3RDaGFuZ2UgIiArIGRlbHRhLmdldFJlc291cmNlKCkpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmICghZGVsdGFDb250YWluc0NoYW5nZWRGaWxlcyhkZWx0YSkpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBwcm9jZXNzIG1vZHVsZSBjaGFuZ2VzCi0JCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUuaGFuZGxlR2xvYmFsUHJvamVjdENoYW5nZShwcm9qZWN0LCBkZWx0YSk7Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhwcm9qZWN0KTsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0gcHVibGlzaEhhbmRsZVByb2plY3RDaGFuZ2UiKTsKLQkJCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzMiA9IGdldFNlcnZlcnMoKTsKLQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJaW50IHNpemUyID0gc2VydmVyczIubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJaWYgKHNlcnZlcnMyW2pdLmdldEFkYXB0ZXIoU2VydmVyRGVsZWdhdGUuY2xhc3MpICE9IG51bGwpCi0JCQkJCSgoU2VydmVyKSBzZXJ2ZXJzMltqXSkuaGFuZGxlTW9kdWxlUHJvamVjdENoYW5nZShtb2R1bGVzW2ldKTsKLQkJCX0KLQkJfQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICI8IHB1Ymxpc2hIYW5kbGVQcm9qZWN0Q2hhbmdlIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgZmlsZSBpbiB0aGUgZGVsdGEgaXMgY2hhbmdlZCwKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgYSByZXNvdXJjZSBkZWx0YQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIGZpbGUgaW4gdGhlIGRlbHRhIGlzIGNoYW5nZWQsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsdGFDb250YWluc0NoYW5nZWRGaWxlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlmaW5hbCBib29sZWFuW10gYiA9IG5ldyBib29sZWFuWzFdOwotCQl0cnkgewotCQkJZGVsdGEuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWlmIChiWzBdKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgZGVsdGEyLmdldFJlc291cmNlKCkgKyAiICAiICsgZGVsdGEyLmdldEtpbmQoKSArICIgIiArIGRlbHRhMi5nZXRGbGFncygpKTsKLQkJCQkJaWYgKGRlbHRhMi5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlpZiAoZGVsdGEyLmdldFJlc291cmNlKCkgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJaWYgKGRlbHRhMi5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRAotCQkJCQkJCSYmIChkZWx0YTIuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpID09IDAKLQkJCQkJCQkmJiAoZGVsdGEyLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgPT0gMAotCQkJCQkJCSYmIChkZWx0YTIuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLlNZTkMpID09IDApCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkvL2lmIChkZWx0YTIuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsgLy8gJiYgZGVsdGEyLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGggPT0gMCkgewotCQkJCQkJYlswXSA9IHRydWU7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJLy9yZXR1cm4gdHJ1ZTsKLQkJCQkJCS8vfQotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJLy9UcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJEZWx0YSBjb250YWlucyBjaGFuZ2U6ICIgKyB0LmIpOwotCQlyZXR1cm4gYlswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYSBuZXcgcnVudGltZS4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3RlclJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgewotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiUmVnaXN0ZXJpbmcgcnVudGltZTogIiArIHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJCi0JCXJ1bnRpbWVzLmFkZChydW50aW1lKTsKLQkJZmlyZVJ1bnRpbWVFdmVudChydW50aW1lLCBFVkVOVF9BRERFRCk7Ci0JCQotCQlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChSdW50aW1lVHlwZSkgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQlTdHJpbmcgYnVuZGxlSWQgPSBydW50aW1lVHlwZS5nZXROYW1lc3BhY2UoKTsKLQkJaWYgKGFjdGl2ZUJ1bmRsZXMgIT0gbnVsbCAmJiAhYWN0aXZlQnVuZGxlcy5jb250YWlucyhidW5kbGVJZCkpCi0JCQlhY3RpdmVCdW5kbGVzLmFkZChidW5kbGVJZCk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGEgbmV3IHNlcnZlci4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiUmVnaXN0ZXJpbmcgc2VydmVyOiAiICsgc2VydmVyLmdldE5hbWUoKSk7Ci0JCQotCQlzZXJ2ZXJzLmFkZChzZXJ2ZXIpOwotCQlmaXJlU2VydmVyRXZlbnQoc2VydmVyLCBFVkVOVF9BRERFRCk7Ci0JCQotCQlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSAoU2VydmVyVHlwZSkgc2VydmVyLmdldFNlcnZlclR5cGUoKTsKLQkJU3RyaW5nIGJ1bmRsZUlkID0gc2VydmVyVHlwZS5nZXROYW1lc3BhY2UoKTsKLQkJaWYgKGFjdGl2ZUJ1bmRsZXMgIT0gbnVsbCAmJiAhYWN0aXZlQnVuZGxlcy5jb250YWlucyhidW5kbGVJZCkpCi0JCQlhY3RpdmVCdW5kbGVzLmFkZChidW5kbGVJZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2ZXIgcmVzb3VyY2UgbWFuYWdlciI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Jlc3RhcnRTZXJ2ZXJKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Jlc3RhcnRTZXJ2ZXJKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwZjJiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SZXN0YXJ0U2VydmVySm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogQSBqb2IgZm9yIHJlc3RhcnRpbmcgYSBzZXJ2ZXIuCi0gKiAKLSAqIEBkZXByZWNhdGVkIC0gdXNlIEFQSSBkaXJlY3RseSwgaXQgd2lsbCBraWNrIG9mZiBqb2JzIGFzIHJlcXVpcmVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXN0YXJ0U2VydmVySm9iIGV4dGVuZHMgQ2hhaW5lZEpvYiB7Ci0JcHJvdGVjdGVkIFN0cmluZyBsYXVuY2hNb2RlOwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVzdGFydENvbXBsZXRlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBJU3RhdHVzIHJlc3VsdFN0YXR1czsKLQotCXB1YmxpYyBSZXN0YXJ0U2VydmVySm9iKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5qb2JSZXN0YXJ0aW5nU2VydmVyLCBzZXJ2ZXIuZ2V0TmFtZSgpKSwgc2VydmVyKTsKLQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmpvYnMuSW50ZXJuYWxKb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgSVN0YXR1c1tdIHN0YXR1cyA9IG5ldyBJU3RhdHVzWzFdOwotCQlnZXRTZXJ2ZXIoKS5yZXN0YXJ0KGxhdW5jaE1vZGUsIG5ldyBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKLQkJCQlzdGF0dXNbMF0gPSByZXN1bHQ7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJd2hpbGUgKHN0YXR1c1swXSA9PSBudWxsICYgIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzWzBdOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzODFjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JbnRlcm5hbEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZSBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBJUnVudGltZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9SVU5USU1FX1RZUEVfSUQgPSAicnVudGltZS10eXBlLWlkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RFU1RfRU5WSVJPTk1FTlQgPSAidGVzdC1lbnZpcm9ubWVudCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TVFVCID0gInN0dWIiOwotCi0JcHJvdGVjdGVkIElSdW50aW1lVHlwZSBydW50aW1lVHlwZTsKLQlwcm90ZWN0ZWQgUnVudGltZURlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKi8KLQlwdWJsaWMgUnVudGltZShJRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKGZpbGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlCi0JICovCi0JcHVibGljIFJ1bnRpbWUoSUZpbGUgZmlsZSwgU3RyaW5nIGlkLCBJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJc3VwZXIoZmlsZSwgaWQpOwotCQl0aGlzLnJ1bnRpbWVUeXBlID0gcnVudGltZVR5cGU7Ci0JCW1hcC5wdXQoUFJPUF9OQU1FLCBydW50aW1lVHlwZS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWUjZ2V0UnVudGltZVR5cGUoKQotCSAqLwotCXB1YmxpYyBJUnVudGltZVR5cGUgZ2V0UnVudGltZVR5cGUoKSB7Ci0JCXJldHVybiBydW50aW1lVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lI3ZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUobW9uaXRvcikudmFsaWRhdGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgdmFsaWRhdGUoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lRGVsZWdhdGUgZ2V0RGVsZWdhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKQotCQkJcmV0dXJuIGRlbGVnYXRlOwotCQkKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlkZWxlZ2F0ZSA9ICgoUnVudGltZVR5cGUpIHJ1bnRpbWVUeXBlKS5jcmVhdGVSdW50aW1lRGVsZWdhdGUoKTsKLQkJCQkJSW50ZXJuYWxJbml0aWFsaXplci5pbml0aWFsaXplUnVudGltZURlbGVnYXRlKGRlbGVnYXRlLCB0aGlzLCBtb25pdG9yKTsKLQkJCQkJLy9kZWxlZ2F0ZS5pbml0aWFsaXplKHRoaXMpOwotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QRVJGT1JNQU5DRSwgIlJ1bnRpbWUuZ2V0RGVsZWdhdGUoKTogPCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICI+ICIgKyBnZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLmRpc3Bvc2UoKTsKLQkJCWRlbGVnYXRlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWUjY3JlYXRlV29ya2luZ0NvcHkoKQotCSAqLwotCXB1YmxpYyBJUnVudGltZVdvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gbmV3IFJ1bnRpbWVXb3JraW5nQ29weSh0aGlzKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVudGltZSNpc1dvcmtpbmdDb3B5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVudGltZSNnZXRMb2NhdGlvbigpCi0JICovCi0JcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgewotCQlTdHJpbmcgdGVtcCA9IGdldEF0dHJpYnV0ZShQUk9QX0xPQ0FUSU9OLCAoU3RyaW5nKW51bGwpOwotCQlpZiAodGVtcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgUGF0aCh0ZW1wKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRnJvbU1ldGFkYXRhKCkgewotCQlSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVSdW50aW1lKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVUb01ldGFkYXRhKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzdXBlci5zYXZlVG9NZXRhZGF0YShtb25pdG9yKTsKLQkJUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkUnVudGltZSh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFhNTFJvb3QoKSB7Ci0JCXJldHVybiAicnVudGltZSI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUZXN0RW52aXJvbm1lbnQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9URVNUX0VOVklST05NRU5ULCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVudGltZSNpc1N0dWIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3R1YigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1NUVUIsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbChSdW50aW1lV29ya2luZ0NvcHkgd2MpIHsKLQkJbWFwID0gd2MubWFwOwotCQlydW50aW1lVHlwZSA9IHdjLnJ1bnRpbWVUeXBlOwotCQlmaWxlID0gd2MuZmlsZTsKLQkJZGVsZWdhdGUgPSB3Yy5kZWxlZ2F0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlyZXNvbHZlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZSgpIHsKLQkJU3RyaW5nIHJ1bnRpbWVUeXBlSWQgPSBnZXRBdHRyaWJ1dGUoUFJPUF9SVU5USU1FX1RZUEVfSUQsIChTdHJpbmcpIG51bGwpOwotCQlpZiAocnVudGltZVR5cGVJZCAhPSBudWxsKQotCQkJcnVudGltZVR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lVHlwZShydW50aW1lVHlwZUlkKTsKLQkJZWxzZQotCQkJcnVudGltZVR5cGUgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCWlmIChydW50aW1lVHlwZSAhPSBudWxsKQotCQkJbWVtZW50by5wdXRTdHJpbmcoUFJPUF9SVU5USU1FX1RZUEVfSUQsIHJ1bnRpbWVUeXBlLmdldElkKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgUnVudGltZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlSdW50aW1lIHJ1bnRpbWUgPSAoUnVudGltZSkgb2JqOwotCQlyZXR1cm4gcnVudGltZS5nZXRJZCgpLmVxdWFscyhnZXRJZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoZGVsZWdhdGUpKQotCQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkJfQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWUjbG9hZEFkYXB0ZXIoQ2xhc3MsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkQWRhcHRlcihDbGFzcyBhZGFwdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0RGVsZWdhdGUobW9uaXRvcik7Ci0JCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoZGVsZWdhdGUpKQotCQkJcmV0dXJuIGRlbGVnYXRlOwotCQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlcih0aGlzLCBhZGFwdGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUnVudGltZVsiICsgZ2V0SWQoKSArICIsICIgKyBnZXROYW1lKCkgKyAiLCAiICsgZ2V0TG9jYXRpb24oKSArICIsICIgKyBnZXRSdW50aW1lVHlwZSgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lTG9jYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwMTZlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lTG9jYXRvckRlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVMb2NhdG9yIGltcGxlbWVudHMgSVJ1bnRpbWVMb2NhdG9yIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgUnVudGltZUxvY2F0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCXB1YmxpYyBSdW50aW1lTG9jYXRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBTZXJ2ZXJQbHVnaW4udG9rZW5pemUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKSwgIiwiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCkgewotCQlyZXR1cm4gU2VydmVyUGx1Z2luLmNvbnRhaW5zKGdldFR5cGVJZHMoKSwgaWQpOwotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lTG9jYXRvckRlbGVnYXRlIGdldERlbGVnYXRlKCkgewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChSdW50aW1lTG9jYXRvckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJ1bnRpbWVMb2NhdG9yI3NlYXJjaEZvclJ1bnRpbWVzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWFyY2hGb3JSdW50aW1lcyhJUGF0aCBwYXRoLCBmaW5hbCBJUnVudGltZVNlYXJjaExpc3RlbmVyIGZvdW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCS8vZ2V0RGVsZWdhdGUoKS5zZWFyY2hGb3JSdW50aW1lcyhwYXRoLCBmb3VuZCwgbW9uaXRvcik7Ci0JCQlnZXREZWxlZ2F0ZSgpLnNlYXJjaEZvclJ1bnRpbWVzKHBhdGgsIG5ldyBSdW50aW1lTG9jYXRvckRlbGVnYXRlLklSdW50aW1lU2VhcmNoTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVudGltZUZvdW5kKElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSkgewotCQkJCQlmb3VuZC5ydW50aW1lRm91bmQocnVudGltZSk7Ci0JCQkJfQotCQkJfSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUnVudGltZUxvY2F0b3JbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZDFkZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZURlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVUeXBlIGltcGxlbWVudHMgSVJ1bnRpbWVUeXBlIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgTGlzdDxJTW9kdWxlVHlwZT4gbW9kdWxlVHlwZXM7Ci0KLQlwdWJsaWMgUnVudGltZVR5cGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWZW5kb3IoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgdmVuZG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpOwotCQkJaWYgKHZlbmRvciAhPSBudWxsKQotCQkJCXJldHVybiB2ZW5kb3I7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gTWVzc2FnZXMuZGVmYXVsdFZlbmRvcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHZlcnNpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpOwotCQkJaWYgKHZlcnNpb24gIT0gbnVsbCkKLQkJCQlyZXR1cm4gdmVyc2lvbjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBNZXNzYWdlcy5kZWZhdWx0VmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZhY2V0UnVudGltZUNvbXBvbmVudCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZmFjZXRSdW50aW1lQ29tcG9uZW50Iik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjZXRSdW50aW1lVmVyc2lvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZmFjZXRSdW50aW1lVmVyc2lvbiIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUnVudGltZURlbGVnYXRlIGNyZWF0ZVJ1bnRpbWVEZWxlZ2F0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoUnVudGltZURlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3VwcG9ydGVkIG1vZHVsZSB0eXBlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1vZHVsZSB0eXBlcwotCSAqLwotCXB1YmxpYyBJTW9kdWxlVHlwZVtdIGdldE1vZHVsZVR5cGVzKCkgewotCQl0cnkgewotCQkJaWYgKG1vZHVsZVR5cGVzID09IG51bGwpCi0JCQkJbW9kdWxlVHlwZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlVHlwZXMoZWxlbWVudC5nZXRDaGlsZHJlbigibW9kdWxlVHlwZSIpKTsKLQkKLQkJCUlNb2R1bGVUeXBlW10gbXQgPSBuZXcgSU1vZHVsZVR5cGVbbW9kdWxlVHlwZXMuc2l6ZSgpXTsKLQkJCW1vZHVsZVR5cGVzLnRvQXJyYXkobXQpOwotCQkJcmV0dXJuIG10OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBJTW9kdWxlVHlwZVswXTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkNyZWF0ZSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBhID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Ci0JCQlyZXR1cm4gYSAhPSBudWxsICYmIGEubGVuZ3RoKCkgPiAwOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIElSdW50aW1lV29ya2luZ0NvcHkgY3JlYXRlUnVudGltZShTdHJpbmcgaWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlSdW50aW1lV29ya2luZ0NvcHkgcndjID0gbmV3IFJ1bnRpbWVXb3JraW5nQ29weShudWxsLCBpZCwgdGhpcyk7Ci0JCVNlcnZlclV0aWwuc2V0UnVudGltZURlZmF1bHROYW1lKHJ3Yyk7Ci0JCXJ3Yy5zZXREZWZhdWx0cyhtb25pdG9yKTsKLQkJcmV0dXJuIHJ3YzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQllbGVtZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlJ1bnRpbWVUeXBlWyIgKyBnZXRJZCgpICsgIiwgIiArIGdldE5hbWUoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZVdvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMDUxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSW50ZXJuYWxJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZURlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVXb3JraW5nQ29weSBleHRlbmRzIFJ1bnRpbWUgaW1wbGVtZW50cyBJUnVudGltZVdvcmtpbmdDb3B5IHsKLQlwcm90ZWN0ZWQgUnVudGltZSBydW50aW1lOwotCXByb3RlY3RlZCBXb3JraW5nQ29weUhlbHBlciB3Y2g7Ci0JCi0JcHJvdGVjdGVkIFJ1bnRpbWVEZWxlZ2F0ZSB3b3JraW5nQ29weURlbGVnYXRlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJ1bnRpbWUgd29ya2luZyBjb3B5IGZyb20gZXhpc3RpbmcgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZQotCSAqLwotCXB1YmxpYyBSdW50aW1lV29ya2luZ0NvcHkoUnVudGltZSBydW50aW1lKSB7Ci0JCXN1cGVyKHJ1bnRpbWUuZ2V0RmlsZSgpKTsKLQkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKLQkJCi0JCXJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkKLQkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHJ1bnRpbWUubWFwKTsKLQkJd2NoID0gbmV3IFdvcmtpbmdDb3B5SGVscGVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lIHdvcmtpbmcgY29weSBmb3IgYSBuZXcgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSBydW50aW1lVHlwZQotCSAqLwotCXB1YmxpYyBSdW50aW1lV29ya2luZ0NvcHkoSUZpbGUgZmlsZSwgU3RyaW5nIGlkLCBJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJc3VwZXIoZmlsZSwgaWQsIHJ1bnRpbWVUeXBlKTsKLQkJd2NoID0gbmV3IFdvcmtpbmdDb3B5SGVscGVyKHRoaXMpOwotCQl3Y2guc2V0RGlydHkodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVudGltZSNpc1dvcmtpbmdDb3B5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lI2NyZWF0ZVdvcmtpbmdDb3B5KCkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgdmFsdWUpIHsKLQkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdDxTdHJpbmc+IHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTWFwIHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weSNzZXROYW1lKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXdjaC5zZXROYW1lKG5hbWUpOwotCQlib29sZWFuIHNldCA9IGdldEF0dHJpYnV0ZShQUk9QX0lEX1NFVCwgZmFsc2UpOwotCQlpZiAocnVudGltZSA9PSBudWxsICYmICFzZXQpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9JRCwgbmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGVzdEVudmlyb25tZW50KGJvb2xlYW4gYikgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9URVNUX0VOVklST05NRU5ULCBiKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lV29ya2luZ0NvcHkjc2V0U3R1Yihib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0dWIoYm9vbGVhbiBiKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX1NUVUIsIGIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weSNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gd2NoLmlzRGlydHkoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUnVudGltZVdvcmtpbmdDb3B5I2dldE9yaWdpbmFsKCkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0T3JpZ2luYWwoKSB7Ci0JCXJldHVybiBydW50aW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weSNzZXRSZWFkT25seShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gYikgewotCQl3Y2guc2V0TG9ja2VkKGIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByaXZhdGUoYm9vbGVhbiBiKSB7Ci0JCXdjaC5zZXRQcml2YXRlKGIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weSNzZXRMb2NhdGlvbihJUGF0aCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihJUGF0aCBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9MT0NBVElPTiwgKFN0cmluZyludWxsKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKFBST1BfTE9DQVRJT04sIHBhdGgudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVudGltZVdvcmtpbmdDb3B5I3NhdmUoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWUgc2F2ZShib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuc2F2aW5nVGFzaywgZ2V0TmFtZSgpKSk7Ci0JCQotCQlpZiAoIWZvcmNlICYmIGdldE9yaWdpbmFsKCkgIT0gbnVsbCkKLQkJCXdjaC52YWxpZGF0ZVRpbWVzdGFtcCgoKFJ1bnRpbWUpIGdldE9yaWdpbmFsKCkpLmdldFRpbWVzdGFtcCgpKTsKLQkJCi0JCWludCB0aW1lc3RhbXAgPSBnZXRUaW1lc3RhbXAoKTsKLQkJbWFwLnB1dChQUk9QX1RJTUVTVEFNUCwgSW50ZWdlci50b1N0cmluZyh0aW1lc3RhbXArMSkpOwotCQkKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJ1bnRpbWUgPSBuZXcgUnVudGltZShmaWxlKTsKLQkJCi0JCVN0cmluZyBvbGRJZCA9IGdldElkKCk7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlib29sZWFuIHNldCA9IGdldEF0dHJpYnV0ZShQUk9QX0lEX1NFVCwgZmFsc2UpOwotCQlpZiAoIW9sZElkLmVxdWFscyhuYW1lKSAmJiAhc2V0KSB7Ci0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9JRCwgbmFtZSk7Ci0JCX0gZWxzZQotCQkJb2xkSWQgPSBudWxsOwotCQkKLQkJcnVudGltZS5zZXRJbnRlcm5hbCh0aGlzKTsKLQkJcnVudGltZS5zYXZlVG9NZXRhZGF0YShtb25pdG9yKTsKLQkJd2NoLnNldERpcnR5KGZhbHNlKTsKLQkJCi0JCXJldHVybiBydW50aW1lOwotCX0KLQotCXByb3RlY3RlZCBSdW50aW1lRGVsZWdhdGUgZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHdvcmtpbmdDb3B5RGVsZWdhdGUgIT0gbnVsbCkKLQkJCXJldHVybiB3b3JraW5nQ29weURlbGVnYXRlOwotCQkKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAod29ya2luZ0NvcHlEZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCXdvcmtpbmdDb3B5RGVsZWdhdGUgPSAoKFJ1bnRpbWVUeXBlKSBydW50aW1lVHlwZSkuY3JlYXRlUnVudGltZURlbGVnYXRlKCk7Ci0JCQkJCUludGVybmFsSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZVJ1bnRpbWVEZWxlZ2F0ZSh3b3JraW5nQ29weURlbGVnYXRlLCB0aGlzLCBtb25pdG9yKTsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEVSRk9STUFOQ0UsICJSdW50aW1lV29ya2luZ0NvcHkuZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZSgpOiA8IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIj4gIiArIGdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3b3JraW5nQ29weURlbGVnYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHdvcmtpbmdDb3B5RGVsZWdhdGUgIT0gbnVsbCkKLQkJCXdvcmtpbmdDb3B5RGVsZWdhdGUuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIHNlcnZlci4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciBjYW5ub3QgYmUgbnVsbCIpOwotCQl3Y2guYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCXdjaC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogRmlyZSBhIHByb3BlcnR5IGNoYW5nZSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIGEgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl3Y2guZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGRlZmF1bHRzLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlnZXRXb3JraW5nQ29weURlbGVnYXRlKG1vbml0b3IpLnNldERlZmF1bHRzKG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBzZXREZWZhdWx0cygpICIgKyB0b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGIzZWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLio7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXIgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSVNlcnZlciB7Ci0JLyoqCi0JICogU2VydmVyIGlkIGF0dHJpYnV0ZSAodmFsdWUgInNlcnZlci1pZCIpIG9mIGxhdW5jaCBjb25maWd1cmF0aW9ucy4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHRhZyBhIGxhdW5jaCBjb25maWd1cmF0aW9uIHdpdGggdGhlCi0JICogaWQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2VydmVyLgotCSAqIAotCSAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NFUlZFUl9JRCA9ICJzZXJ2ZXItaWQiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gRU1QVFlfTElTVCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigwKTsKLQotCS8qKgotCSAqIEZpbGUgZXh0ZW5zaW9uICh2YWx1ZSAic2VydmVyIikgZm9yIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YKLQkgKiBzZXJ2ZXIgaW5zdGFuY2VzLgotCSAqIDxwPgotCSAqIFtpc3N1ZTogV2hhdCBpcyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGlzIGZpbGUgZXh0ZW5zaW9uIGFuZAotCSAqIHRoZSBmaWxlIHBhc3NlZCB0byBJU2VydmVyVHlwZS5jcmVhdGUoLi4uKSBvciByZXR1cm5lZCBieQotCSAqIElTZXJ2ZXIuZ2V0RmlsZSgpPyBUaGF0IGlzLCBhcmUgc2VydmVyIGZpbGVzIGV4cGVjdGVkIHRvIGVuZAotCSAqIGluICIuc2VydmVyIiwgb3IgaXMgdGhpcyBqdXN0IGEgZGVmYXVsdD8gSWYgdGhlIGZvcm1lcgotCSAqIChhcyBJIHN1c3BlY3QpLCB0aGVuIElTZXJ2ZXJUeXBlLmNyZWF0ZSBuZWVkcyB0byBzYXkgc28sCi0JICogYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZW5mb3JjZSB0aGUgcmVzdHJpY3Rpb24uXQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0VYVEVOU0lPTiA9ICJzZXJ2ZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19QVUJMSVNIX0RJU0FCTEUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fUFVCTElTSF9FTkFCTEUgPSAyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9IT1NUTkFNRSA9ICJob3N0bmFtZSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0lEID0gInNlcnZlci1pZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRV9JRCA9ICJydW50aW1lLWlkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0lEID0gImNvbmZpZ3VyYXRpb24taWQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9MSVNUID0gIm1vZHVsZXMiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRElTQUJMRURfUEVSRkVSUkVEX1RBU0tTID0gImRpc2FibGVkLXByZWZlcnJlZC1wdWJsaXNoLXRhc2tzIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0VOQUJMRURfT1BUSU9OQUxfVEFTS1MgPSAiZW5hYmxlZC1vcHRpb25hbC1wdWJsaXNoLXRhc2tzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BVQkxJU0hFUlMgPSAicHVibGlzaGVycyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BVVRPX1BVQkxJU0hfVElNRSA9ICJhdXRvLXB1Ymxpc2gtdGltZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BVVRPX1BVQkxJU0hfU0VUVElORyA9ICJhdXRvLXB1Ymxpc2gtc2V0dGluZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TVEFSVF9USU1FT1VUID0gInN0YXJ0LXRpbWVvdXQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU1RPUF9USU1FT1VUID0gInN0b3AtdGltZW91dCI7CQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyW10gSU5WQUxJRF9DSEFSUyA9IG5ldyBjaGFyW10geydcXCcsICcvJywgJzonLCAnKicsICc/JywgJyInLCAnPCcsICc+JywgJ3wnLCAnXDAnLCAnQCcsICcmJ307Ci0KLQlwcm90ZWN0ZWQgSVNlcnZlclR5cGUgc2VydmVyVHlwZTsKLQlwcm90ZWN0ZWQgU2VydmVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0JcHJvdGVjdGVkIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIGJlaGF2aW91ckRlbGVnYXRlOwotCi0JcHJvdGVjdGVkIElSdW50aW1lIHJ1bnRpbWU7Ci0JcHJvdGVjdGVkIElGb2xkZXIgY29uZmlndXJhdGlvbjsKLQotCS8vIHRoZSBsaXN0IG9mIG1vZHVsZXMgdGhhdCBhcmUgdG8gYmUgcHVibGlzaGVkIHRvIHRoZSBzZXJ2ZXIKLQlwcm90ZWN0ZWQgTGlzdDxJTW9kdWxlPiBtb2R1bGVzOwotCi0JLy8gdGhlIGxpc3Qgb2YgZXh0ZXJuYWwgbW9kdWxlcwotCXByb3RlY3RlZCBMaXN0PElNb2R1bGU+IGV4dGVybmFsTW9kdWxlczsKLQotCS8vIHRyYW5zaWVudCBmaWVsZHMKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IFN0cmluZyBtb2RlID0gSUxhdW5jaE1hbmFnZXIuUlVOX01PREU7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBpbnQgc2VydmVyU3RhdGUgPSBTVEFURV9VTktOT1dOOwotCXByb3RlY3RlZCB0cmFuc2llbnQgaW50IHNlcnZlclN5bmNTdGF0ZTsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IGJvb2xlYW4gc2VydmVyUmVzdGFydE5lZWRlZDsKLQotCXByb3RlY3RlZCB0cmFuc2llbnQgTWFwPFN0cmluZywgSW50ZWdlcj4gbW9kdWxlU3RhdGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtb2R1bGVQdWJsaXNoU3RhdGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBNYXA8U3RyaW5nLCBCb29sZWFuPiBtb2R1bGVSZXN0YXJ0U3RhdGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7Ci0KLQlwcm90ZWN0ZWQgdHJhbnNpZW50IElTdGF0dXMgc2VydmVyU3RhdHVzOwotCXByb3RlY3RlZCB0cmFuc2llbnQgTWFwPFN0cmluZywgSVN0YXR1cz4gbW9kdWxlU3RhdHVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJU3RhdHVzPigpOwotCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBTZXJ2ZXJQdWJsaXNoSW5mbyBwdWJsaXNoSW5mbzsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IEF1dG9QdWJsaXNoVGhyZWFkIGF1dG9QdWJsaXNoVGhyZWFkOwotCi0JLyoqCi0JICogVGhlIG1vc3QgcmVjZW50IGxhdW5jaCB1c2VkIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIuCi0JICovCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBJTGF1bmNoIGxhdW5jaDsKLQotLyoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RhdGVTdHJpbmdzID0gbmV3IFN0cmluZ1tdIHsKLQkJInVua25vd24iLCAic3RhcnRpbmciLCAic3RhcnRlZCIsICJzdGFydGVkX2RlYnVnIiwKLQkJInN0b3BwaW5nIiwgInN0b3BwZWQiLCAic3RhcnRlZF91bnN1cHBvcnRlZCIsICJzdGFydGVkX3Byb2ZpbGUiCi0JfTsqLwotCi0JLy8gcHVibGlzaCBsaXN0ZW5lcnMKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IExpc3Q8SVB1Ymxpc2hMaXN0ZW5lcj4gcHVibGlzaExpc3RlbmVyczsKLQotCS8vIHNlcnZlciBsaXN0ZW5lcnMKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIgbm90aWZpY2F0aW9uTWFuYWdlcjsKLQotCXB1YmxpYyBjbGFzcyBBdXRvUHVibGlzaFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JCXB1YmxpYyBib29sZWFuIHN0b3A7Ci0JCXB1YmxpYyBpbnQgdGltZSA9IDA7Ci0KLQkJcHVibGljIEF1dG9QdWJsaXNoVGhyZWFkKCkgewotCQkJc3VwZXIoIkF1dG9tYXRpYyBQdWJsaXNoaW5nIik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJBdXRvLXB1Ymxpc2ggdGhyZWFkIHN0YXJ0aW5nIGZvciAiICsgU2VydmVyLnRoaXMgKyAiIC0gIiArIHRpbWUgKyAicyIpOwotCQkJaWYgKHN0b3ApCi0JCQkJcmV0dXJuOwotCQkJCi0JCQl0cnkgewotCQkJCXNsZWVwKHRpbWUgKiAxMDAwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQkKLQkJCWlmIChzdG9wKQotCQkJCXJldHVybjsKLQkJCQotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQXV0by1wdWJsaXNoIHRocmVhZCBwdWJsaXNoaW5nICIgKyBTZXJ2ZXIudGhpcyk7Ci0JCQkKLQkJCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCXB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0FVVE8sIG51bGwsIG51bGwsIG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIFJlc291cmNlQ2hhbmdlSm9iIGV4dGVuZHMgSm9iIHsKLQkJcHJpdmF0ZSBJTW9kdWxlIG1vZHVsZTsKLQotCQlwdWJsaWMgUmVzb3VyY2VDaGFuZ2VKb2IoSU1vZHVsZSBtb2R1bGUpIHsKLQkJCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLmpvYlVwZGF0ZVNlcnZlciwgU2VydmVyLnRoaXMuZ2V0TmFtZSgpKSk7Ci0JCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJCQotCQkJaWYgKG1vZHVsZS5nZXRQcm9qZWN0KCkgPT0gbnVsbCkKLQkJCQlzZXRSdWxlKFNlcnZlci50aGlzKTsKLQkJCWVsc2UgewotCQkJCUlTY2hlZHVsaW5nUnVsZVtdIHJ1bGVzID0gbmV3IElTY2hlZHVsaW5nUnVsZVsyXTsKLQkJCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOwotCQkJCXJ1bGVzWzBdID0gcnVsZUZhY3RvcnkuY3JlYXRlUnVsZShtb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQkJCQlydWxlc1sxXSA9IFNlcnZlci50aGlzOwotCQkJCXNldFJ1bGUoTXVsdGlSdWxlLmNvbWJpbmUocnVsZXMpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQlyZXR1cm4gU2VydmVyVXRpbC5TRVJWRVJfSk9CX0ZBTUlMWS5lcXVhbHMoZmFtaWx5KTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU2VydmVyIGdldFNlcnZlcigpIHsKLQkJCXJldHVybiBTZXJ2ZXIudGhpczsKLQkJfQotCi0JCXByb3RlY3RlZCBJTW9kdWxlIGdldE1vZHVsZSgpIHsKLQkJCXJldHVybiBtb2R1bGU7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlmaW5hbCBib29sZWFuW10gY2hhbmdlZCA9IG5ldyBib29sZWFuWzFdOwotCQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXMyID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlW10+KCk7Ci0JCQkKLQkJCUlNb2R1bGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSU1vZHVsZVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZTIpIHsKLQkJCQkJbW9kdWxlczIuYWRkKG1vZHVsZTIpOwotCQkJCQkKLQkJCQkJaW50IHNpemUgPSBtb2R1bGUyLmxlbmd0aDsKLQkJCQkJSU1vZHVsZSBtID0gbW9kdWxlMltzaXplIC0gMV07Ci0JCQkJCWlmIChtLmdldFByb2plY3QoKSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQotCQkJCQlpZiAoZ2V0TW9kdWxlKCkuZXF1YWxzKG0pKSB7Ci0JCQkJCQlpZiAoaGFzUHVibGlzaGVkUmVzb3VyY2VEZWx0YShtb2R1bGUyKSkgewotCQkJCQkJCWNoYW5nZWRbMF0gPSB0cnVlOwotCQkJCQkJCXNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUyLCBJU2VydmVyLlBVQkxJU0hfU1RBVEVfSU5DUkVNRU5UQUwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX07Ci0JCQkKLQkJCXZpc2l0KHZpc2l0b3IsIG51bGwpOwotCQkJCi0JCQlpZiAoZ2V0U2VydmVyUHVibGlzaEluZm8oKS5oYXNTdHJ1Y3R1cmVDaGFuZ2VkKG1vZHVsZXMyKSkKLQkJCQlzZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoSVNlcnZlci5QVUJMSVNIX1NUQVRFX0lOQ1JFTUVOVEFMKTsKLQkJCQotCQkJaWYgKCFjaGFuZ2VkWzBdKQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCi0JCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQgJiYgYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCkKLQkJCQliZWhhdmlvdXJEZWxlZ2F0ZS5oYW5kbGVSZXNvdXJjZUNoYW5nZSgpOwotCQkJCi0JCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCi0JCQkJYXV0b1B1Ymxpc2goKTsKLQkJCQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgUHVibGlzaEpvYiBleHRlbmRzIEpvYiB7Ci0JCXByb3RlY3RlZCBpbnQga2luZDsKLQkJcHJvdGVjdGVkIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVzNDsKLQkJcHJvdGVjdGVkIElBZGFwdGFibGUgaW5mbzsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnQ7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhIG5ldyBwdWJsaXNoaW5nIGpvYi4KLQkJICogCi0JCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIHB1Ymxpc2gKLQkJICogQHBhcmFtIG1vZHVsZXM0IGEgbGlzdCBvZiBtb2R1bGVzIHRvIHB1Ymxpc2gsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JCSAqICAgIHB1Ymxpc2ggYWxsIG1vZHVsZXMKLQkJICogQHBhcmFtIHN0YXJ0IHRydWUgaWYgd2UgbmVlZCB0byBzdGFydCB0aGUgc2VydmVyIGZpcnN0Ci0JCSAqIEBwYXJhbSBpbmZvIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlCi0JCSAqICAgIGNhbGxlciBpbiBvcmRlciB0byBzdXBwbHkgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUKLQkJICogICAgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90Ci0JCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlcgotCQkgKiAgICBmb3IgdGhlIFNoZWxsIGNsYXNzLgotCQkgKi8KLQkJcHVibGljIFB1Ymxpc2hKb2IoaW50IGtpbmQsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVzNCwgYm9vbGVhbiBzdGFydCwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5wdWJsaXNoaW5nLCBTZXJ2ZXIudGhpcy5nZXROYW1lKCkpKTsKLQkJCXRoaXMua2luZCA9IGtpbmQ7Ci0JCQl0aGlzLm1vZHVsZXM0ID0gbW9kdWxlczQ7Ci0JCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0JCQl0aGlzLmluZm8gPSBpbmZvOwotCQkJCi0JCQkvLyAxMDIyMjcgLSBsb2NrIGVudGlyZSB3b3Jrc3BhY2UgZHVyaW5nIHB1Ymxpc2gKLQkJCUlTY2hlZHVsaW5nUnVsZSBydWxlID0gTXVsdGlSdWxlLmNvbWJpbmUobmV3IElTY2hlZHVsaW5nUnVsZVtdIHsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBTZXJ2ZXIudGhpcwotCQkJfSk7Ci0JCQlzZXRSdWxlKHJ1bGUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJaWYgKHN0YXJ0KSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBzdGFydEltcGwoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG1vbml0b3IpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gcHVibGlzaEltcGwoa2luZCwgbW9kdWxlczQsIGluZm8sIG1vbml0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIFN0YXJ0Sm9iIGV4dGVuZHMgSm9iIHsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIFBVQkxJU0hfTk9ORSA9IDA7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBQVUJMSVNIX0JFRk9SRSA9IDE7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBQVUJMSVNIX0FGVEVSID0gMjsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGxhdW5jaE1vZGU7Ci0JCXByb3RlY3RlZCBieXRlIHB1Ymxpc2g7Ci0KLQkJcHVibGljIFN0YXJ0Sm9iKFN0cmluZyBsYXVuY2hNb2RlLCBieXRlIHB1Ymxpc2gpIHsKLQkJCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLmpvYlN0YXJ0aW5nU2VydmVyLCBTZXJ2ZXIudGhpcy5nZXROYW1lKCkpKTsKLQkJCXRoaXMubGF1bmNoTW9kZSA9IGxhdW5jaE1vZGU7Ci0JCQl0aGlzLnB1Ymxpc2ggPSBwdWJsaXNoOwotCQkJCi0JCQlpZiAocHVibGlzaCAhPSBQVUJMSVNIX05PTkUpIHsKLQkJCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOwotCQkJCQotCQkJCS8vIDEwMjIyNyAtIGxvY2sgZW50aXJlIHdvcmtzcGFjZSBkdXJpbmcgcHVibGlzaAkJCi0JCQkJSVNjaGVkdWxpbmdSdWxlW10gcnVsZXMgPSBuZXcgSVNjaGVkdWxpbmdSdWxlWzJdOwotCQkJCXJ1bGVzWzBdID0gcnVsZUZhY3RvcnkuY3JlYXRlUnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJCQlydWxlc1sxXSA9IFNlcnZlci50aGlzOwotCQkJCQotCQkJCXNldFJ1bGUoTXVsdGlSdWxlLmNvbWJpbmUocnVsZXMpKTsKLQkJCX0gZWxzZQotCQkJCXNldFJ1bGUoU2VydmVyLnRoaXMpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwotCQl9Ci0KLQkJcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQkJcmV0dXJuIFNlcnZlci50aGlzOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJaWYgKHB1Ymxpc2ggPT0gUFVCTElTSF9CRUZPUkUpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHB1Ymxpc2hJbXBsKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbnVsbCwgbnVsbCwgbW9uaXRvcik7Ci0JCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCQkKLQkJCUlTdGF0dXMgc3RhdCA9IHN0YXJ0SW1wbChsYXVuY2hNb2RlLCBtb25pdG9yKTsKLQkJCQotCQkJaWYgKCBJU3RhdHVzLkVSUk9SICE9IHN0YXQuZ2V0U2V2ZXJpdHkoKSApIHsKLQkJCQlpZiAocHVibGlzaCA9PSBQVUJMSVNIX0FGVEVSKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gcHVibGlzaEltcGwoSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsLCBudWxsLCBtb25pdG9yKTsKLQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdGF0OwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIFJlc3RhcnRKb2IgZXh0ZW5kcyBKb2IgewotCQlwcm90ZWN0ZWQgU3RyaW5nIGxhdW5jaE1vZGU7Ci0KLQkJcHVibGljIFJlc3RhcnRKb2IoU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLmpvYlJlc3RhcnRpbmdTZXJ2ZXIsIFNlcnZlci50aGlzLmdldE5hbWUoKSkpOwotCQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQkJCXNldFJ1bGUoU2VydmVyLnRoaXMpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCXJldHVybiBTZXJ2ZXJVdGlsLlNFUlZFUl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJcmV0dXJuIHJlc3RhcnRJbXBsKGxhdW5jaE1vZGUsIG1vbml0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIFN0b3BKb2IgZXh0ZW5kcyBKb2IgewotCQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3JjZTsKLQotCQlwdWJsaWMgU3RvcEpvYihib29sZWFuIGZvcmNlKSB7Ci0JCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5qb2JTdG9wcGluZ1NlcnZlciwgU2VydmVyLnRoaXMuZ2V0TmFtZSgpKSk7Ci0JCQlzZXRSdWxlKFNlcnZlci50aGlzKTsKLQkJCXRoaXMuZm9yY2UgPSBmb3JjZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQlyZXR1cm4gU2VydmVyVXRpbC5TRVJWRVJfSk9CX0ZBTUlMWS5lcXVhbHMoZmFtaWx5KTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXJldHVybiBzdG9wSW1wbChmb3JjZSwgbW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFB1Ymxpc2hPcGVyYXRpb24+IFBVQkxJU0hfT1BFUkFUSU9OX0NPTVBBUlRPUiA9IG5ldyBDb21wYXJhdG9yPFB1Ymxpc2hPcGVyYXRpb24+KCkgewotICAgICAgcHVibGljIGludCBjb21wYXJlKFB1Ymxpc2hPcGVyYXRpb24gbGVmdE9wLCBQdWJsaXNoT3BlcmF0aW9uIHJpZ2h0T3ApIHsKLSAgICAgICAgICBQdWJsaXNoT3BlcmF0aW9uIGxlZnQgPSBsZWZ0T3A7Ci0gICAgICAgICAgUHVibGlzaE9wZXJhdGlvbiByaWdodCA9IHJpZ2h0T3A7Ci0gICAgICAgICAgaWYgKGxlZnQuZ2V0T3JkZXIoKSA+IHJpZ2h0LmdldE9yZGVyKCkpCi0gICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgIGlmIChsZWZ0LmdldE9yZGVyKCkgPCByaWdodC5nZXRPcmRlcigpKQotICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0JfTsKLQotCS8vIHdvcmtpbmcgY29weSwgbG9hZGVkIHJlc291cmNlCi0JcHVibGljIFNlcnZlcihJRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKGZpbGUpOwotCQltYXAucHV0KFBST1BfSE9TVE5BTUUsICJsb2NhbGhvc3QiKTsKLQl9Ci0KLQkvLyBjcmVhdGlvbiAod29ya2luZyBjb3B5KQotCXB1YmxpYyBTZXJ2ZXIoU3RyaW5nIGlkLCBJRmlsZSBmaWxlLCBJUnVudGltZSBydW50aW1lLCBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7Ci0JCXN1cGVyKGZpbGUsIGlkKTsKLQkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKLQkJdGhpcy5zZXJ2ZXJUeXBlID0gc2VydmVyVHlwZTsKLQkJbWFwLnB1dCgic2VydmVyLXR5cGUtaWQiLCBzZXJ2ZXJUeXBlLmdldElkKCkpOwotCQltYXAucHV0KFBST1BfSE9TVE5BTUUsICJsb2NhbGhvc3QiKTsKLQkJbWFwLnB1dChQUk9QX1NUQVJUX1RJTUVPVVQsICgoU2VydmVyVHlwZSlzZXJ2ZXJUeXBlKS5nZXRTdGFydFRpbWVvdXQoKS8xMDAwICsgIiIpOwotCQltYXAucHV0KFBST1BfU1RPUF9USU1FT1VULCAoKFNlcnZlclR5cGUpc2VydmVyVHlwZSkuZ2V0U3RvcFRpbWVvdXQoKS8xMDAwICsgIiIpOwotCQlpZiAocnVudGltZSAhPSBudWxsICYmIHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXROYW1lKCk7Ci0JCQltYXAucHV0KFBST1BfTkFNRSwgbmFtZSk7Ci0JCX0KLQkJc2VydmVyU3RhdGUgPSAoKFNlcnZlclR5cGUpc2VydmVyVHlwZSkuZ2V0SW5pdGlhbFN0YXRlKCk7Ci0JfQotCQotCXB1YmxpYyBJU2VydmVyVHlwZSBnZXRTZXJ2ZXJUeXBlKCkgewotCQlyZXR1cm4gc2VydmVyVHlwZTsKLQl9Ci0JCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIG5ldyBTZXJ2ZXJXb3JraW5nQ29weSh0aGlzKTsgCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZyb21GaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5kZWxldGVGcm9tRmlsZSgpOwotCQlSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVTZXJ2ZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRnJvbU1ldGFkYXRhKCkgewotCQlSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVTZXJ2ZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5kb1NhdmUobW9uaXRvcik7Ci0JCWZpcmVTZXJ2ZXJDaGFuZ2VFdmVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVUb0ZpbGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNhdmVUb0ZpbGUobW9uaXRvcik7Ci0JCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFNlcnZlcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlVG9NZXRhZGF0YShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3VwZXIuc2F2ZVRvTWV0YWRhdGEobW9uaXRvcik7Ci0JCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFNlcnZlcih0aGlzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXMjZ2V0UnVudGltZSgpCi0JICovCi0JcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWUoKSB7Ci0JCXJldHVybiBydW50aW1lOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UnVudGltZUlkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFJVTlRJTUVfSUQsIChTdHJpbmcpIG51bGwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyQXR0cmlidXRlcyNnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSUZvbGRlciBnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VydmVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsIHx8IHNlcnZlclR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkJCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJZGVsZWdhdGUgPSAoKFNlcnZlclR5cGUpIHNlcnZlclR5cGUpLmNyZWF0ZVNlcnZlckRlbGVnYXRlKCk7Ci0JCQkJCUludGVybmFsSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZVNlcnZlckRlbGVnYXRlKGRlbGVnYXRlLCBTZXJ2ZXIudGhpcywgbW9uaXRvcik7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBFUkZPUk1BTkNFLCAiU2VydmVyLmdldERlbGVnYXRlKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JcHJvdGVjdGVkIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIGdldEJlaGF2aW91ckRlbGVnYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCB8fCBzZXJ2ZXJUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGU7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKG1vZHVsZVN0YXRlKSB7Ci0JCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQliZWhhdmlvdXJEZWxlZ2F0ZSA9ICgoU2VydmVyVHlwZSkgc2VydmVyVHlwZSkuY3JlYXRlU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUoKTsKLQkJCQkJSW50ZXJuYWxJbml0aWFsaXplci5pbml0aWFsaXplU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUoYmVoYXZpb3VyRGVsZWdhdGUsIFNlcnZlci50aGlzLCBtb25pdG9yKTsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEVSRk9STUFOQ0UsICJTZXJ2ZXIuZ2V0QmVoYXZpb3VyRGVsZWdhdGUoKTogPCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICI+ICIgKyBnZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0JCQkJCQotCQkJCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCi0JCQkJCQlhdXRvUHVibGlzaCgpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgYmVoYXZpb3VyIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJlaGF2aW91ckRlbGVnYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JCQlkZWxlZ2F0ZSA9IG51bGw7Ci0JCX0KLQkJaWYgKGJlaGF2aW91ckRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWJlaGF2aW91ckRlbGVnYXRlLmRpc3Bvc2UoKTsKLQkJCWJlaGF2aW91ckRlbGVnYXRlID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX0hPU1ROQU1FLCAibG9jYWxob3N0Iik7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdXRvUHVibGlzaFRpbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9BVVRPX1BVQkxJU0hfVElNRSwgMTUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXV0b1B1Ymxpc2hTZXR0aW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfQVVUT19QVUJMSVNIX1NFVFRJTkcsIEFVVE9fUFVCTElTSF9FTkFCTEUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRUaW1lb3V0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfU1RBUlRfVElNRU9VVCwgKChTZXJ2ZXJUeXBlKWdldFNlcnZlclR5cGUoKSkuZ2V0U3RhcnRUaW1lb3V0KCkvMTAwMCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdG9wVGltZW91dCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1NUT1BfVElNRU9VVCwgKChTZXJ2ZXJUeXBlKWdldFNlcnZlclR5cGUoKSkuZ2V0U3RvcFRpbWVvdXQoKS8xMDAwKTsKLQl9Ci0KLQkvKioKLSAgICAqIFJldHVybnMgYSBsaXN0IG9mIGlkIChTdHJpbmcpIG9mIHByZWZlcnJlZCBwdWJsaXNoIG9wZXJhdGlvbnMgdGhhdCB3aWxsIG5vdCBiZSBydW4KLSAgICAqIGR1cmluZyBwdWJsaXNoLgotICAgICogCi0gICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBwdWJsaXNoIG9wZXJhdGlvbiBpZHMKLSAgICAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RGlzYWJsZWRQcmVmZXJyZWRQdWJsaXNoT3BlcmF0aW9uSWRzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfRElTQUJMRURfUEVSRkVSUkVEX1RBU0tTLCBFTVBUWV9MSVNUKTsJCQotCX0KLQotCS8qKgotICAgICogUmV0dXJucyBhIGxpc3Qgb2YgaWQgKFN0cmluZykgb2Ygb3B0aW9uYWwgcHVibGlzaCBvcGVyYXRpb25zIHRoYXQgYXJlIGVuYWJsZWQgdG8gCi0gICAgKiBiZSBydW4gZHVyaW5nIHB1Ymxpc2guCi0gICAgKiAKLSAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHB1Ymxpc2ggb3BlcmF0aW9uIGlkcwotICAgICovCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFbmFibGVkT3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9uSWRzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfRU5BQkxFRF9PUFRJT05BTF9UQVNLUywgRU1QVFlfTElTVCk7Ci0JfQotCi0JLyoqCi0gICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBpZCAoU3RyaW5nKSBvZiBwdWJsaXNoZXJzIGFuZCBzdGF0ZSAodHJ1ZSBvciBmYWxzZSkuCi0gICAgKiAKLSAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHB1Ymxpc2hlcnMKLSAgICAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHVibGlzaGVySWRzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfUFVCTElTSEVSUywgRU1QVFlfTElTVCk7CQkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hlckVuYWJsZWQoUHVibGlzaGVyIHB1YikgewotCQlpZiAocHViID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQkvLyBjaGVjayBmb3IgZXhpc3RpbmcgZW5hYmxlbWVudAotCQlMaXN0PFN0cmluZz4gbGlzdCA9IGdldEF0dHJpYnV0ZShQUk9QX1BVQkxJU0hFUlMsIEVNUFRZX0xJU1QpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGlkID0gaXRlci5uZXh0KCk7Ci0JCQlpbnQgaW5kID0gaWQuaW5kZXhPZigiOiIpOwotCQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCQlpZiAoInRydWUiLmVxdWFscyhpZC5zdWJzdHJpbmcoaW5kKzEpKSkKLQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCWlkID0gaWQuc3Vic3RyaW5nKDAsIGluZCk7Ci0JCQlpZiAocHViLmdldElkKCkuZXF1YWxzKGlkKSkKLQkJCQlyZXR1cm4gZW5hYmxlZDsKLQkJfQotCQkKLQkJLy8gb3RoZXJ3aXNlIHVzZSB0aGUgZGVmYXVsdCBlbmFibGVtZW50Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNlcnZlci4gKHNlZSBTRVJWRVJfWFhYIGNvbnN0YW50cykKLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTZXJ2ZXJTdGF0ZSgpIHsKLQkJcmV0dXJuIHNlcnZlclN0YXRlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kZSgpIHsKLQkJcmV0dXJuIG1vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyU3RhdGUoaW50IHN0YXRlKSB7Ci0JCWlmIChzdGF0ZSA9PSBzZXJ2ZXJTdGF0ZSkKLQkJCXJldHVybjsKLQotCQl0aGlzLnNlcnZlclN0YXRlID0gc3RhdGU7Ci0JCWZpcmVTZXJ2ZXJTdGF0ZUNoYW5nZUV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5tb2RlbC5JU2VydmVyTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiQWRkaW5nIHNlcnZlciBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHRvICIgKyB0aGlzKTsKLQkJZ2V0U2VydmVyTm90aWZpY2F0aW9uTWFuYWdlcigpLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0byB0aGlzIHNlcnZlciB3aXRoIHRoZSBnaXZlbiBldmVudCBtYXNrLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubW9kZWwuSVNlcnZlckxpc3RlbmVyCi0JICogQHBhcmFtIGV2ZW50TWFzayB0byBsaW1pdCBsaXN0ZW5pbmcgdG8gY2VydGFpbiB0eXBlcyBvZiBldmVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIsIGludCBldmVudE1hc2spIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiQWRkaW5nIHNlcnZlciBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHRvICIgKyB0aGlzICsgIiB3aXRoIGV2ZW50TWFzayAiICsgZXZlbnRNYXNrKTsKLQkJZ2V0U2VydmVyTm90aWZpY2F0aW9uTWFuYWdlcigpLmFkZExpc3RlbmVyKGxpc3RlbmVyLCBldmVudE1hc2spOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIGZyb20gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5tb2RlbC5JU2VydmVyTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiUmVtb3Zpbmcgc2VydmVyIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgZnJvbSAiICsgdGhpcyk7Ci0JCWdldFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHNlcnZlciBsaXN0ZW5lciByZXN0YXJ0IHN0YXRlIGNoYW5nZSBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUmVzdGFydFN0YXRlQ2hhbmdlRXZlbnQoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIi0+LSBGaXJpbmcgc2VydmVyIHJlc3RhcnQgY2hhbmdlIGV2ZW50OiAiICsgZ2V0TmFtZSgpICsgIiAtPi0iKTsKLQkJCi0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNOb0xpc3RlbmVycygpKQotCQkJcmV0dXJuOwotCQkKLQkJbm90aWZpY2F0aW9uTWFuYWdlci5icm9hZGNhc3RDaGFuZ2UoCi0JCQluZXcgU2VydmVyRXZlbnQoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlJFU1RBUlRfU1RBVEVfQ0hBTkdFLCB0aGlzLCBnZXRTZXJ2ZXJTdGF0ZSgpLCAKLQkJCQlnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKSwgZ2V0U2VydmVyUmVzdGFydFN0YXRlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgc2VydmVyIGxpc3RlbmVyIHN0YXRlIGNoYW5nZSBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU2VydmVyU3RhdGVDaGFuZ2VFdmVudCgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLT4tIEZpcmluZyBzZXJ2ZXIgc3RhdGUgY2hhbmdlIGV2ZW50OiAiICsgZ2V0TmFtZSgpICsgIiwgIiArIGdldFNlcnZlclN0YXRlKCkgKyAiIC0+LSIpOwotCQkKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc05vTGlzdGVuZXJzKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlub3RpZmljYXRpb25NYW5hZ2VyLmJyb2FkY2FzdENoYW5nZSgKLQkJCW5ldyBTZXJ2ZXJFdmVudChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFLCB0aGlzLCBnZXRTZXJ2ZXJTdGF0ZSgpLCAKLQkJCQlnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKSwgZ2V0U2VydmVyUmVzdGFydFN0YXRlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgc2VydmVyIGxpc3RlbmVyIGNoYW5nZSBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU2VydmVyQ2hhbmdlRXZlbnQoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIi0+LSBGaXJpbmcgc2VydmVyIGNoYW5nZSBldmVudDogIiArIGdldE5hbWUoKSArICIsICIgKyBnZXRTZXJ2ZXJTdGF0ZSgpICsgIiAtPi0iKTsKLQkJCi0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNOb0xpc3RlbmVycygpKQotCQkJcmV0dXJuOwotCQkKLQkJbm90aWZpY2F0aW9uTWFuYWdlci5icm9hZGNhc3RDaGFuZ2UoCi0JCQluZXcgU2VydmVyRXZlbnQoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSwgdGhpcywgZ2V0U2VydmVyU3RhdGUoKSwgCi0JCQkJZ2V0U2VydmVyUHVibGlzaFN0YXRlKCksIGdldFNlcnZlclJlc3RhcnRTdGF0ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHNlcnZlciBsaXN0ZW5lciBtb2R1bGUgc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2R1bGVTdGF0ZUNoYW5nZUV2ZW50KElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLT4tIEZpcmluZyBtb2R1bGUgc3RhdGUgY2hhbmdlIGV2ZW50OiAiICsgZ2V0TmFtZSgpICsgIiwgIiArIGdldFNlcnZlclN0YXRlKCkgKyAiIC0+LSIpOwotCQkKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc05vTGlzdGVuZXJzKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlub3RpZmljYXRpb25NYW5hZ2VyLmJyb2FkY2FzdENoYW5nZSgKLQkJCW5ldyBTZXJ2ZXJFdmVudChTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFLCB0aGlzLCBtb2R1bGUsIGdldE1vZHVsZVN0YXRlKG1vZHVsZSksIAotCQkJCWdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUpLCBnZXRNb2R1bGVSZXN0YXJ0U3RhdGUobW9kdWxlKSkpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBzZXJ2ZXIgbGlzdGVuZXIgbW9kdWxlIHB1Ymxpc2ggc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2R1bGVQdWJsaXNoU3RhdGVDaGFuZ2VFdmVudChJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIi0+LSBGaXJpbmcgbW9kdWxlIHB1Ymxpc2ggc3RhdGUgY2hhbmdlIGV2ZW50OiAiICsgZ2V0TmFtZSgpICsgIiwgIiArIGdldFNlcnZlclN0YXRlKCkgKyAiIC0+LSIpOwotCQkKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc05vTGlzdGVuZXJzKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlub3RpZmljYXRpb25NYW5hZ2VyLmJyb2FkY2FzdENoYW5nZSgKLQkJCW5ldyBTZXJ2ZXJFdmVudChTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFIHwgU2VydmVyRXZlbnQuUFVCTElTSF9TVEFURV9DSEFOR0UsIHRoaXMsIG1vZHVsZSwgZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSwgCi0JCQkJZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSksIGdldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUpKSk7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHNlcnZlciBsaXN0ZW5lciBtb2R1bGUgc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2R1bGVSZXN0YXJ0Q2hhbmdlRXZlbnQoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICItPi0gRmlyaW5nIG1vZHVsZSByZXN0YXJ0IGNoYW5nZSBldmVudDogIiArIGdldE5hbWUoKSArICIsICIgKyBnZXRTZXJ2ZXJTdGF0ZSgpICsgIiAtPi0iKTsKLQkJCi0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNOb0xpc3RlbmVycygpKQotCQkJcmV0dXJuOwotCQkKLQkJbm90aWZpY2F0aW9uTWFuYWdlci5icm9hZGNhc3RDaGFuZ2UoCi0JCQluZXcgU2VydmVyRXZlbnQoU2VydmVyRXZlbnQuTU9EVUxFX0NIQU5HRSB8IFNlcnZlckV2ZW50LlJFU1RBUlRfU1RBVEVfQ0hBTkdFLCB0aGlzLCBtb2R1bGUsIGdldE1vZHVsZVN0YXRlKG1vZHVsZSksIAotCQkJCWdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUpLCBnZXRNb2R1bGVSZXN0YXJ0U3RhdGUobW9kdWxlKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGUoU3RyaW5nIG0pIHsKLQkJaWYgKG0gPT0gbW9kZSkKLQkJCXJldHVybjsKLQotCQl0aGlzLm1vZGUgPSBtOwotCQlmaXJlU2VydmVyU3RhdGVDaGFuZ2VFdmVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVN0YXRlKElNb2R1bGVbXSBtb2R1bGUsIGludCBzdGF0ZSkgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCWludCBvbGRTdGF0ZSA9IGdldE1vZHVsZVN0YXRlKG1vZHVsZSk7Ci0JCWlmIChvbGRTdGF0ZSA9PSBzdGF0ZSkKLQkJCXJldHVybjsKLQkJCi0JCUludGVnZXIgaW4gPSBuZXcgSW50ZWdlcihzdGF0ZSk7Ci0JCW1vZHVsZVN0YXRlLnB1dChnZXRLZXkobW9kdWxlKSwgaW4pOwotCQlmaXJlTW9kdWxlU3RhdGVDaGFuZ2VFdmVudChtb2R1bGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVB1Ymxpc2hTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSIpOwotCQlpbnQgb2xkU3RhdGUgPSBnZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlKTsKLQkJaWYgKG9sZFN0YXRlID09IHN0YXRlKQotCQkJcmV0dXJuOwotCQkKLQkJSW50ZWdlciBpbiA9IG5ldyBJbnRlZ2VyKHN0YXRlKTsKLQkJaWYgKHN0YXRlID09IC0xKQotCQkJbW9kdWxlUHVibGlzaFN0YXRlLnJlbW92ZShnZXRLZXkobW9kdWxlKSk7Ci0JCW1vZHVsZVB1Ymxpc2hTdGF0ZS5wdXQoZ2V0S2V5KG1vZHVsZSksIGluKTsKLQkJZmlyZU1vZHVsZVB1Ymxpc2hTdGF0ZUNoYW5nZUV2ZW50KG1vZHVsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlUmVzdGFydFN0YXRlKElNb2R1bGVbXSBtb2R1bGUsIGJvb2xlYW4gcikgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCWJvb2xlYW4gb2xkU3RhdGUgPSBnZXRNb2R1bGVSZXN0YXJ0U3RhdGUobW9kdWxlKTsKLQkJaWYgKG9sZFN0YXRlID09IHIpCi0JCQlyZXR1cm47Ci0JCQotCQlCb29sZWFuIGIgPSBuZXcgQm9vbGVhbihyKTsKLQkJbW9kdWxlUmVzdGFydFN0YXRlLnB1dChnZXRLZXkobW9kdWxlKSwgYik7Ci0JCWZpcmVNb2R1bGVSZXN0YXJ0Q2hhbmdlRXZlbnQobW9kdWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZXMpIHsKLQkJZXh0ZXJuYWxNb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJZXh0ZXJuYWxNb2R1bGVzLmFkZChtb2R1bGVzW2ldKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0PElNb2R1bGU+IGdldEV4dGVybmFsTW9kdWxlcygpIHsKLQkJcmV0dXJuIGV4dGVybmFsTW9kdWxlczsKLSAJfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTW9kdWxlUHJvamVjdENoYW5nZShJTW9kdWxlIG1vZHVsZSkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICI+IGhhbmRsZURlcGxveWFibGVQcm9qZWN0Q2hhbmdlKCkgIiArIHRoaXMgKyAiICIgKyBtb2R1bGUpOwotCQkKLQkJLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBqb2JzIGFscmVhZHkgd2FpdGluZyBhbmQgZG9uJ3QgY3JlYXRlIGEgbmV3IG9uZQotCQlKb2JbXSBqb2JzID0gSm9iLmdldEpvYk1hbmFnZXIoKS5maW5kKFNlcnZlclV0aWwuU0VSVkVSX0pPQl9GQU1JTFkpOwotCQlpZiAoam9icyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGpvYnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoam9ic1tpXSBpbnN0YW5jZW9mIFJlc291cmNlQ2hhbmdlSm9iKSB7Ci0JCQkJCVJlc291cmNlQ2hhbmdlSm9iIHJjaiA9IChSZXNvdXJjZUNoYW5nZUpvYikgam9ic1tpXTsKLQkJCQkJaWYgKHJjai5nZXRTZXJ2ZXIoKS5lcXVhbHModGhpcykgJiYgcmNqLmdldE1vZHVsZSgpLmVxdWFscyhtb2R1bGUpICYmIHJjai5nZXRTdGF0ZSgpID09IEpvYi5XQUlUSU5HKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJUmVzb3VyY2VDaGFuZ2VKb2Igam9iID0gbmV3IFJlc291cmNlQ2hhbmdlSm9iKG1vZHVsZSk7Ci0JCWpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCWpvYi5zZXRQcmlvcml0eShKb2IuQlVJTEQpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIjwgaGFuZGxlRGVwbG95YWJsZVByb2plY3RDaGFuZ2UoKSIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3BBdXRvUHVibGlzaCgpIHsKLQkJaWYgKGF1dG9QdWJsaXNoVGhyZWFkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlhdXRvUHVibGlzaFRocmVhZC5zdG9wID0gdHJ1ZTsKLQkJYXV0b1B1Ymxpc2hUaHJlYWQuaW50ZXJydXB0KCk7Ci0JCWF1dG9QdWJsaXNoVGhyZWFkID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldCBhdXRvbWF0aWMgcHVibGlzaCB0aHJlYWQgaWYgaXQgaXMgcnVubmluZyBhbmQgc3RhcnQgYSBuZXcKLQkgKiB0aHJlYWQgaWYgYXV0b21hdGljIHB1Ymxpc2hpbmcgaXMgY3VycmVudGx5IGVuYWJsZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXV0b1B1Ymxpc2goKSB7Ci0JCXN0b3BBdXRvUHVibGlzaCgpOwotCQkKLQkJaWYgKGdldEF1dG9QdWJsaXNoU2V0dGluZygpID09IEFVVE9fUFVCTElTSF9ESVNBQkxFKQotCQkJcmV0dXJuOwotCQkKLQkJaW50IHRpbWUgPSBnZXRBdXRvUHVibGlzaFRpbWUoKTsKLQkJaWYgKHRpbWUgPj0gMCkgewotCQkJYXV0b1B1Ymxpc2hUaHJlYWQgPSBuZXcgQXV0b1B1Ymxpc2hUaHJlYWQoKTsKLQkJCWF1dG9QdWJsaXNoVGhyZWFkLnRpbWUgPSB0aW1lOwotCQkJYXV0b1B1Ymxpc2hUaHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk1JTl9QUklPUklUWSArIDEpOwotCQkJYXV0b1B1Ymxpc2hUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQkJYXV0b1B1Ymxpc2hUaHJlYWQuc3RhcnQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IG5vdGlmaWNhdGlvbiBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5vdGlmaWNhdGlvbiBtYW5hZ2VyCi0JICovCi0JcHJpdmF0ZSBTZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyIGdldFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIoKSB7Ci0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwpCi0JCQlub3RpZmljYXRpb25NYW5hZ2VyID0gbmV3IFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIoKTsKLQkJCi0JCXJldHVybiBub3RpZmljYXRpb25NYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlcidzIHB1Ymxpc2ggc3luYyBzdGF0ZS4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKSB7Ci0JCXJldHVybiBzZXJ2ZXJTeW5jU3RhdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VydmVyJ3MgcHVibGlzaCBzeW5jIHN0YXRlLgotCSAqCi0JICogQHBhcmFtIHN0YXRlIGludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlclB1Ymxpc2hTdGF0ZShpbnQgc3RhdGUpIHsKLQkJaWYgKHN0YXRlID09IHNlcnZlclN5bmNTdGF0ZSkKLQkJCXJldHVybjsKLQkJc2VydmVyU3luY1N0YXRlID0gc3RhdGU7Ci0JCWZpcmVQdWJsaXNoU3RhdGVDaGFuZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgcHVibGlzaCBsaXN0ZW5lciB0byB0aGlzIHNlcnZlci4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHB1Ymxpc2ggbGlzdGVuZXIKLQkgKiBAc2VlICNyZW1vdmVQdWJsaXNoTGlzdGVuZXIoSVB1Ymxpc2hMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQdWJsaXNoTGlzdGVuZXIoSVB1Ymxpc2hMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIkFkZGluZyBwdWJsaXNoIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgdG8gIiArIHRoaXMpOwotCQkKLQkJaWYgKHB1Ymxpc2hMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXB1Ymxpc2hMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElQdWJsaXNoTGlzdGVuZXI+KCk7Ci0JCXB1Ymxpc2hMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgcHVibGlzaCBsaXN0ZW5lciBmcm9tIHRoaXMgc2VydmVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBwdWJsaXNoIGxpc3RlbmVyCi0JICogQHNlZSAjYWRkUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciBjYW5ub3QgYmUgbnVsbCIpOwotCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICJSZW1vdmluZyBwdWJsaXNoIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgZnJvbSAiICsgdGhpcyk7Ci0KLQkJaWYgKHB1Ymxpc2hMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCXB1Ymxpc2hMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogRmlyZSBhIHB1Ymxpc2ggc3RhcnQgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVB1Ymxpc2hTdGFydGVkKCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gRmlyaW5nIHB1Ymxpc2ggc3RhcnRlZCBldmVudCAtPi0iKTsKLQkKLQkJaWYgKHB1Ymxpc2hMaXN0ZW5lcnMgPT0gbnVsbCB8fCBwdWJsaXNoTGlzdGVuZXJzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlpbnQgc2l6ZSA9IHB1Ymxpc2hMaXN0ZW5lcnMuc2l6ZSgpOwotCQlJUHVibGlzaExpc3RlbmVyW10gc3JsID0gbmV3IElQdWJsaXNoTGlzdGVuZXJbc2l6ZV07Ci0JCXB1Ymxpc2hMaXN0ZW5lcnMudG9BcnJheShzcmwpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICIgIEZpcmluZyBwdWJsaXNoIHN0YXJ0ZWQgZXZlbnQgdG8gIiArIHNybFtpXSk7Ci0JCQl0cnkgewotCQkJCXNybFtpXS5wdWJsaXNoU3RhcnRlZCh0aGlzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBFcnJvciBmaXJpbmcgcHVibGlzaCBzdGFydGVkIGV2ZW50IHRvICIgKyBzcmxbaV0sIGUpOwotCQkJfQotCQl9Ci0KLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLTwtIERvbmUgZmlyaW5nIHB1Ymxpc2ggc3RhcnRlZCBldmVudCAtPC0iKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgcHVibGlzaCBzdG9wIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHN0YXR1cyBwdWJsaXNoaW5nIHN0YXR1cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQdWJsaXNoRmluaXNoZWQoSVN0YXR1cyBzdGF0dXMpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLT4tIEZpcmluZyBwdWJsaXNoaW5nIGZpbmlzaGVkIGV2ZW50OiAiICsgc3RhdHVzICsgIiAtPi0iKTsKLQkKLQkJaWYgKHB1Ymxpc2hMaXN0ZW5lcnMgPT0gbnVsbCB8fCBwdWJsaXNoTGlzdGVuZXJzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlpbnQgc2l6ZSA9IHB1Ymxpc2hMaXN0ZW5lcnMuc2l6ZSgpOwotCQlJUHVibGlzaExpc3RlbmVyW10gc3JsID0gbmV3IElQdWJsaXNoTGlzdGVuZXJbc2l6ZV07Ci0JCXB1Ymxpc2hMaXN0ZW5lcnMudG9BcnJheShzcmwpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICIgIEZpcmluZyBwdWJsaXNoaW5nIGZpbmlzaGVkIGV2ZW50IHRvICIgKyBzcmxbaV0pOwotCQkJdHJ5IHsKLQkJCQlzcmxbaV0ucHVibGlzaEZpbmlzaGVkKHRoaXMsIHN0YXR1cyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgRXJyb3IgZmlyaW5nIHB1Ymxpc2hpbmcgZmluaXNoZWQgZXZlbnQgdG8gIiArIHNybFtpXSwgZSk7Ci0JCQl9Ci0JCX0KLQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPC0gRG9uZSBmaXJpbmcgcHVibGlzaGluZyBmaW5pc2hlZCBldmVudCAtPC0iKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgcHVibGlzaCBzdGF0ZSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVB1Ymxpc2hTdGF0ZUNoYW5nZSgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLT4tIEZpcmluZyBwdWJsaXNoIHN0YXRlIGNoYW5nZSBldmVudCAtPi0iKTsKLQkJCi0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNOb0xpc3RlbmVycygpKQotCQkJcmV0dXJuOwotCQkKLQkJbm90aWZpY2F0aW9uTWFuYWdlci5icm9hZGNhc3RDaGFuZ2UoCi0JCQluZXcgU2VydmVyRXZlbnQoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlBVQkxJU0hfU1RBVEVfQ0hBTkdFLCB0aGlzLCBnZXRTZXJ2ZXJTdGF0ZSgpLCAKLQkJCQkJZ2V0U2VydmVyUHVibGlzaFN0YXRlKCksIGdldFNlcnZlclJlc3RhcnRTdGF0ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHB1Ymxpc2ggc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQdWJsaXNoU3RhdGVDaGFuZ2UoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gRmlyaW5nIHB1Ymxpc2ggc3RhdGUgY2hhbmdlIGV2ZW50OiAiICsgbW9kdWxlICsgIiAtPi0iKTsKLQkKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc05vTGlzdGVuZXJzKCkpCi0JCQlyZXR1cm47Ci0JCi0JCW5vdGlmaWNhdGlvbk1hbmFnZXIuYnJvYWRjYXN0Q2hhbmdlKAotCQkJbmV3IFNlcnZlckV2ZW50KFNlcnZlckV2ZW50Lk1PRFVMRV9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5QVUJMSVNIX1NUQVRFX0NIQU5HRSwgdGhpcywgbW9kdWxlLCBnZXRNb2R1bGVTdGF0ZShtb2R1bGUpLCAKLQkJCQlnZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlKSwgZ2V0TW9kdWxlUmVzdGFydFN0YXRlKG1vZHVsZSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBpcyBpbiBhIHN0YXRlIHRoYXQgaXQgY2FuCi0JICogYmUgcHVibGlzaGVkIHRvLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuUHVibGlzaCgpIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JNaXNzaW5nQWRhcHRlciwgbnVsbCk7Ci0JCQotCQkvLyBjYW4ndCBwdWJsaXNoIGlmIHRoZSBzZXJ2ZXIgaXMgc3RhcnRpbmcgb3Igc3RvcHBpbmcKLQkJaW50IHN0YXRlID0gZ2V0U2VydmVyU3RhdGUoKTsKLQkJaWYgKHN0YXRlID09IFNUQVRFX1NUQVJUSU5HIHx8IHN0YXRlID09IFNUQVRFX1NUT1BQSU5HKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoU3RhcnRpbmcsIG51bGwpOwotCQkKLQkJLy8gY2FuJ3QgcHVibGlzaCBpZiB0aGVyZSBpcyBubyBjb25maWd1cmF0aW9uCi0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpICYmIGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaE5vQ29uZmlndXJhdGlvbiwgbnVsbCk7Ci0JCQotCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCkKLQkJCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZS5jYW5QdWJsaXNoKCk7Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBzaG91bGQgYmUgcHVibGlzaGVkIHRvLiBUaGlzIGlzIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIHNlcnZlcgotCSAqIGNhbiBiZSBwdWJsaXNoZWQgdG8gYW5kIHRoZSBzZXJ2ZXIncyBwdWJsaXNoIHN0YXRlIG9yIGFueSBtb2R1bGUncyBwdWJsaXNoIHN0YXRlIGlzIG5vdAotCSAqIFBVQkxJU0hfU1RBVEVfTk9ORS4gCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUHVibGlzaCgpIHsKLQkJaWYgKCFjYW5QdWJsaXNoKCkuaXNPSygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKGdldFNlcnZlclB1Ymxpc2hTdGF0ZSgpICE9IFBVQkxJU0hfU1RBVEVfTk9ORSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJZmluYWwgYm9vbGVhbltdIHB1Ymxpc2ggPSBuZXcgYm9vbGVhblsxXTsKLQkJCi0JCXZpc2l0KG5ldyBJTW9kdWxlVmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJCQlpZiAoZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSkgIT0gUFVCTElTSF9TVEFURV9OT05FKSB7Ci0JCQkJCXB1Ymxpc2hbMF0gPSB0cnVlOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9LCBudWxsKTsKLQkJCi0JCXJldHVybiBwdWJsaXNoWzBdOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaFVua25vd24oKSB7Ci0JCWlmIChnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKSAhPSBQVUJMSVNIX1NUQVRFX1VOS05PV04pCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlmaW5hbCBib29sZWFuW10gcHVibGlzaCA9IG5ldyBib29sZWFuWzFdOwotCQlwdWJsaXNoWzBdID0gdHJ1ZTsKLQkJCi0JCXZpc2l0KG5ldyBJTW9kdWxlVmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJCQlpZiAoZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSkgIT0gUFVCTElTSF9TVEFURV9VTktOT1dOKSB7Ci0JCQkJCXB1Ymxpc2hbMF0gPSBmYWxzZTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gcHVibGlzaFswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBzaG91bGQgYmUgcmVzdGFydGVkLiBUaGlzIGlzIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIHNlcnZlcgotCSAqIGNhbiBiZSByZXN0YXJ0ZWQgYW5kIHRoZSBzZXJ2ZXIncyByZXN0YXJ0IHN0YXRlIG9yIGFueSBtb2R1bGUncyByZXN0YXJ0IHN0YXRlcyBpcyBub3QKLQkgKiBmYWxzZS4gCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVzdGFydCgpIHsKLQkJaWYgKCFjYW5QdWJsaXNoKCkuaXNPSygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKGdldFNlcnZlclJlc3RhcnRTdGF0ZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlmaW5hbCBib29sZWFuW10gcHVibGlzaCA9IG5ldyBib29sZWFuWzFdOwotCQkKLQkJdmlzaXQobmV3IElNb2R1bGVWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZSkgewotCQkJCWlmIChnZXRNb2R1bGVSZXN0YXJ0U3RhdGUobW9kdWxlKSkgewotCQkJCQlwdWJsaXNoWzBdID0gdHJ1ZTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gcHVibGlzaFswXTsKLQl9Ci0KLQlwdWJsaWMgU2VydmVyUHVibGlzaEluZm8gZ2V0U2VydmVyUHVibGlzaEluZm8oKSB7Ci0JCWlmIChwdWJsaXNoSW5mbyA9PSBudWxsKSB7Ci0JCQlwdWJsaXNoSW5mbyA9IFB1Ymxpc2hJbmZvLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUHVibGlzaEluZm8odGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHB1Ymxpc2hJbmZvOwotCX0KLQotCS8qCi0JICogUHVibGlzaCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBwcm9ncmVzcyBtb25pdG9yLiBUaGUgcmVzdWx0IG9mIHRoZQotCSAqIHB1Ymxpc2ggb3BlcmF0aW9uIGlzIHJldHVybmVkIGFzIGFuIElTdGF0dXMuCi0JICovCi0JcHVibGljIElTdGF0dXMgcHVibGlzaChpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTWlzc2luZ0FkYXB0ZXIsIG51bGwpOwotCQkKLQkJLy8gY2hlY2sgd2hhdCBpcyBvdXQgb2Ygc3luYyBhbmQgcHVibGlzaAotCQlpZiAoZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBjb25maWd1cmF0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck5vQ29uZmlndXJhdGlvbiwgbnVsbCk7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgZGVsZWdhdGUgaXMgbG9hZGVkIGFuZCB0aGUgc2VydmVyIHN0YXRlIGlzIGNvcnJlY3QKLQkJbG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG1vbml0b3IpOwotCQkKLQkJaWYgKCgoU2VydmVyVHlwZSlnZXRTZXJ2ZXJUeXBlKCkpLnN0YXJ0QmVmb3JlUHVibGlzaCgpICYmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gc3RhcnRJbXBsKElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBtb25pdG9yKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCXJldHVybiBwdWJsaXNoSW1wbChraW5kLCBudWxsLCBudWxsLCBtb25pdG9yKTsKLQl9Ci0KLQkvKgotCSAqIFB1Ymxpc2ggdGhlIGdpdmVuIG1vZHVsZXMgdG8gdGhlIHNlcnZlci4KLQkgKiBUT0RPOiBJbXBsZW1lbnRhdGlvbiEKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWJsaXNoKGZpbmFsIGludCBraW5kLCBmaW5hbCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlczIsIGZpbmFsIElBZGFwdGFibGUgaW5mbywgZmluYWwgSU9wZXJhdGlvbkxpc3RlbmVyIG9wTGlzdGVuZXIpIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKSB7Ci0JCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsKQotCQkJCW9wTGlzdGVuZXIuZG9uZShuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTWlzc2luZ0FkYXB0ZXIsIG51bGwpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gY2hlY2sgd2hhdCBpcyBvdXQgb2Ygc3luYyBhbmQgcHVibGlzaAotCQlpZiAoZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBjb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCWlmIChvcExpc3RlbmVyICE9IG51bGwpCi0JCQkJb3BMaXN0ZW5lci5kb25lKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JOb0NvbmZpZ3VyYXRpb24sIG51bGwpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGRlbGVnYXRlIGlzIGxvYWRlZCBhbmQgdGhlIHNlcnZlciBzdGF0ZSBpcyBjb3JyZWN0Ci0JCWxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJCi0JCWJvb2xlYW4gc3RhcnQgPSBmYWxzZTsKLQkJaWYgKCgoU2VydmVyVHlwZSlnZXRTZXJ2ZXJUeXBlKCkpLnN0YXJ0QmVmb3JlUHVibGlzaCgpICYmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkpCi0JCQlzdGFydCA9IHRydWU7Ci0JCQotCQlQdWJsaXNoSm9iIHB1Ymxpc2hKb2IgPSBuZXcgUHVibGlzaEpvYihraW5kLCBtb2R1bGVzMiwgc3RhcnQsIGluZm8pOwotCQlpZiAob3BMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlwdWJsaXNoSm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCW9wTGlzdGVuZXIuZG9uZShldmVudC5nZXRSZXN1bHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcHVibGlzaEpvYi5zY2hlZHVsZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2ggdGFza3MgdGhhdCBoYXZlIGJlZW4gdGFyZ2V0ZWQgdG8gdGhpcyBzZXJ2ZXIuCi0JICogVGhlc2UgdGFza3Mgc2hvdWxkIGJlIHJ1biBkdXJpbmcgcHVibGlzaGluZyBhbmQgd2lsbCBiZSBpbml0aWFsaXplZAotCSAqIHdpdGggYSB0YXNrIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBraW5kIG9uZSBvZiB0aGUgSVNlcnZlci5QVUJMSVNIX1hYIGNvbnN0YW50cwotCSAqIEBwYXJhbSBtb2R1bGVMaXN0IGEgbGlzdCBvZiBtb2R1bGVzCi0JICogQHBhcmFtIGtpbmRMaXN0IG9uZSBvZiB0aGUgSVNlcnZlciBwdWJsaXNoIGNoYW5nZSBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgSU9wdGlvbmFsVGFza3MKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKGludCBraW5kLCBMaXN0IG1vZHVsZUxpc3QsIExpc3Qga2luZExpc3QpIHsKLQkJTGlzdDxQdWJsaXNoT3BlcmF0aW9uPiB0YXNrcyA9IG5ldyBBcnJheUxpc3Q8UHVibGlzaE9wZXJhdGlvbj4oKTsKLQkJCi0JCVN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBnZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLQkJCi0JCUlQdWJsaXNoVGFza1tdIHB1Ymxpc2hUYXNrcyA9IFNlcnZlclBsdWdpbi5nZXRQdWJsaXNoVGFza3MoKTsKLQkJaWYgKHB1Ymxpc2hUYXNrcyAhPSBudWxsKSB7Ci0JCQlMaXN0IGVuYWJsZWRUYXNrcyA9IGdldEVuYWJsZWRPcHRpb25hbFB1Ymxpc2hPcGVyYXRpb25JZHMoKTsKLQkJCUxpc3QgZGlzYWJsZWRUYXNrcyA9IGdldERpc2FibGVkUHJlZmVycmVkUHVibGlzaE9wZXJhdGlvbklkcygpOwotCQkJCi0JCQlUYXNrTW9kZWwgdGFza01vZGVsID0gbmV3IFRhc2tNb2RlbCgpOwotCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHRoaXMpOwotCQkJCi0JCQlpbnQgc2l6ZSA9IHB1Ymxpc2hUYXNrcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlQdWJsaXNoVGFzayB0YXNrID0gcHVibGlzaFRhc2tzW2ldOwotCQkJCWlmICh0YXNrLnN1cHBvcnRzVHlwZShzZXJ2ZXJUeXBlSWQpKSB7Ci0JCQkJCVB1Ymxpc2hPcGVyYXRpb25bXSB0YXNrczIgPSB0YXNrLmdldFRhc2tzKHRoaXMsIGtpbmQsIG1vZHVsZUxpc3QsIGtpbmRMaXN0KTsKLQkJCQkJaWYgKHRhc2tzMiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc2l6ZTIgPSB0YXNrczIubGVuZ3RoOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQkJaWYgKHRhc2tzMltqXS5nZXRLaW5kKCkgPT0gUHVibGlzaE9wZXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJCQl0YXNrcy5hZGQodGFza3MyW2pdKTsKLQkJCQkJCQkJdGFza3MyW2pdLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwotCQkJCQkJCX0gZWxzZSBpZiAodGFza3MyW2pdLmdldEtpbmQoKSA9PSBQdWJsaXNoT3BlcmF0aW9uLlBSRUZFUlJFRCkgewotCQkJCQkJCQlTdHJpbmcgb3BJZCA9IGdldFB1Ymxpc2hPcGVyYXRpb25JZCh0YXNrczJbal0pOwotCQkJCQkJCQlpZiAoIWRpc2FibGVkVGFza3MuY29udGFpbnMob3BJZCkpIHsKLQkJCQkJCQkJCXRhc2tzLmFkZCh0YXNrczJbal0pOwotCQkJCQkJCQkJdGFza3MyW2pdLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIGlmICh0YXNrczJbal0uZ2V0S2luZCgpID09IFB1Ymxpc2hPcGVyYXRpb24uT1BUSU9OQUwpIHsKLQkJCQkJCQkJU3RyaW5nIG9wSWQgPSBnZXRQdWJsaXNoT3BlcmF0aW9uSWQodGFza3MyW2pdKTsKLQkJCQkJCQkJaWYgKGVuYWJsZWRUYXNrcy5jb250YWlucyhvcElkKSkgewotCQkJCQkJCQkJdGFza3MuYWRkKHRhc2tzMltqXSk7Ci0JCQkJCQkJCQl0YXNrczJbal0uc2V0VGFza01vZGVsKHRhc2tNb2RlbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUNvbGxlY3Rpb25zLnNvcnQodGFza3MsIFBVQkxJU0hfT1BFUkFUSU9OX0NPTVBBUlRPUik7Ci0JCQotCQlyZXR1cm4gdGFza3MudG9BcnJheShuZXcgUHVibGlzaE9wZXJhdGlvblt0YXNrcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgcHVibGlzaGVycyB0aGF0IGFyZSBhdmFpbGFibGUgd2l0aCB0aGlzIHNlcnZlciwKLQkgKiB3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBjdXJyZW50bHkgZW5hYmxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgUHVibGlzaGVycwotCSAqLwotCXB1YmxpYyBQdWJsaXNoZXJbXSBnZXRBbGxQdWJsaXNoZXJzKCkgewotCQlMaXN0PFB1Ymxpc2hlcj4gcHVicyA9IG5ldyBBcnJheUxpc3Q8UHVibGlzaGVyPigpOwotCQkKLQkJU3RyaW5nIHNlcnZlclR5cGVJZCA9IGdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCQkKLQkJVGFza01vZGVsIHRhc2tNb2RlbCA9IG5ldyBUYXNrTW9kZWwoKTsKLQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHRoaXMpOwotCQkKLQkJUHVibGlzaGVyW10gcHVibGlzaGVycyA9IFNlcnZlclBsdWdpbi5nZXRQdWJsaXNoZXJzKCk7Ci0JCWlmIChwdWJsaXNoZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcHVibGlzaGVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVB1Ymxpc2hlciBwdWIgPSBwdWJsaXNoZXJzW2ldOwotCQkJCWlmIChwdWIuc3VwcG9ydHNUeXBlKHNlcnZlclR5cGVJZCkpIHsKLQkJCQkJcHViLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwotCQkJCQlwdWJzLmFkZChwdWIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHB1YnMudG9BcnJheShuZXcgUHVibGlzaGVyW3B1YnMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGlzaGVycyB0aGF0IGhhdmUgYmVlbiB0YXJnZXRlZCB0byB0aGlzIHNlcnZlciBhbmQKLQkgKiBhcmUgZW5hYmxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgUHVibGlzaGVycwotCSAqLwotCXB1YmxpYyBQdWJsaXNoZXJbXSBnZXRFbmFibGVkUHVibGlzaGVycygpIHsKLQkJTGlzdDxQdWJsaXNoZXI+IHB1YnMgPSBuZXcgQXJyYXlMaXN0PFB1Ymxpc2hlcj4oKTsKLQkJCi0JCVN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBnZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLQkJCi0JCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCB0aGlzKTsKLQkJCi0JCVB1Ymxpc2hlcltdIHB1Ymxpc2hlcnMgPSBTZXJ2ZXJQbHVnaW4uZ2V0UHVibGlzaGVycygpOwotCQlpZiAocHVibGlzaGVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHB1Ymxpc2hlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlQdWJsaXNoZXIgcHViID0gcHVibGlzaGVyc1tpXTsKLQkJCQlpZiAocHViLnN1cHBvcnRzVHlwZShzZXJ2ZXJUeXBlSWQpICYmIGlzUHVibGlzaGVyRW5hYmxlZChwdWIpKSB7Ci0JCQkJCXB1Yi5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQkJCQkJcHVicy5hZGQocHViKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwdWJzLnRvQXJyYXkobmV3IFB1Ymxpc2hlcltwdWJzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHB1Ymxpc2ggdGFza3MgdGhhdCBoYXZlIGJlZW4gdGFyZ2V0ZWQgdG8gdGhpcyBzZXJ2ZXIgdHlwZS4KLQkgKiBUaGUgdGFza3Mgd2lsbCBub3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHRhc2sgbW9kZWwuIAotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGVMaXN0IGEgbGlzdCBvZiBtb2R1bGVzCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBwdWJsaXNoIG9wZXJhdGlvbnMKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbltdIGdldEFsbFRhc2tzKExpc3QgbW9kdWxlTGlzdCkgewotCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0JCWlmIChzZXJ2ZXJUeXBlSWQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgUHVibGlzaE9wZXJhdGlvblswXTsKLQkJCi0JCUxpc3Q8UHVibGlzaE9wZXJhdGlvbj4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PFB1Ymxpc2hPcGVyYXRpb24+KCk7Ci0JCQotCQlJUHVibGlzaFRhc2tbXSBwdWJsaXNoVGFza3MgPSBTZXJ2ZXJQbHVnaW4uZ2V0UHVibGlzaFRhc2tzKCk7Ci0JCWlmIChwdWJsaXNoVGFza3MgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBwdWJsaXNoVGFza3MubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJUHVibGlzaFRhc2sgdGFzayA9IHB1Ymxpc2hUYXNrc1tpXTsKLQkJCQlpZiAodGFzay5zdXBwb3J0c1R5cGUoc2VydmVyVHlwZUlkKSkgewotCQkJCQlQdWJsaXNoT3BlcmF0aW9uW10gdGFza3MyID0gdGFzay5nZXRUYXNrcyh0aGlzLCBtb2R1bGVMaXN0KTsKLQkJCQkJdGFza3MuYWRkQWxsKEFycmF5cy5hc0xpc3QodGFza3MyKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlDb2xsZWN0aW9ucy5zb3J0KHRhc2tzLCBQVUJMSVNIX09QRVJBVElPTl9DT01QQVJUT1IpOwotCQkKLQkJcmV0dXJuIHRhc2tzLnRvQXJyYXkobmV3IFB1Ymxpc2hPcGVyYXRpb25bdGFza3Muc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoT3BlcmF0aW9uSWQoUHVibGlzaE9wZXJhdGlvbiBvcCkgewotCQlyZXR1cm4gZ2V0SWQoKSsifCIrb3AuZ2V0TGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIG1vZHVsZSBhcnJheXMgb2YgZXZlcnkgbW9kdWxlIG9uIHRoZQotCSAqIHNlcnZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBJTW9kdWxlW10KLQkgKi8KLQlwdWJsaWMgTGlzdDxJTW9kdWxlW10+IGdldEFsbE1vZHVsZXMoKSB7Ci0JCWZpbmFsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVMaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlW10+KCk7Ci0JCQotCQlJTW9kdWxlVmlzaXRvciB2aXNpdG9yID0gbmV3IElNb2R1bGVWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZSkgewotCQkJCWlmICghbW9kdWxlTGlzdC5jb250YWlucyhtb2R1bGUpKQotCQkJCQltb2R1bGVMaXN0LmFkZChtb2R1bGUpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9OwotCQkKLQkJdmlzaXQodmlzaXRvciwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gbW9kdWxlTGlzdDsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcHVibGlzaGVkLgotCSAqIAotCSAqIEBzZWUgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuZ2V0UHVibGlzaGVkUmVzb3VyY2VzKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gZ2V0UmVzb3VyY2VzKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSIpOwotCQlyZXR1cm4gZ2V0U2VydmVyUHVibGlzaEluZm8oKS5nZXRSZXNvdXJjZXMobW9kdWxlKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcHVibGlzaGVkLgotCSAqIAotCSAqIEBzZWUgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuZ2V0UHVibGlzaGVkUmVzb3VyY2VzKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gZ2V0UHVibGlzaGVkUmVzb3VyY2VzKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSIpOwotCQlyZXR1cm4gZ2V0U2VydmVyUHVibGlzaEluZm8oKS5nZXRNb2R1bGVQdWJsaXNoSW5mbyhtb2R1bGUpLmdldFJlc291cmNlcygpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgZGVsdGEgb2YgdGhlIGN1cnJlbnQgbW9kdWxlIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbgotCSAqIHB1Ymxpc2hlZCBjb21wYXJlZCB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW9kdWxlLgotCSAqIAotCSAqIEBzZWUgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShJTW9kdWxlW10pCi0JICovCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUubGVuZ3RoID09IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKLQkJcmV0dXJuIGdldFNlcnZlclB1Ymxpc2hJbmZvKCkuZ2V0RGVsdGEobW9kdWxlKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGRlbHRhIG9mIHRoZSBjdXJyZW50IG1vZHVsZSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4KLQkgKiBwdWJsaXNoZWQgY29tcGFyZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiBAc2VlIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1B1Ymxpc2hlZFJlc291cmNlRGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCXJldHVybiBnZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLmhhc0RlbHRhKG1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoZGVsZWdhdGUpKQotCQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkJfQotCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCkgewotCQkJaWYgKGFkYXB0ZXIuaXNJbnN0YW5jZShiZWhhdmlvdXJEZWxlZ2F0ZSkpCi0JCQkJcmV0dXJuIGJlaGF2aW91ckRlbGVnYXRlOwotCQl9Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyI2xvYWRBZGFwdGVyKENsYXNzLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBPYmplY3QgbG9hZEFkYXB0ZXIoQ2xhc3MgYWRhcHRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldERlbGVnYXRlKG1vbml0b3IpOwotCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGRlbGVnYXRlKSkKLQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkJCi0JCWdldEJlaGF2aW91ckRlbGVnYXRlKG1vbml0b3IpOwotCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGJlaGF2aW91ckRlbGVnYXRlKSkKLQkJCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZTsKLQkJCi0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBpcyBpbiBhIHN0YXRlIHRoYXQgaXQgY2FuCi0JICogYmUgc3RhcnRlZCwgYW5kIHN1cHBvcnRzIHRoZSBnaXZlbiBtb2RlLgotCSAqCi0JICogQHBhcmFtIG1vZGUyCi0JICogQHJldHVybiBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5TdGFydChTdHJpbmcgbW9kZTIpIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JNaXNzaW5nQWRhcHRlciwgbnVsbCk7Ci0JCQotCQlpbnQgc3RhdGUgPSBnZXRTZXJ2ZXJTdGF0ZSgpOwotCQlpZiAoc3RhdGUgIT0gU1RBVEVfU1RPUFBFRCAmJiBzdGF0ZSAhPSBTVEFURV9VTktOT1dOKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuY2FuU3RhcnRFcnJvclN0YXRlLCBudWxsKTsKLQkJCi0JCWlmICghZ2V0U2VydmVyVHlwZSgpLnN1cHBvcnRzTGF1bmNoTW9kZShtb2RlMikpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckxhdW5jaE1vZGUsIG51bGwpOwotCQkKLQkJaWYgKGJlaGF2aW91ckRlbGVnYXRlICE9IG51bGwpCi0JCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGUuY2FuU3RhcnQobW9kZTIpOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElMYXVuY2ggZ2V0TGF1bmNoKCkgewotCQlpZiAobGF1bmNoICE9IG51bGwgJiYgIWxhdW5jaC5pc1Rlcm1pbmF0ZWQoKSkKLQkJCXJldHVybiBsYXVuY2g7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldHVwTGF1bmNoQ29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG1vbml0b3IpLnNldHVwTGF1bmNoQ29uZmlndXJhdGlvbih3b3JraW5nQ29weSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHNldHVwTGF1bmNoQ29uZmlndXJhdGlvbigpICIgKyB0b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgc2VydmVyLiBJZiBvbmUgZG9lcyBub3QgZXhpc3QsIGl0Ci0JICogd2lsbCBiZSBjcmVhdGVkIGlmICJjcmVhdGUiIGlzIHRydWUsIGFuZCBvdGhlcndpc2Ugd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogV2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBzZXJ2ZXIgdHlwZSBoYXMgbm8gYXNzb2NpYXRlZCBsYXVuY2gKLQkgKiBjb25maWd1cmF0aW9uIHR5cGUgKGkuZS4gdGhlIHNlcnZlciBjYW5ub3QgYmUgc3RhcnRlZCkuCi0JICogCi0JICogQHBhcmFtIGNyZWF0ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG5ldyBsYXVuY2ggY29uZmlndXJhdGlvbiBzaG91bGQgYmUKLQkgKiAgICBjcmVhdGVkIGlmIHRoZXJlIGFyZSBub25lIGFscmVhZHkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIHdhcyBubwotCSAqICAgIGV4aXN0aW5nIGxhdW5jaCBjb25maWd1cmF0aW9uIGFuZCA8Y29kZT5jcmVhdGU8L2NvZGU+IHdhcyBmYWxzZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGJvb2xlYW4gY3JlYXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgbGF1bmNoQ29uZmlnVHlwZSA9ICgoU2VydmVyVHlwZSkgZ2V0U2VydmVyVHlwZSgpKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZSgpOwotCQlpZiAobGF1bmNoQ29uZmlnVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJTGF1bmNoTWFuYWdlciBsYXVuY2hNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBsYXVuY2hDb25maWdzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWxhdW5jaENvbmZpZ3MgPSBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKGxhdW5jaENvbmZpZ1R5cGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotCQlpZiAobGF1bmNoQ29uZmlncyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGxhdW5jaENvbmZpZ3MubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgc2VydmVySWQgPSBsYXVuY2hDb25maWdzW2ldLmdldEF0dHJpYnV0ZShTRVJWRVJfSUQsIChTdHJpbmcpIG51bGwpOwotCQkJCQlpZiAoZ2V0SWQoKS5lcXVhbHMoc2VydmVySWQpKSB7Ci0JCQkJCQlmaW5hbCBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gbGF1bmNoQ29uZmlnc1tpXS5nZXRXb3JraW5nQ29weSgpOwotCQkJCQkJc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKHdjLCBtb25pdG9yKTsKLQkJCQkJCWlmICh3Yy5pc0RpcnR5KCkpIHsKLQkJCQkJCQlmaW5hbCBJTGF1bmNoQ29uZmlndXJhdGlvbltdIGxjID0gbmV3IElMYXVuY2hDb25maWd1cmF0aW9uWzFdOwotCQkJCQkJCUpvYiBqb2IgPSBuZXcgSm9iKCJTYXZpbmcgbGF1bmNoIGNvbmZpZ3VyYXRpb24iKSB7Ci0JCQkJCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IyKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWxjWzBdID0gd2MuZG9TYXZlKCk7Ci0JCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY29uZmlndXJpbmcgbGF1bmNoIiwgY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9OwotCQkJCQkJCWpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJam9iLmpvaW4oKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjb25maWd1cmluZyBsYXVuY2giLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGpvYi5nZXRTdGF0ZSgpICE9IEpvYi5OT05FKSB7Ci0JCQkJCQkJCWpvYi5jYW5jZWwoKTsKLQkJCQkJCQkJbGNbMF0gPSB3Yy5kb1NhdmUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJcmV0dXJuIGxjWzBdOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGxhdW5jaENvbmZpZ3NbaV07Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY29uZmlndXJpbmcgbGF1bmNoIiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoIWNyZWF0ZSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJLy8gY3JlYXRlIGEgbmV3IGxhdW5jaCBjb25maWd1cmF0aW9uCi0JCVN0cmluZyBsYXVuY2hOYW1lID0gZ2V0VmFsaWRMYXVuY2hDb25maWd1cmF0aW9uTmFtZShnZXROYW1lKCkpOwotCQlsYXVuY2hOYW1lID0gbGF1bmNoTWFuYWdlci5nZW5lcmF0ZVVuaXF1ZUxhdW5jaENvbmZpZ3VyYXRpb25OYW1lRnJvbShsYXVuY2hOYW1lKTsgCi0JCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MgPSBsYXVuY2hDb25maWdUeXBlLm5ld0luc3RhbmNlKG51bGwsIGxhdW5jaE5hbWUpOwotCQl3Yy5zZXRBdHRyaWJ1dGUoU0VSVkVSX0lELCBnZXRJZCgpKTsKLQkJc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKHdjLCBtb25pdG9yKTsKLQkJcmV0dXJuIHdjLmRvU2F2ZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRMYXVuY2hDb25maWd1cmF0aW9uTmFtZShTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiMSI7Ci0JCWludCBzaXplID0gSU5WQUxJRF9DSEFSUy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzID0gcy5yZXBsYWNlKElOVkFMSURfQ0hBUlNbaV0sICdfJyk7Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyI3N0YXJ0KFN0cmluZywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChTdHJpbmcgbW9kZTIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTdGFydGluZyBzZXJ2ZXI6ICIgKyB0b1N0cmluZygpICsgIiwgbGF1bmNoTW9kZTogIiArIG1vZGUyKTsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGRlbGVnYXRlIGlzIGxvYWRlZCBhbmQgdGhlIHNlcnZlciBzdGF0ZSBpcyBjb3JyZWN0Ci0JCWxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJCi0JCWJ5dGUgcHViID0gU3RhcnRKb2IuUFVCTElTSF9OT05FOwotCQlpZiAoU2VydmVyQ29yZS5pc0F1dG9QdWJsaXNoaW5nKCkgJiYgc2hvdWxkUHVibGlzaCgpKSB7Ci0JCQlpZiAoKChTZXJ2ZXJUeXBlKWdldFNlcnZlclR5cGUoKSkuc3RhcnRCZWZvcmVQdWJsaXNoKCkpCi0JCQkJcHViID0gU3RhcnRKb2IuUFVCTElTSF9BRlRFUjsKLQkJCWVsc2UKLQkJCQlwdWIgPSBTdGFydEpvYi5QVUJMSVNIX0JFRk9SRTsKLQkJfQotCQkKLQkJU3RhcnRKb2Igc3RhcnRKb2IgPSBuZXcgU3RhcnRKb2IobW9kZTIsIHB1Yik7Ci0JCXN0YXJ0Sm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYW4gdXAgYW55IG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmVyLCB0eXBpY2FsbHkgaW4gcHJlcGFyYXRpb24gZm9yCi0JICogZGVsZXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlTWV0YWRhdGEoKSB7Ci0JCWRlbGV0ZUxhdW5jaENvbmZpZ3VyYXRpb25zKCk7Ci0JCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnJlbW92ZVRlbXBEaXJlY3RvcnkoZ2V0SWQoKSk7Ci0JCVB1Ymxpc2hJbmZvLmdldEluc3RhbmNlKCkucmVtb3ZlU2VydmVyUHVibGlzaEluZm8odGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYW4gdXAgYW55IG9sZCBsYXVuY2ggY29uZmlndXJhdGlvbnMgd2l0aCB0aGUgY3VycmVudCBzZXJ2ZXIncyBpZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVMYXVuY2hDb25maWd1cmF0aW9ucygpIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJSUxhdW5jaE1hbmFnZXIgbGF1bmNoTWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBsYXVuY2hDb25maWdUeXBlID0gKChTZXJ2ZXJUeXBlKSBnZXRTZXJ2ZXJUeXBlKCkpLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKCk7Ci0JCQotCQlJTGF1bmNoQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBudWxsOwotCQl0cnkgewotCQkJY29uZmlncyA9IGxhdW5jaE1hbmFnZXIuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMobGF1bmNoQ29uZmlnVHlwZSk7Ci0JCQlpbnQgc2l6ZSA9IGNvbmZpZ3MubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoZ2V0SWQoKS5lcXVhbHMoY29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoU0VSVkVSX0lELCAoU3RyaW5nKSBudWxsKSkpCi0JCQkJCQljb25maWdzW2ldLmRlbGV0ZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyI2NhblJlc3RhcnQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhblJlc3RhcnQoU3RyaW5nIG1vZGUyKSB7Ci0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTWlzc2luZ0FkYXB0ZXIsIG51bGwpOwotCQkKLQkJaWYgKCFnZXRTZXJ2ZXJUeXBlKCkuc3VwcG9ydHNMYXVuY2hNb2RlKG1vZGUyKSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTGF1bmNoTW9kZSwgbnVsbCk7Ci0JCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSAhPSBTVEFURV9TVEFSVEVEKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JSZXN0YXJ0Tm90U3RhcnRlZCwgbnVsbCk7Ci0JCQotCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCkKLQkJCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZS5jYW5SZXN0YXJ0KG1vZGUyKTsKLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmVzdGFydCBzdGF0ZSBvZiB0aGUgc2VydmVyLiBUaGlzCi0JICogaW1wbGVtZW50YXRpb24gd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIHNlcnZlcgotCSAqIGlzIHN0b3BwZWQuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSB7Ci0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzZXJ2ZXJSZXN0YXJ0TmVlZGVkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlcnZlciByZXN0YXJ0IHN0YXRlLgotCSAqCi0JICogQHBhcmFtIHN0YXRlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U2VydmVyUmVzdGFydFN0YXRlKGJvb2xlYW4gc3RhdGUpIHsKLQkJaWYgKHN0YXRlID09IHNlcnZlclJlc3RhcnROZWVkZWQpCi0JCQlyZXR1cm47Ci0JCXNlcnZlclJlc3RhcnROZWVkZWQgPSBzdGF0ZTsKLQkJZmlyZVJlc3RhcnRTdGF0ZUNoYW5nZUV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyI3Jlc3RhcnQoU3RyaW5nLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RhcnQoZmluYWwgU3RyaW5nIG1vZGUyLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsIHx8IGdldFNlcnZlclN0YXRlKCkgPT0gU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm47Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJSZXN0YXJ0aW5nIHNlcnZlcjogIiArIGdldE5hbWUoKSk7Ci0JCQotCQlSZXN0YXJ0Sm9iIHJlc3RhcnRKb2IgPSBuZXcgUmVzdGFydEpvYihtb2RlMik7Ci0JCXJlc3RhcnRKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBpcyBpbiBhIHN0YXRlIHRoYXQgaXQgY2FuCi0JICogYmUgc3RvcHBlZC4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhblN0b3AoKSB7Ci0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTWlzc2luZ0FkYXB0ZXIsIG51bGwpOwotCQkKLQkJaWYgKGdldFNlcnZlclN0YXRlKCkgPT0gU1RBVEVfU1RPUFBFRCB8fCBnZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUT1BQSU5HKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JTdG9wQWxyZWFkeVN0b3BwZWQsIG51bGwpOwotCQkKLQkJaWYgKCFnZXRTZXJ2ZXJUeXBlKCkuc3VwcG9ydHNMYXVuY2hNb2RlKGdldE1vZGUoKSkpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckxhdW5jaE1vZGUsIG51bGwpOwotCQkKLQkJaWYgKGJlaGF2aW91ckRlbGVnYXRlICE9IG51bGwpCi0JCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGUuY2FuU3RvcCgpOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyI3N0b3AoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKGJvb2xlYW4gZm9yY2UpIHsKLQkJaWYgKGdldFNlcnZlclN0YXRlKCkgPT0gU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybjsKLQkJCi0JCVN0b3BKb2Igam9iID0gbmV3IFN0b3BKb2IoZm9yY2UpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXIjc3RhcnQoU3RyaW5nLCBJT3BlcmF0aW9uTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoU3RyaW5nIG1vZGUyLCBmaW5hbCBJT3BlcmF0aW9uTGlzdGVuZXIgb3BMaXN0ZW5lcikgewotCQlpZiAoZ2V0U2VydmVyVHlwZSgpID09IG51bGwpIHsKLQkJCWlmIChvcExpc3RlbmVyICE9IG51bGwpCi0JCQkJb3BMaXN0ZW5lci5kb25lKFN0YXR1cy5PS19TVEFUVVMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgZGVsZWdhdGUgaXMgbG9hZGVkIGFuZCB0aGUgc2VydmVyIHN0YXRlIGlzIGNvcnJlY3QKLQkJbG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG51bGwpOwotCQkKLQkJYnl0ZSBwdWIgPSBTdGFydEpvYi5QVUJMSVNIX05PTkU7Ci0JCWlmIChTZXJ2ZXJDb3JlLmlzQXV0b1B1Ymxpc2hpbmcoKSAmJiBzaG91bGRQdWJsaXNoKCkpIHsKLQkJCWlmICgoKFNlcnZlclR5cGUpZ2V0U2VydmVyVHlwZSgpKS5zdGFydEJlZm9yZVB1Ymxpc2goKSkKLQkJCQlwdWIgPSBTdGFydEpvYi5QVUJMSVNIX0FGVEVSOwotCQkJZWxzZQotCQkJCXB1YiA9IFN0YXJ0Sm9iLlBVQkxJU0hfQkVGT1JFOwotCQl9Ci0JCQotCQlTdGFydEpvYiBzdGFydEpvYiA9IG5ldyBTdGFydEpvYihtb2RlMiwgcHViKTsKLQkJaWYgKG9wTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJc3RhcnRKb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJb3BMaXN0ZW5lci5kb25lKGV2ZW50LmdldFJlc3VsdCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlzdGFydEpvYi5zY2hlZHVsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9ub3VzU3RhcnQoU3RyaW5nIG1vZGUyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGRlbGVnYXRlIGlzIGxvYWRlZCBhbmQgdGhlIHNlcnZlciBzdGF0ZSBpcyBjb3JyZWN0Ci0JCWxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzLCBtb25pdG9yKTsKLQkJCi0JCWJ5dGUgcHViID0gU3RhcnRKb2IuUFVCTElTSF9OT05FOwotCQlpZiAoU2VydmVyQ29yZS5pc0F1dG9QdWJsaXNoaW5nKCkgJiYgc2hvdWxkUHVibGlzaCgpKSB7Ci0JCQlpZiAoKChTZXJ2ZXJUeXBlKWdldFNlcnZlclR5cGUoKSkuc3RhcnRCZWZvcmVQdWJsaXNoKCkpCi0JCQkJcHViID0gU3RhcnRKb2IuUFVCTElTSF9BRlRFUjsKLQkJCWVsc2UKLQkJCQlwdWIgPSBTdGFydEpvYi5QVUJMSVNIX0JFRk9SRTsKLQkJfQotCQkKLQkJU3RhcnRKb2Igc3RhcnRKb2IgPSBuZXcgU3RhcnRKb2IobW9kZTIsIHB1Yik7Ci0JCXN0YXJ0Sm9iLnNjaGVkdWxlKCk7Ci0JCQotCQl0cnkgewotCQkJc3RhcnRKb2Iuam9pbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3Igd2FpdGluZyBmb3Igam9iIiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNlcnZlciNzeW5jaHJvbm91c1Jlc3RhcnQoU3RyaW5nLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9ub3VzUmVzdGFydChTdHJpbmcgbW9kZTIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzeW5jaHJvbm91c1N0b3AodHJ1ZSk7Ci0JCXN5bmNocm9ub3VzU3RhcnQobW9kZTIsIG1vbml0b3IpOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2VydmVyI3Jlc3RhcnQoU3RyaW5nLCBJT3BlcmF0aW9uTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdGFydChTdHJpbmcgbW9kZTIsIGZpbmFsIElPcGVyYXRpb25MaXN0ZW5lciBvcExpc3RlbmVyKSB7Ci0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkgewotCQkJaWYgKG9wTGlzdGVuZXIgIT0gbnVsbCkKLQkJCQlvcExpc3RlbmVyLmRvbmUoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUT1BQRUQpIHsKLQkJCWlmIChvcExpc3RlbmVyICE9IG51bGwpCi0JCQkJb3BMaXN0ZW5lci5kb25lKFN0YXR1cy5PS19TVEFUVVMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlSZXN0YXJ0Sm9iIHJlc3RhcnRKb2IgPSBuZXcgUmVzdGFydEpvYihtb2RlMik7Ci0JCWlmIChvcExpc3RlbmVyICE9IG51bGwpIHsKLQkJCXJlc3RhcnRKb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJb3BMaXN0ZW5lci5kb25lKGV2ZW50LmdldFJlc3VsdCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlyZXN0YXJ0Sm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTZXJ2ZXIjc3RvcChib29sZWFuLCBJT3BlcmF0aW9uTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlLCBmaW5hbCBJT3BlcmF0aW9uTGlzdGVuZXIgb3BMaXN0ZW5lcikgewotCQlpZiAoZ2V0U2VydmVyVHlwZSgpID09IG51bGwpIHsKLQkJCWlmIChvcExpc3RlbmVyICE9IG51bGwpCi0JCQkJb3BMaXN0ZW5lci5kb25lKFN0YXR1cy5PS19TVEFUVVMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCWlmIChvcExpc3RlbmVyICE9IG51bGwpCi0JCQkJb3BMaXN0ZW5lci5kb25lKFN0YXR1cy5PS19TVEFUVVMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdG9wSm9iIGpvYiA9IG5ldyBTdG9wSm9iKGZvcmNlKTsKLQkJaWYgKG9wTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJam9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCW9wTGlzdGVuZXIuZG9uZShldmVudC5nZXRSZXN1bHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJam9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTZXJ2ZXIjc3luY2hyb25vdXNTdG9wKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbm91c1N0b3AoYm9vbGVhbiBmb3JjZSkgewotCQlpZiAoZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm47Ci0JCQotCQlTdG9wSm9iIGpvYiA9IG5ldyBTdG9wSm9iKGZvcmNlKTsKLQkJam9iLnNjaGVkdWxlKCk7Ci0JCXRyeSB7Ci0JCQlqb2Iuam9pbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3Igd2FpdGluZyBmb3Igam9iIiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRyaWdnZXIgYSByZXN0YXJ0IG9mIHRoZSBnaXZlbiBtb2R1bGUgYW5kIHdhaXQgdW50aWwgaXQgaGFzIGZpbmlzaGVkIHJlc3RhcnRpbmcuCi0JICoKLQkgKiBAcGFyYW0gbW9kdWxlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIC0gdGhyb3duIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gcmVzdGFydCB0aGUgbW9kdWxlCi0JICoKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbm91c1Jlc3RhcnRNb2R1bGUoZmluYWwgSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzTW9kdWxlUmVzdGFydCAxIik7Ci0KLQkJZmluYWwgT2JqZWN0IG11dGV4ID0gbmV3IE9iamVjdCgpOwotCQotCQkvLyBhZGQgbGlzdGVuZXIgdG8gdGhlIG1vZHVsZQotCQlJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQlpZiAoZXZlbnRLaW5kID09IChTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSkgewotCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKTsKLQkJCQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c01vZHVsZVJlc3RhcnQgbm90aWZ5Iik7Ci0JCQkJCQkJCW11dGV4Lm5vdGlmeUFsbCgpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBtb2R1bGUgcmVzdGFydCIsIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJYWRkU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJLy8gbWFrZSBzdXJlIGl0IHRpbWVzIG91dCBhZnRlciAzMHMKLQkJY2xhc3MgVGltZXIgewotCQkJYm9vbGVhbiB0aW1lb3V0OwotCQkJYm9vbGVhbiBhbHJlYWR5RG9uZTsKLQkJfQotCQlmaW5hbCBUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOwotCQkKLQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDMwMDAwKTsKLQkJCQkJaWYgKCF0aW1lci5hbHJlYWR5RG9uZSkgewotCQkJCQkJdGltZXIudGltZW91dCA9IHRydWU7Ci0JCQkJCQkvLyBub3RpZnkgd2FpdGVyCi0JCQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNNb2R1bGVSZXN0YXJ0IG5vdGlmeSB0aW1lb3V0Iik7Ci0JCQkJCQkJbXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgbW9kdWxlIHJlc3RhcnQgdGltZW91dCIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzTW9kdWxlUmVzdGFydCAyIik7Ci0JCi0JCS8vIHJlc3RhcnQgdGhlIG1vZHVsZQotCQl0cnkgewotCQkJZ2V0QmVoYXZpb3VyRGVsZWdhdGUobnVsbCkucmVzdGFydE1vZHVsZShtb2R1bGUsIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXRocm93IGU7Ci0JCX0KLQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNNb2R1bGVSZXN0YXJ0IDMiKTsKLQkKLQkJLy8gd2FpdCBmb3IgaXQhIHdhaXQgZm9yIGl0ISAuLi4KLQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoIXRpbWVyLnRpbWVvdXQgJiYgIShnZXRNb2R1bGVTdGF0ZShtb2R1bGUpID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCB8fCBnZXRNb2R1bGVTdGF0ZShtb2R1bGUpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkpCi0JCQkJCW11dGV4LndhaXQoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igd2FpdGluZyBmb3Igc2VydmVyIHN0YXJ0IiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGltZXIudGltZW91dCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JNb2R1bGVSZXN0YXJ0RmFpbGVkLCBnZXROYW1lKCkpLCBudWxsKSk7Ci0JCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKLQkJCi0JCWlmIChnZXRNb2R1bGVTdGF0ZShtb2R1bGUpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JNb2R1bGVSZXN0YXJ0RmFpbGVkLCBnZXROYW1lKCkpLCBudWxsKSk7Ci0JCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzTW9kdWxlUmVzdGFydCA0Iik7Ci0JfSovCi0KLQlwdWJsaWMgSVBhdGggZ2V0VGVtcERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFRlbXBEaXJlY3RvcnkoZ2V0SWQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRYTUxSb290KCkgewotCQlyZXR1cm4gInNlcnZlciI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJcmVzb2x2ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlcmlhbGl6ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCXNhdmUobWVtZW50byk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVzZXJpYWxpemUoSU1lbWVudG8gbWVtZW50bykgewotCQlsb2FkKG1lbWVudG8pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc29sdmUoKSB7Ci0JCUlTZXJ2ZXJUeXBlIG9sZFNlcnZlclR5cGUgPSBzZXJ2ZXJUeXBlOwotCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gZ2V0QXR0cmlidXRlKCJzZXJ2ZXItdHlwZS1pZCIsIChTdHJpbmcpbnVsbCk7Ci0JCWlmIChzZXJ2ZXJUeXBlSWQgIT0gbnVsbCkKLQkJCXNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlclR5cGVJZCk7Ci0JCWVsc2UKLQkJCXNlcnZlclR5cGUgPSBudWxsOwotCQlpZiAoc2VydmVyVHlwZSAhPSBudWxsICYmICFzZXJ2ZXJUeXBlLmVxdWFscyhvbGRTZXJ2ZXJUeXBlKSkKLQkJCXNlcnZlclN0YXRlID0gKChTZXJ2ZXJUeXBlKXNlcnZlclR5cGUpLmdldEluaXRpYWxTdGF0ZSgpOwotCQkKLQkJU3RyaW5nIHJ1bnRpbWVJZCA9IGdldEF0dHJpYnV0ZShSVU5USU1FX0lELCAoU3RyaW5nKW51bGwpOwotCQlpZiAocnVudGltZUlkICE9IG51bGwpCi0JCQlydW50aW1lID0gU2VydmVyQ29yZS5maW5kUnVudGltZShydW50aW1lSWQpOwotCQkKLQkJU3RyaW5nIGNvbmZpZ1BhdGggPSBnZXRBdHRyaWJ1dGUoQ09ORklHVVJBVElPTl9JRCwgKFN0cmluZyludWxsKTsKLQkJY29uZmlndXJhdGlvbiA9IG51bGw7Ci0JCWlmIChjb25maWdQYXRoICE9IG51bGwpCi0JCQljb25maWd1cmF0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIobmV3IFBhdGgoY29uZmlnUGF0aCkpOwotCi0JCS8vIGZvciBtaWdyYXRpb24gZnJvbSBXVFAgMi4wIC0+IFdUUCAzLjAKLQkJaW50IGF1dG9QdWJTZXR0aW5nID0gZ2V0QXR0cmlidXRlKFBST1BfQVVUT19QVUJMSVNIX1NFVFRJTkcsIEFVVE9fUFVCTElTSF9FTkFCTEUpOwotCQlpZiAoYXV0b1B1YlNldHRpbmcgPT0gMCkKLQkJCW1hcC5wdXQoUFJPUF9BVVRPX1BVQkxJU0hfU0VUVElORywgQVVUT19QVUJMSVNIX0VOQUJMRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWwoU2VydmVyV29ya2luZ0NvcHkgd2MpIHsKLQkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHdjLm1hcCk7Ci0JCWNvbmZpZ3VyYXRpb24gPSB3Yy5jb25maWd1cmF0aW9uOwotCQlydW50aW1lID0gd2MucnVudGltZTsKLQkJc2VydmVyU3luY1N0YXRlID0gd2Muc2VydmVyU3luY1N0YXRlOwotCQkvL3Jlc3RhcnROZWVkZWQgPSB3Yy5yZXN0YXJ0TmVlZGVkOwotCQlzZXJ2ZXJUeXBlID0gd2Muc2VydmVyVHlwZTsKLQkJbW9kdWxlcyA9IHdjLm1vZHVsZXM7Ci0JCQotCQkvLyBjYW4gbmV2ZXIgbW9kaWZ5IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyB2aWEgdGhlIHdvcmtpbmcgY29weQotCQkvL3NlcnZlclN0YXRlID0gd2Muc2VydmVyU3RhdGU7Ci0JCWRlbGVnYXRlID0gd2MuZGVsZWdhdGU7Ci0JCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCi0JCQlhdXRvUHVibGlzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwpCi0JCQltZW1lbnRvLnB1dFN0cmluZygic2VydmVyLXR5cGUiLCBzZXJ2ZXJUeXBlLmdldElkKCkpOwotCQkKLQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLQkJCW1lbWVudG8ucHV0U3RyaW5nKENPTkZJR1VSQVRJT05fSUQsIGNvbmZpZ3VyYXRpb24uZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJZWxzZQotCQkJbWVtZW50by5wdXRTdHJpbmcoQ09ORklHVVJBVElPTl9JRCwgbnVsbCk7Ci0JCQotCQlpZiAocnVudGltZSAhPSBudWxsKQotCQkJbWVtZW50by5wdXRTdHJpbmcoUlVOVElNRV9JRCwgcnVudGltZS5nZXRJZCgpKTsKLQkJZWxzZQotCQkJbWVtZW50by5wdXRTdHJpbmcoUlVOVElNRV9JRCwgbnVsbCk7Ci0JfQotCi0JLypwdWJsaWMgdm9pZCB1cGRhdGVDb25maWd1cmF0aW9uKCkgewotCQl0cnkgewotCQkJZ2V0RGVsZWdhdGUobnVsbCkudXBkYXRlQ29uZmlndXJhdGlvbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSB1cGRhdGVDb25maWd1cmF0aW9uKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfSovCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJDb25maWd1cmF0aW9uI2Nhbk1vZGlmeU1vZHVsZShvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5Nb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoKGFkZCA9PSBudWxsIHx8IGFkZC5sZW5ndGggPT0gMCkgJiYgKHJlbW92ZSA9PSBudWxsIHx8IHJlbW92ZS5sZW5ndGggPT0gMCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBZGQgYW5kIHJlbW92ZSBjYW5ub3QgYm90aCBiZSBudWxsL2VtcHR5Iik7Ci0JCQotCQlpZiAoYWRkICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gYWRkLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCWlmIChhZGRbaV0gPT0gbnVsbCkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGFkZCBudWxsIGVudHJpZXMiKTsKLQkJfQotCQkKLQkJaWYgKHJlbW92ZSAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHJlbW92ZS5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlpZiAocmVtb3ZlW2ldID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCByZW1vdmUgbnVsbCBlbnRyaWVzIik7Ci0JCX0KLQkJCi0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTWlzc2luZ0FkYXB0ZXIsIG51bGwpOwotCQkKLQkJaWYgKGFkZCAhPSBudWxsICYmIGFkZC5sZW5ndGggPiAwKSB7Ci0JCQlpbnQgc2l6ZSA9IGFkZC5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGVUeXBlIG1vZHVsZVR5cGUgPSBhZGRbaV0uZ2V0TW9kdWxlVHlwZSgpOyAKLQkJCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUoZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlVHlwZSkpCi0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ2Fubm90QWRkTW9kdWxlLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IG1vZHVsZVR5cGUuZ2V0TmFtZSgpLCBtb2R1bGVUeXBlLmdldFZlcnNpb24oKSB9KSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUobW9uaXRvcikuY2FuTW9kaWZ5TW9kdWxlcyhhZGQsIHJlbW92ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIGNhbk1vZGlmeU1vZHVsZXMoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciNnZXRNb2R1bGVzKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoKSB7Ci0JCWlmIChtb2R1bGVzID09IG51bGwpIHsKLQkJCS8vIGNvbnZlcnQgZnJvbSBhdHRyaWJ1dGUKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gZ2V0QXR0cmlidXRlKE1PRFVMRV9MSVNULCAoTGlzdDxTdHJpbmc+KSBudWxsKTsKLQkJCWlmIChsaXN0ID09IG51bGwpCi0JCQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigxKTsKLQkJCQotCQkJbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4obGlzdC5zaXplKCkgKyAxKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBtb2R1bGVJZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmcgbmFtZSA9ICI8dW5rbm93bj4iOwotCQkJCWludCBpbmRleCA9IG1vZHVsZUlkLmluZGV4T2YoIjo6Iik7Ci0JCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCQluYW1lID0gbW9kdWxlSWQuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJbW9kdWxlSWQgPSBtb2R1bGVJZC5zdWJzdHJpbmcoaW5kZXgrMik7Ci0JCQkJfQotCQkJCQotCQkJCVN0cmluZyBtb2R1bGVUeXBlSWQgPSBudWxsOwotCQkJCVN0cmluZyBtb2R1bGVUeXBlVmVyc2lvbiA9IG51bGw7Ci0JCQkJaW5kZXggPSBtb2R1bGVJZC5pbmRleE9mKCI6OiIpOwotCQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkJaW50IGluZGV4MiA9IG1vZHVsZUlkLmluZGV4T2YoIjo6IiwgaW5kZXgrMSk7Ci0JCQkJCW1vZHVsZVR5cGVJZCA9IG1vZHVsZUlkLnN1YnN0cmluZyhpbmRleCsyLCBpbmRleDIpOwotCQkJCQltb2R1bGVUeXBlVmVyc2lvbiA9IG1vZHVsZUlkLnN1YnN0cmluZyhpbmRleDIrMik7Ci0JCQkJCW1vZHVsZUlkID0gbW9kdWxlSWQuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQl9Ci0JCQkJCi0JCQkJSU1vZHVsZSBtb2R1bGUgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZShtb2R1bGVJZCk7Ci0JCQkJaWYgKG1vZHVsZSA9PSBudWxsKSB7Ci0JCQkJCUlNb2R1bGVUeXBlIG1vZHVsZVR5cGUgPSBudWxsOwotCQkJCQlpZiAobW9kdWxlVHlwZUlkICE9IG51bGwpCi0JCQkJCQltb2R1bGVUeXBlID0gTW9kdWxlVHlwZS5nZXRNb2R1bGVUeXBlKG1vZHVsZVR5cGVJZCwgbW9kdWxlVHlwZVZlcnNpb24pOwotCQkJCQltb2R1bGUgPSBuZXcgRGVsZXRlZE1vZHVsZShtb2R1bGVJZCwgbmFtZSwgbW9kdWxlVHlwZSk7Ci0JCQkJfQotCQkJCW1vZHVsZXMuYWRkKG1vZHVsZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUxpc3QgZW0gPSBnZXRFeHRlcm5hbE1vZHVsZXMoKTsKLQkJaWYgKGVtID09IG51bGwgfHwgZW0uaXNFbXB0eSgpKSB7Ci0JCQlJTW9kdWxlW10gbW9kdWxlczIgPSBuZXcgSU1vZHVsZVttb2R1bGVzLnNpemUoKV07Ci0JCQltb2R1bGVzLnRvQXJyYXkobW9kdWxlczIpOwotCQkJcmV0dXJuIG1vZHVsZXMyOwotCQl9Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlczIgPSBuZXcgSU1vZHVsZVttb2R1bGVzLnNpemUoKSArIGVtLnNpemUoKV07Ci0JCW1vZHVsZXMudG9BcnJheShtb2R1bGVzMik7Ci0JCQotCQlPYmplY3RbXSBvYmogPSBlbS50b0FycmF5KCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkob2JqLCAwLCBtb2R1bGVzMiwgbW9kdWxlcy5zaXplKCksIGVtLnNpemUoKSk7Ci0JCQotCQlyZXR1cm4gbW9kdWxlczI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIjZ2V0TW9kdWxlU3RhdGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlU3RhdGUoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyIGluID0gbW9kdWxlU3RhdGUuZ2V0KGdldEtleShtb2R1bGUpKTsKLQkJCWlmIChpbiAhPSBudWxsKQotCQkJCXJldHVybiBpbi5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIFNUQVRFX1VOS05PV047Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIjZ2V0TW9kdWxlU3RhdGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlUHVibGlzaFN0YXRlKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSIpOwotCQl0cnkgewotCQkJSW50ZWdlciBpbiA9IG1vZHVsZVB1Ymxpc2hTdGF0ZS5nZXQoZ2V0S2V5KG1vZHVsZSkpOwotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJcmV0dXJuIGluLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gUFVCTElTSF9TVEFURV9VTktOT1dOOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2VydmVyI2dldENoaWxkTW9kdWxlKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJTW9kdWxlW10gbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSIpOwotCQl0cnkgewotCQkJaW50IGkgPSBtb2R1bGUubGVuZ3RoIC0gMTsKLQkJCWlmIChtb2R1bGVbaV0uZ2V0UHJvamVjdCgpID09IG51bGwgfHwgIW1vZHVsZVtpXS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCVNlcnZlckRlbGVnYXRlIHNkID0gZ2V0RGVsZWdhdGUobW9uaXRvcik7Ci0JCQlpZiAoc2QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IHNkLmdldENoaWxkTW9kdWxlcyhtb2R1bGUpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID09IDEgJiYgY2hpbGRyZW5bMF0uZXF1YWxzKG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV0pKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBnZXRDaGlsZE1vZHVsZXMoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJU2VydmVyI2dldFJvb3RNb2R1bGVzKElNb2R1bGUpCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRSb290TW9kdWxlcyhJTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCIpOwotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKG1vbml0b3IpLmdldFJvb3RNb2R1bGVzKG1vZHVsZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gc2UpIHsKLQkJCS8vVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJDb3JlRXhjZXB0aW9uIGNhbGxpbmcgZGVsZWdhdGUgZ2V0UGFyZW50TW9kdWxlcygpICIgKyB0b1N0cmluZygpLCBzZSk7Ci0JCQl0aHJvdyBzZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgZ2V0UGFyZW50TW9kdWxlcygpICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbW9kdWxlIGNhbiBiZSByZXN0YXJ0ZWQuCi0JICoKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1vZHVsZSBjYW4gYmUKLQkgKiAgICByZXN0YXJ0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuQ29udHJvbE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSIpOwotCQl0cnkgewotCQkJU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUgYmQgPSBnZXRCZWhhdmlvdXJEZWxlZ2F0ZShtb25pdG9yKTsKLQkJCWlmIChiZCA9PSBudWxsKQotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUmVzdGFydE1vZHVsZSwgbnVsbCk7Ci0JCQlib29sZWFuIGIgPSBiZC5jYW5Db250cm9sTW9kdWxlKG1vZHVsZSk7Ci0JCQlpZiAoYikKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgY2FuUmVzdGFydFJ1bnRpbWUoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JSZXN0YXJ0TW9kdWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbW9kdWxlIGlzIGluIHN5bmMgb24gdGhlIHNlcnZlci4gSXQgc2hvdWxkCi0JICogcmV0dXJuIHRydWUgaWYgdGhlIG1vZHVsZSBzaG91bGQgYmUgcmVzdGFydGVkIChpcyBvdXQgb2YKLQkgKiBzeW5jKSBvciBmYWxzZSBpZiB0aGUgbW9kdWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVzdGFydGVkLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1vZHVsZVJlc3RhcnRTdGF0ZShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUubGVuZ3RoID09IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKLQkJdHJ5IHsKLQkJCUJvb2xlYW4gYiA9IG1vZHVsZVJlc3RhcnRTdGF0ZS5nZXQoZ2V0S2V5KG1vZHVsZSkpOwotCQkJaWYgKGIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNlcnZlciNzdGFydE1vZHVsZShJTW9kdWxlW10sIElPcGVyYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSBvciBlbXB0eSIpOwotCQl0cnkgewotCQkJZ2V0QmVoYXZpb3VyRGVsZWdhdGUobnVsbCkuc3RhcnRNb2R1bGUobW9kdWxlLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgcmVzdGFydE1vZHVsZSgpICIgKyB0b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJU2VydmVyI3N0b3BNb2R1bGUoSU1vZHVsZVtdLCBJT3BlcmF0aW9uTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSBvciBlbXB0eSIpOwotCQl0cnkgewotCQkJZ2V0QmVoYXZpb3VyRGVsZWdhdGUobnVsbCkuc3RvcE1vZHVsZShtb2R1bGUsIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSByZXN0YXJ0TW9kdWxlKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTZXJ2ZXIjcmVzdGFydE1vZHVsZShJTW9kdWxlW10sIElPcGVyYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0TW9kdWxlKElNb2R1bGVbXSBtb2R1bGUsIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0JCXRyeSB7Ci0JCQlnZXRCZWhhdmlvdXJEZWxlZ2F0ZShudWxsKS5yZXN0YXJ0TW9kdWxlKG1vZHVsZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHJlc3RhcnRNb2R1bGUoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIElTZXJ2ZXJQb3J0cyB0aGF0IHRoaXMgc2VydmVyIGhhcy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBzZXJ2ZXJzIHBvcnRzCi0JICovCi0JcHVibGljIFNlcnZlclBvcnRbXSBnZXRTZXJ2ZXJQb3J0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZShtb25pdG9yKS5nZXRTZXJ2ZXJQb3J0cygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBnZXRTZXJ2ZXJQb3J0cygpICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVmlzaXQgYWxsIHRoZSBtb2R1bGVzIGluIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgZ2l2ZW4gbW9kdWxlIHZpc2l0b3IuCi0JICogCi0JICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3IKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICovCi0JcHVibGljIHZvaWQgdmlzaXQoSU1vZHVsZVZpc2l0b3IgdmlzaXRvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICh2aXNpdG9yID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWaXNpdG9yIGNhbm5vdCBiZSBudWxsIik7Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlczIgPSBnZXRNb2R1bGVzKCk7Ci0JCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7IAotCQkJaW50IHNpemUgPSBtb2R1bGVzMi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmICghdmlzaXRNb2R1bGUobmV3IElNb2R1bGVbXSB7IG1vZHVsZXMyW2ldIH0sIHZpc2l0b3IsIG1vbml0b3IpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgdG8ga2VlcCB2aXNpdGluZywgYW5kIGZhbHNlIHRvIHN0b3AuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2aXNpdE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJTW9kdWxlVmlzaXRvciB2aXNpdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZiAoIXZpc2l0b3IudmlzaXQobW9kdWxlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUlNb2R1bGVbXSBjaGlsZHJlbiA9IGdldENoaWxkTW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGVbXSBtb2R1bGUyID0gbmV3IElNb2R1bGVbbW9kdWxlLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobW9kdWxlLCAwLCBtb2R1bGUyLCAwLCBtb2R1bGUubGVuZ3RoKTsKLQkJCQltb2R1bGUyW21vZHVsZS5sZW5ndGhdID0gY2hpbGRyZW5baV07Ci0JCQkJCi0JCQkJaWYgKCF2aXNpdE1vZHVsZShtb2R1bGUyLCB2aXNpdG9yLCBtb25pdG9yKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEtleShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtb2R1bGUubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlzYi5hcHBlbmQoIiMiKTsKLQkJCQlzYi5hcHBlbmQobW9kdWxlW2ldLmdldElkKCkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVTdGF0dXMoSU1vZHVsZVtdIG1vZHVsZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSIpOwotCQltb2R1bGVTdGF0dXMucHV0KGdldEtleShtb2R1bGUpLCBzdGF0dXMpOwotCQkvL2ZpcmVTZXJ2ZXJNb2R1bGVTdGF0ZUNoYW5nZUV2ZW50KG1vZHVsZSk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0TW9kdWxlU3RhdHVzKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSIpOwotCQl0cnkgewotCQkJcmV0dXJuIG1vZHVsZVN0YXR1cy5nZXQoZ2V0S2V5KG1vZHVsZSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJc2VydmVyU3RhdHVzID0gc3RhdHVzOwotCQkvL2ZpcmVTZXJ2ZXJTdGF0ZUNoYW5nZUV2ZW50KCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U2VydmVyU3RhdHVzKCkgewotCQlyZXR1cm4gc2VydmVyU3RhdHVzOwotCX0KLQotCS8qKgotCSAqIFN3aXRjaCB0aGUgc2VydmVyJ3MgbG9jYXRpb24gYmV0d2VlbiB0aGUgd29ya3NwYWNlIGFuZCAubWV0YWRhdGEuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzd2l0Y2hMb2NhdGlvbihTZXJ2ZXIgc2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IHNlcnZlci5nZXRGaWxlKCk7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHdjID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJc2VydmVyLmRlbGV0ZSgpOwotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gU2VydmVyVHlwZS5nZXRTZXJ2ZXJQcm9qZWN0KCk7Ci0JCQlmaWxlID0gU2VydmVyVXRpbC5nZXRVbnVzZWRTZXJ2ZXJGaWxlKHByb2plY3QsIHdjKTsKLQkJCXdjLnNldEZpbGUoZmlsZSk7Ci0JCQlzZXJ2ZXIuZmlsZSA9IGZpbGU7Ci0JCX0gZWxzZSB7Ci0JCQl3Yy5zZXRGaWxlKG51bGwpOwotCQkJc2VydmVyLmZpbGUgPSBudWxsOwotCQl9Ci0JCXdjLnNhdmUodHJ1ZSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2VydmVyIChzZWUgU0VSVkVSX1hYWCBjb25zdGFudHMpIGFmdGVyCi0JICogcmVmcmVzaGluZyB0aGUgc3RhdGUgb2YgdGhlIHNlcnZlci4gVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgbWV0aG9kCi0JICogYW5kIHRoZSBtZXRob2Qgd2l0aG91dCBhIHByb2dyZXNzIG1vbml0b3IgaXMgdGhhdCB0aGlzIG1ldGhvZCBtYXkgY2F1c2UKLQkgKiBwbHVnaW4gbG9hZGluZyBhbmQgbm90IHJldHVybiBpbW1lZGlhdGVseS4gSG93ZXZlciwgdGhlIHNlcnZlciB3aWxsIGFsd2F5cwotCSAqIGJlIHVwZGF0ZWQgYW5kIGluIHN5bmMsIHNvIHRoZSBJU2VydmVyLlNUQVRFX1VOS05PV04gc3RhdGUgc2hvdWxkIG5ldmVyIGJlCi0JICogcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgc3RhdGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNlcnZlclN0YXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlsb2FkQWRhcHRlcihTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5jbGFzcywgbW9uaXRvcik7Ci0JCXJldHVybiBnZXRTZXJ2ZXJTdGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHB1Ymxpc2hJbXBsKGludCBraW5kLCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlczQsIElBZGFwdGFibGUgaW5mbywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0tPi0tIFB1Ymxpc2hpbmcgdG8gc2VydmVyOiAiICsgU2VydmVyLnRoaXMudG9TdHJpbmcoKSArICIgLS0+LS0iKTsKLQkJCi0JCXN0b3BBdXRvUHVibGlzaCgpOwotCQkKLQkJdHJ5IHsKLQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJZmlyZVB1Ymxpc2hTdGFydGVkKCk7Ci0JCQkKLQkJCWdldFNlcnZlclB1Ymxpc2hJbmZvKCkuc3RhcnRDYWNoaW5nKCk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl0cnkgewotCQkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG1vbml0b3IpLnB1Ymxpc2goa2luZCwgbW9kdWxlczQsIG1vbml0b3IsIGluZm8pOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBkdXJpbmcgcHVibGlzaGluZyIsIGNlKTsKLQkJCQlzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLQkJCX0KLQkJCQotCQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZXMyID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlW10+KCk7Ci0JCQl2aXNpdChuZXcgSU1vZHVsZVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZSkgewotCQkJCQlpZiAoZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSkgPT0gSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpCi0JCQkJCQlnZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLmZpbGwobW9kdWxlKTsKLQkJCQkJCi0JCQkJCW1vZHVsZXMyLmFkZChtb2R1bGUpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9LCBtb25pdG9yKTsKLQkJCQotCQkJZ2V0U2VydmVyUHVibGlzaEluZm8oKS5yZW1vdmVEZWxldGVkTW9kdWxlUHVibGlzaEluZm8oU2VydmVyLnRoaXMsIG1vZHVsZXMyKTsKLQkJCWdldFNlcnZlclB1Ymxpc2hJbmZvKCkuY2xlYXJDYWNoZSgpOwotCQkJZ2V0U2VydmVyUHVibGlzaEluZm8oKS5zYXZlKCk7Ci0JCQkKLQkJCWZpcmVQdWJsaXNoRmluaXNoZWQoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QRVJGT1JNQU5DRSwgIlNlcnZlci5wdWJsaXNoKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgcHVibGlzaCgpICIgKyBTZXJ2ZXIudGhpcy50b1N0cmluZygpLCBlKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaGluZywgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyByZXN0YXJ0SW1wbChTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlJlc3RhcnRpbmcgc2VydmVyOiAiICsgZ2V0TmFtZSgpKTsKLQkJCi0JCS8vZmluYWwgSVN0YXR1c1tdIHN0YXR1czIgPSBuZXcgSVN0YXR1c1sxXTsKLQkJCi0JCXRyeSB7Ci0JCQlJU2VydmVyTGlzdGVuZXIgY3VyTGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVEFSVEVEKSB7Ci0JCQkJCQkJc2VydmVyLnJlbW92ZVNlcnZlckxpc3RlbmVyKHRoaXMpOwotCQkJCQkJCS8vc3RhdHVzMlswXSA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJCi0JCQl0cnkgewotCQkJCWFkZFNlcnZlckxpc3RlbmVyKGN1ckxpc3RlbmVyKTsKLQkJCQkKLQkJCQkvLyBTeW5jaHJvbmVvdXMgcmVzdGFydAotCQkJCXJlc3RhcnRJbXBsMihsYXVuY2hNb2RlLCBtb25pdG9yKTsKLQkJCQkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihjdXJMaXN0ZW5lcik7Ci0JCQkJaWYgKGNlLmdldFN0YXR1cygpLmdldENvZGUoKSAhPSAtMSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHJlc3RhcnQoKSAiICsgU2VydmVyLnRoaXMudG9TdHJpbmcoKSk7Ci0JCQkJCXJldHVybiBjZS5nZXRTdGF0dXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZpbmFsIFN0cmluZyBtb2RlMyA9IGxhdW5jaE1vZGU7Ci0JCQkvLyBhZGQgbGlzdGVuZXIgdG8gc3RhcnQgaXQgYXMgc29vbiBhcyBpdCBpcyBzdG9wcGVkCi0JCQlhZGRTZXJ2ZXJMaXN0ZW5lcihuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEKSB7Ci0JCQkJCQkJc2VydmVyLnJlbW92ZVNlcnZlckxpc3RlbmVyKHRoaXMpOwotCi0JCQkJCQkJLy8gcmVzdGFydCBpbiBhIHF1YXJ0ZXIgc2Vjb25kIChnaXZlIG90aGVyIGxpc3RlbmVycyBhIGNoYW5jZQotCQkJCQkJCS8vIHRvIGhlYXIgdGhlIHN0b3BwZWQgbWVzc2FnZSkKLQkJCQkJCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIlNlcnZlciBSZXN0YXJ0IikgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCQkJU2VydmVyLnRoaXMuc3RhcnQobW9kZTMsIChJT3BlcmF0aW9uTGlzdGVuZXIpbnVsbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9OwotCQkJCQkJCXQuc2V0RGFlbW9uKHRydWUpOwotCQkJCQkJCXQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgLSAyKTsKLQkJCQkJCQl0LnN0YXJ0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJLy8gc3RvcCB0aGUgc2VydmVyCi0JCQlzdG9wKGZhbHNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlc3RhcnRpbmcgc2VydmVyIiwgZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclN0YXJ0RmFpbGVkLCBnZXROYW1lKCkpLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbmVvdXMgcmVzdGFydC4gVGhyb3dzIGEgY29yZSBleGNlcHRpb24gaW4gY2FzZSB0aGUgdGhlIGFkb3B0ZXIgZG9lc24ndCBpbXBsZW1lbnQgcmVzdGFydCAKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybiBJU3RhdHVzIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJlc3RhcnRJbXBsMihTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLQkJZmluYWwgYm9vbGVhbltdIG5vdGlmaWVkID0gbmV3IGJvb2xlYW5bMV07Ci0JCQotCQkvLyBhZGQgbGlzdGVuZXIgdG8gdGhlIHNlcnZlcgotCQlJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQlpZiAoZXZlbnRLaW5kID09IChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSkgewotCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKLQkJCQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJc3luY2hyb25pemVkIChub3RpZmllZCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzUmVzdGFydCBub3RpZnkiKTsKLQkJCQkJCQkJbm90aWZpZWRbMF0gPSB0cnVlOwotCQkJCQkJCQlub3RpZmllZC5ub3RpZnlBbGwoKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHJlc3RhcnQiLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWFkZFNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JCWZpbmFsIGludCByZXN0YXJ0VGltZW91dCA9IChnZXRTdGFydFRpbWVvdXQoKSAqIDEwMDApICsgKGdldFN0b3BUaW1lb3V0KCkgKiAxMDAwKTsKLQkJY2xhc3MgVGltZXIgewotCQkJYm9vbGVhbiB0aW1lb3V0OwotCQkJYm9vbGVhbiBhbHJlYWR5RG9uZTsKLQkJfQotCQlmaW5hbCBUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOwotCQkKLQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMiA9IG1vbml0b3I7Ci0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCJTZXJ2ZXIgUmVzdGFydCBUaW1lb3V0IikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWludCB0b3RhbFRpbWVvdXQgPSByZXN0YXJ0VGltZW91dDsKLQkJCQkJaWYgKHRvdGFsVGltZW91dCA8IDApCi0JCQkJCQl0b3RhbFRpbWVvdXQgPSAxOwotCQkJCQlib29sZWFuIHVzZXJDYW5jZWxsZWQgPSBmYWxzZTsKLQkJCQkJaW50IHJldHJ5UGVyaW9kID0gMjUwMDsKLQkJCQkJd2hpbGUgKCFub3RpZmllZFswXSAmJiB0b3RhbFRpbWVvdXQgPiAwICYmICF1c2VyQ2FuY2VsbGVkICYmICF0aW1lci5hbHJlYWR5RG9uZSkgewotCQkJCQkJVGhyZWFkLnNsZWVwKHJldHJ5UGVyaW9kKTsKLQkJCQkJCWlmIChyZXN0YXJ0VGltZW91dCA+IDApCi0JCQkJCQkJdG90YWxUaW1lb3V0IC09IHJldHJ5UGVyaW9kOwotCQkJCQkJaWYgKCFub3RpZmllZFswXSAmJiAhdGltZXIuYWxyZWFkeURvbmUgJiYgbW9uaXRvcjIuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJLy8gdXNlciBjYW5jZWxlZCAtIHNldCB0aGUgc2VydmVyIHN0YXRlIHRvIHN0b3BwZWQKLQkJCQkJCQl1c2VyQ2FuY2VsbGVkID0gdHJ1ZTsKLQkJCQkJCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQRUQpOwotCQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCQlzeW5jaHJvbml6ZWQgKG5vdGlmaWVkKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzUmVzdGFydCB1c2VyIGNhbmNlbGxlZCIpOwotCQkJCQkJCQlub3RpZmllZFswXSA9IHRydWU7Ci0JCQkJCQkJCW5vdGlmaWVkLm5vdGlmeUFsbCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXVzZXJDYW5jZWxsZWQgJiYgIXRpbWVyLmFscmVhZHlEb25lICYmICFub3RpZmllZFswXSkgewotCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJc3luY2hyb25pemVkIChub3RpZmllZCkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzUmVzdGFydCBub3RpZnkgdGltZW91dCIpOwotCQkJCQkJCWlmICghdGltZXIuYWxyZWFkeURvbmUgJiYgdG90YWxUaW1lb3V0IDw9IDApCi0JCQkJCQkJCXRpbWVyLnRpbWVvdXQgPSB0cnVlOwotCQkJCQkJCW5vdGlmaWVkWzBdID0gdHJ1ZTsKLQkJCQkJCQlub3RpZmllZC5ub3RpZnlBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBzZXJ2ZXIgcmVzdGFydCB0aW1lb3V0IiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0aHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNSZXN0YXJ0IDIiKTsKLQkKLQkJLy8gY2FsbCB0aGUgZGVsZWdhdGUgcmVzdGFydAotCQl0cnkgewotCQkJZ2V0QmVoYXZpb3VyRGVsZWdhdGUobnVsbCkucmVzdGFydChsYXVuY2hNb2RlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihlLmdldFN0YXR1cygpKTsKLQkJfQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJfQotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNSZXN0YXJ0IDMiKTsKLQkJCi0JCS8vIHdhaXQgZm9yIGl0ISB3YWl0IGZvciBpdCEgLi4uCi0JCXN5bmNocm9uaXplZCAobm90aWZpZWQpIHsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKCFub3RpZmllZFswXSAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgIXRpbWVyLnRpbWVvdXQKLQkJCQkJCSYmICEoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpKSB7Ci0JCQkJCW5vdGlmaWVkLndhaXQoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdhaXRpbmcgZm9yIHNlcnZlciByZXN0YXJ0IiwgZSk7Ci0JCQl9Ci0JCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7Ci0JCX0KLQkJcmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJaWYgKHRpbWVyLnRpbWVvdXQpIHsKLQkJCXN0b3AoZmFsc2UpOwotCQkJLy8gVE9ETyB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIGNoYW5nZWQgdG8gcmVzdGFydCB0aW1lIG91dAotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JSZXN0YXJ0RmFpbGVkLCBuZXcgU3RyaW5nW10geyBnZXROYW1lKCksIChyZXN0YXJ0VGltZW91dCAvIDEwMDApICsgIiIgfSksIG51bGwpOwotCQl9Ci0JCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQkvLyBUT0RPIHRoaXMgbWVzc2FnZSBzaG91bGQgYmUgY2hhbmdlZCB0byByZXN0YXJ0IHRpbWUgb3V0Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclJlc3RhcnRGYWlsZWQsIGdldE5hbWUoKSksIG51bGwpOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNSZXN0YXJ0IDQiKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXByb3RlY3RlZCBJU3RhdHVzIHN0YXJ0SW1wbChTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSBub3RpZmllZCA9IG5ldyBib29sZWFuWzFdOwotCQkKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkKLQkJLy8gYWRkIGxpc3RlbmVyIHRvIHRoZSBzZXJ2ZXIKLQkJSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQkJCQkvLyBub3RpZnkgd2FpdGVyCi0JCQkJCQlzeW5jaHJvbml6ZWQgKG5vdGlmaWVkKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCBub3RpZnkiKTsKLQkJCQkJCQkJbm90aWZpZWRbMF0gPSB0cnVlOwotCQkJCQkJCQlub3RpZmllZC5ub3RpZnlBbGwoKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHN0YXJ0IiwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlmaW5hbCBpbnQgc2VydmVyVGltZW91dCA9IGdldFN0YXJ0VGltZW91dCgpICogMTAwMDsKLQkJY2xhc3MgVGltZXIgewotCQkJYm9vbGVhbiB0aW1lb3V0OwotCQkJYm9vbGVhbiBhbHJlYWR5RG9uZTsKLQkJfQotCQlmaW5hbCBUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOwotCQkKLQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMiA9IG1vbml0b3I7Ci0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCJTZXJ2ZXIgU3RhcnQgVGltZW91dCIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgdG90YWxUaW1lb3V0ID0gc2VydmVyVGltZW91dDsKLQkJCQkJaWYgKHRvdGFsVGltZW91dCA8IDApCi0JCQkJCQl0b3RhbFRpbWVvdXQgPSAxOwotCQkJCQlib29sZWFuIHVzZXJDYW5jZWxsZWQgPSBmYWxzZTsKLQkJCQkJaW50IHJldHJ5UGVyaW9kID0gMjUwMDsKLQkJCQkJd2hpbGUgKCFub3RpZmllZFswXSAmJiB0b3RhbFRpbWVvdXQgPiAwICYmICF1c2VyQ2FuY2VsbGVkICYmICF0aW1lci5hbHJlYWR5RG9uZSkgewotCQkJCQkJVGhyZWFkLnNsZWVwKHJldHJ5UGVyaW9kKTsKLQkJCQkJCWlmIChzZXJ2ZXJUaW1lb3V0ID4gMCkKLQkJCQkJCQl0b3RhbFRpbWVvdXQgLT0gcmV0cnlQZXJpb2Q7Ci0JCQkJCQlpZiAoIW5vdGlmaWVkWzBdICYmICF0aW1lci5hbHJlYWR5RG9uZSAmJiBtb25pdG9yMi5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCQkvLyB1c2VyIGNhbmNlbGVkIC0gc2V0IHRoZSBzZXJ2ZXIgc3RhdGUgdG8gc3RvcHBlZAotCQkJCQkJCXVzZXJDYW5jZWxsZWQgPSB0cnVlOwotCQkJCQkJCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0JCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJCXN5bmNocm9uaXplZCAobm90aWZpZWQpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCB1c2VyIGNhbmNlbGxlZCIpOwotCQkJCQkJCQlub3RpZmllZFswXSA9IHRydWU7Ci0JCQkJCQkJCW5vdGlmaWVkLm5vdGlmeUFsbCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXVzZXJDYW5jZWxsZWQgJiYgIXRpbWVyLmFscmVhZHlEb25lICYmICFub3RpZmllZFswXSkgewotCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJc3luY2hyb25pemVkIChub3RpZmllZCkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzU3RhcnQgbm90aWZ5IHRpbWVvdXQiKTsKLQkJCQkJCQlpZiAoIXRpbWVyLmFscmVhZHlEb25lICYmIHRvdGFsVGltZW91dCA8PSAwKQotCQkJCQkJCQl0aW1lci50aW1lb3V0ID0gdHJ1ZTsKLQkJCQkJCQlub3RpZmllZFswXSA9IHRydWU7Ci0JCQkJCQkJbm90aWZpZWQubm90aWZ5QWxsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHN0YXJ0IHRpbWVvdXQiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IDIiKTsKLQkKLQkJLy8gc3RhcnQgdGhlIHNlcnZlcgotCQl0cnkgewotCQkJc3RhcnRJbXBsMihsYXVuY2hNb2RlLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJfQotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCAzIik7Ci0JCQotCQkvLyB3YWl0IGZvciBpdCEgd2FpdCBmb3IgaXQhIC4uLgotCQlzeW5jaHJvbml6ZWQgKG5vdGlmaWVkKSB7Ci0JCQl0cnkgewotCQkJCXdoaWxlICghbm90aWZpZWRbMF0gJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmICF0aW1lci50aW1lb3V0Ci0JCQkJCQkmJiAhKGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEIHx8IGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSkgewotCQkJCQlub3RpZmllZC53YWl0KCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3YWl0aW5nIGZvciBzZXJ2ZXIgc3RhcnQiLCBlKTsKLQkJCX0KLQkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKLQkJfQotCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlpZiAodGltZXIudGltZW91dCkgewotCQkJc3RvcChmYWxzZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclN0YXJ0VGltZW91dCwgbmV3IFN0cmluZ1tdIHsgZ2V0TmFtZSgpLCAoc2VydmVyVGltZW91dCAvIDEwMDApICsgIiIgfSksIG51bGwpOwotCQl9Ci0JCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclN0YXJ0RmFpbGVkLCBnZXROYW1lKCkpLCBudWxsKTsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzU3RhcnQgNCIpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydEltcGwyKFN0cmluZyBtb2RlMiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlN0YXJ0aW5nIHNlcnZlcjogIiArIFNlcnZlci50aGlzLnRvU3RyaW5nKCkgKyAiLCBsYXVuY2hNb2RlOiAiICsgbW9kZTIpOwotCQkKLQkJLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGRlbGVnYXRlIGlzIGxvYWRlZCBhbmQgdGhlIHNlcnZlciBzdGF0ZSBpcyBjb3JyZWN0Ci0JCWxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzLCBtb25pdG9yKTsKLQkJCi0JCXRyeSB7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKHRydWUsIG1vbml0b3IpOwotCQkJLy9pZiAobGF1bmNoQ29uZmlnID09IG51bGwpCi0JCQkvLwl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigpOwotCQkJbGF1bmNoID0gbGF1bmNoQ29uZmlnLmxhdW5jaChtb2RlMiwgbW9uaXRvcik7IC8vICwgdHJ1ZSk7IC0gY2F1c2VzIHdvcmtzcGFjZSBsb2NrCi0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMYXVuY2g6ICIgKyBsYXVuY2gpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHN0YXJ0aW5nIHNlcnZlciAiICsgU2VydmVyLnRoaXMudG9TdHJpbmcoKSwgZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgc3RvcEltcGwoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIE9iamVjdCBtdXRleCA9IG5ldyBPYmplY3QoKTsKLQkJCi0JCS8vIGFkZCBsaXN0ZW5lciB0byB0aGUgc2VydmVyCi0JCUlTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQlJU2VydmVyIHNlcnZlciA9IGV2ZW50LmdldFNlcnZlcigpOwotCQkJCWlmIChldmVudEtpbmQgPT0gKFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpKSB7Ci0JCQkJCWludCBzdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQkJCQlpZiAoU2VydmVyLnRoaXMgPT0gc2VydmVyICYmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQgfHwgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSkgewotCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCW11dGV4Lm5vdGlmeUFsbCgpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBzZXJ2ZXIgc3RvcCIsIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJYWRkU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJY2xhc3MgVGltZXIgewotCQkJYm9vbGVhbiB0aW1lb3V0OwotCQkJYm9vbGVhbiBhbHJlYWR5RG9uZTsKLQkJfQotCQlmaW5hbCBUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOwotCQkKLQkJZmluYWwgaW50IHNlcnZlclRpbWVvdXQgPSBnZXRTdG9wVGltZW91dCgpICogMTAwMDsKLQkJaWYgKHNlcnZlclRpbWVvdXQgPiAwKSB7Ci0JCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgiU2VydmVyIFN0b3AgVGltZW91dCIpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoc2VydmVyVGltZW91dCk7Ci0JCQkJCQlpZiAoIXRpbWVyLmFscmVhZHlEb25lKSB7Ci0JCQkJCQkJdGltZXIudGltZW91dCA9IHRydWU7Ci0JCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3RvcCBub3RpZnkgdGltZW91dCIpOwotCQkJCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHN0b3AgdGltZW91dCIsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCQl0aHJlYWQuc3RhcnQoKTsKLQkJfQotCQkKLQkJLy8gc3RvcCB0aGUgc2VydmVyCi0JCXN0b3BJbXBsMihmb3JjZSk7Ci0JCQotCQkvLyB3YWl0IGZvciBpdCEgd2FpdCBmb3IgaXQhCi0JCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKCF0aW1lci50aW1lb3V0ICYmIGdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEICYmCi0JCQkJCQlnZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkKLQkJCQkJbXV0ZXgud2FpdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3YWl0aW5nIGZvciBzZXJ2ZXIgc3RvcCIsIGUpOwotCQkJfQotCQl9Ci0JCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JCS8vY2FuJ3QgdGhyb3cgZXhjZXB0aW9ucwotCQkvKmlmICh0aW1lci50aW1lb3V0KQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JTdGFydFRpbWVvdXQsIGdldE5hbWUoKSksIG51bGwpOwotCQllbHNlCi0JCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7Ci0JCSovCi0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yU3RvcEZhaWxlZCwgZ2V0TmFtZSgpKSwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9wSW1wbDIoYm9vbGVhbiBmb3JjZSkgewotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiU3RvcHBpbmcgc2VydmVyOiAiICsgU2VydmVyLnRoaXMudG9TdHJpbmcoKSk7Ci0JCQotCQl0cnkgewotCQkJZ2V0QmVoYXZpb3VyRGVsZWdhdGUobnVsbCkuc3RvcChmb3JjZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBzdG9wKCkgIiArIFNlcnZlci50aGlzLnRvU3RyaW5nKCksIGUpOwotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgc3RvcCgpICIgKyBTZXJ2ZXIudGhpcy50b1N0cmluZygpLCB0KTsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJcmV0dXJuIChydWxlIGluc3RhbmNlb2YgSVNlcnZlciB8fCBydWxlIGluc3RhbmNlb2YgU2VydmVyU2NoZWR1bGluZ1J1bGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJaWYgKCEocnVsZSBpbnN0YW5jZW9mIElTZXJ2ZXIpICYmICEocnVsZSBpbnN0YW5jZW9mIFNlcnZlclNjaGVkdWxpbmdSdWxlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChydWxlIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJSVNlcnZlciBzID0gKElTZXJ2ZXIpIHJ1bGU7Ci0JCQlyZXR1cm4gdGhpcy5lcXVhbHMocyk7Ci0JCX0KLQkJU2VydmVyU2NoZWR1bGluZ1J1bGUgc3NydWxlID0gKFNlcnZlclNjaGVkdWxpbmdSdWxlKSBydWxlOwotCQlyZXR1cm4gc3NydWxlLnNlcnZlci5lcXVhbHModGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTQ4ZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU2VydmVyTGlmZWN5Y2xlQWRhcHRlcjsKLS8qKgotICogTGlzdGVucyBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVycy4gVGhpcyBjbGFzcyBrZWVwcwotICogdHJhY2sgb2Ygc2VydmVyIGluc3RhbmNlcyBjdXJyZW50IHN0YXRlIGFuZCBhbnkgY2xpZW50cwotICogdGhhdCBhcmUgd2FpdGluZyB0byBydW4gb24gdGhlIHNlcnZlci4gCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJMaXN0ZW5lciBleHRlbmRzIFNlcnZlckxpZmVjeWNsZUFkYXB0ZXIgaW1wbGVtZW50cyBJU2VydmVyTGlzdGVuZXIgewotCS8vIHN0YXRpYyBpbnN0YW5jZQotCXByb3RlY3RlZCBzdGF0aWMgU2VydmVyTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJMaXN0ZW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgU2VydmVyTGlzdGVuZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgc3RhdGljIGluc3RhbmNlLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwucGx1Z2luLlNlcnZlckxpc3RlbmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJMaXN0ZW5lciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQlsaXN0ZW5lciA9IG5ldyBTZXJ2ZXJMaXN0ZW5lcigpOwotCQlyZXR1cm4gbGlzdGVuZXI7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbidzIHN5bmMgc3RhdGUgY2hhbmdlcy4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5tb2RlbC5JU2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblN5bmNTdGF0ZUNoYW5nZShJU2VydmVyIHNlcnZlcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQSBuZXcgcmVzb3VyY2UgaGFzIGJlZW4gYWRkZWQuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc2VydmVyQWRkZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc2VydmVyLmFkZFNlcnZlckxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEEgZXhpc3RpbmcgcmVzb3VyY2UgaGFzIGJlZW4gcmVtb3ZlZC4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXJ2ZXJSZW1vdmVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXNlcnZlci5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTW9uaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGRjNmI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlck1vbml0b3IgaW1wbGVtZW50cyBJU2VydmVyTW9uaXRvciB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFNlcnZlck1vbml0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIE1vbml0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJNb25pdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBkZWZhdWx0IHNlcnZlci4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vbml0b3IjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vbml0b3IjZ2V0TGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJaWYgKGxhYmVsID09IG51bGwpCi0JCQlyZXR1cm4gIm4vYSI7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vbml0b3IjZ2V0RGVsZWdhdGUoKQotCSAqLwotCXB1YmxpYyBTZXJ2ZXJNb25pdG9yRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbGVnYXRlID0gKFNlcnZlck1vbml0b3JEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCksIHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBtb25pdG9yaW5nIHRoZSBnaXZlbiBwb3J0LCBhbmQgcmV0dXJuIHRoZSBwb3J0IG51bWJlciB0bwotCSAqIHR1bm5lbCByZXF1ZXN0cyB0aHJvdWdoLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcG9ydCBhIHBvcnQKLQkgKiBAcGFyYW0gbW9uaXRvclBvcnQgdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqIEByZXR1cm4gdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIGludCBzdGFydE1vbml0b3JpbmcoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCwgaW50IG1vbml0b3JQb3J0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5zdGFydE1vbml0b3Jpbmcoc2VydmVyLCBwb3J0LCBtb25pdG9yUG9ydCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXRocm93IGNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBwb3J0IGEgcG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BNb25pdG9yaW5nKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQpIHsKLQkJdHJ5IHsKLQkJCWdldERlbGVnYXRlKCkuc3RvcE1vbml0b3Jpbmcoc2VydmVyLCBwb3J0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9uaXRvclsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJNb25pdG9yRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3JEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2MzZDY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3JEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdG8gYSBUQ1AvSVAgbW9uaXRvci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlck1vbml0b3JEZWxlZ2F0ZSB7Ci0JLyoqCi0JICogU3RhcnQgbW9uaXRvcmluZyB0aGUgZ2l2ZW4gcG9ydCwgYW5kIHJldHVybiB0aGUgcG9ydCBudW1iZXIgdG8KLQkgKiB0dW5uZWwgcmVxdWVzdHMgdGhyb3VnaC4gVGhlIG1vbml0b3JQb3J0IGlzIHRoZSBuZXcgcG9ydCB0byB1c2UsIG9yCi0JICogLTEgdG8gcGljayBhIHJhbmRvbSBwb3J0LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcG9ydCBhIHBvcnQKLQkgKiBAcGFyYW0gbW9uaXRvclBvcnQgdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqIEByZXR1cm4gdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBzdGFydE1vbml0b3JpbmcoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCwgaW50IG1vbml0b3JQb3J0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFN0b3AgbW9uaXRvcmluZyB0aGUgZ2l2ZW4gcG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIHBvcnQgYSBwb3J0Ci0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcE1vbml0b3JpbmcoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTW9uaXRvck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDE3MDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTW9uaXRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlck1vbml0b3JNYW5hZ2VyIGltcGxlbWVudHMgSVNlcnZlck1vbml0b3JNYW5hZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OSVRPUl9EQVRBX0ZJTEUgPSAibW9uaXRvcnMueG1sIjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFNlcnZlck1vbml0b3JNYW5hZ2VyIGluc3RhbmNlOwotCi0JcHJvdGVjdGVkIExpc3Q8TW9uaXRvcmVkUG9ydD4gcG9ydHMgPSBuZXcgQXJyYXlMaXN0PE1vbml0b3JlZFBvcnQ+KCk7IAotCXByb3RlY3RlZCBTZXJ2ZXJNb25pdG9yIG1vbml0b3I7Ci0JCi0JY2xhc3MgTW9uaXRvcmVkUG9ydCBpbXBsZW1lbnRzIElNb25pdG9yZWRTZXJ2ZXJQb3J0IHsKLQkJcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCQlwcm90ZWN0ZWQgU2VydmVyUG9ydCBwb3J0OwotCQlwcm90ZWN0ZWQgaW50IG5ld1BvcnQgPSAtMTsKLQkJcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnRlbnQ7Ci0JCXB1YmxpYyBib29sZWFuIHN0YXJ0ZWQ7Ci0JCQotCQlwdWJsaWMgTW9uaXRvcmVkUG9ydChJU2VydmVyIHNlcnZlciwgU2VydmVyUG9ydCBwb3J0LCBpbnQgbmV3UG9ydCwgU3RyaW5nW10gY29udGVudCkgewotCQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCQl0aGlzLnBvcnQgPSBwb3J0OwotCQkJdGhpcy5uZXdQb3J0ID0gbmV3UG9ydDsKLQkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBNb25pdG9yZWRQb3J0KElNZW1lbnRvIG1lbWVudG8sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJbG9hZChtZW1lbnRvLCBtb25pdG9yKTsKLQkJfQotCQkKLQkJcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQkJcmV0dXJuIHNlcnZlcjsKLQkJfQotCQkKLQkJcHVibGljIFNlcnZlclBvcnQgZ2V0U2VydmVyUG9ydCgpIHsKLQkJCXJldHVybiBwb3J0OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldE1vbml0b3JQb3J0KCkgewotCQkJcmV0dXJuIG5ld1BvcnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE1vbml0b3JQb3J0KGludCBwKSB7Ci0JCQluZXdQb3J0ID0gcDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZ1tdIGdldENvbnRlbnRUeXBlcygpIHsKLQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCQlyZXR1cm4gY29udGVudDsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNTdGFydGVkKCkgewotCQkJcmV0dXJuIHN0YXJ0ZWQ7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFN0YXJ0ZWQoYm9vbGVhbiBzKSB7Ci0JCQlzdGFydGVkID0gczsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIE1vbml0b3JlZFBvcnQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCU1vbml0b3JlZFBvcnQgbXAgPSAoTW9uaXRvcmVkUG9ydCkgb2JqOwotCQkJaWYgKCFtcC5zZXJ2ZXIuZXF1YWxzKHNlcnZlcikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCFtcC5wb3J0LmVxdWFscyhwb3J0KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAobmV3UG9ydCAhPSBtcC5uZXdQb3J0KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChjb250ZW50ID09IG51bGwgJiYgbXAuY29udGVudCAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwgJiYgbXAuY29udGVudCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGNvbnRlbnQubGVuZ3RoOwotCQkJCWlmIChzaXplICE9IG1wLmNvbnRlbnQubGVuZ3RoKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCWlmICghY29udGVudFtpXS5lcXVhbHMobXAuY29udGVudFtpXSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2FuU2F2ZSgpIHsKLQkJCXJldHVybiAocG9ydC5nZXRJZCgpICE9IG51bGwpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJCW1lbWVudG8ucHV0U3RyaW5nKCJzZXJ2ZXJJZCIsIHNlcnZlci5nZXRJZCgpKTsKLQkJCWlmIChuZXdQb3J0ICE9IC0xKQotCQkJCW1lbWVudG8ucHV0U3RyaW5nKCJwb3J0IiwgbmV3UG9ydCArICIiKTsKLQkJCW1lbWVudG8ucHV0U3RyaW5nKCJwb3J0SWQiLCBwb3J0LmdldElkKCkpOwotCQkJbWVtZW50by5wdXRCb29sZWFuKCJzdGFydGVkIiwgc3RhcnRlZCk7Ci0JCQkKLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJaW50IHNpemUgPSBjb250ZW50Lmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlpZiAoaSA+IDApCi0JCQkJCQlzYi5hcHBlbmQoIiwiKTsKLQkJCQkJc2IuYXBwZW5kKGNvbnRlbnRbaV0pOwotCQkJCX0KLQkJCQltZW1lbnRvLnB1dFN0cmluZygiY29udGVudFR5cGVzIiwgc2IudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIGxvYWQoSU1lbWVudG8gbWVtZW50bywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMikgewotCQkJU3RyaW5nIHNlcnZlcklkID0gbWVtZW50by5nZXRTdHJpbmcoInNlcnZlcklkIik7Ci0JCQlzZXJ2ZXIgPSBudWxsOwotCQkJaWYgKHNlcnZlcklkICE9IG51bGwpCi0JCQkJc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKTsKLQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2VydmVyIGNvdWxkIG5vdCBiZSBmb3VuZDogIiArIHNlcnZlcklkICsgIiAiICsgc2VydmVyKTsKLQkJCVN0cmluZyBuZXdQb3J0U3RyID0gbWVtZW50by5nZXRTdHJpbmcoInBvcnQiKTsKLQkJCWlmIChuZXdQb3J0U3RyICE9IG51bGwgJiYgbmV3UG9ydFN0ci5sZW5ndGgoKSA+IDApCi0JCQkJbmV3UG9ydCA9IEludGVnZXIucGFyc2VJbnQobmV3UG9ydFN0cik7Ci0JCQlTdHJpbmcgcG9ydElkID0gbWVtZW50by5nZXRTdHJpbmcoInBvcnRJZCIpOwotCQkJCi0JCQlTZXJ2ZXJQb3J0W10gcG9ydHMyID0gc2VydmVyLmdldFNlcnZlclBvcnRzKG1vbml0b3IyKTsKLQkJCWlmIChwb3J0czIgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gcG9ydHMyLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgcG9ydCA9PSBudWxsICYmIGkgPCBzaXplOyBpKyspIHsKLQkJCQkJU2VydmVyUG9ydCBzcCA9IHBvcnRzMltpXTsKLQkJCQkJaWYgKHNwLmdldElkKCkgIT0gbnVsbCAmJiBzcC5nZXRJZCgpLmVxdWFscyhwb3J0SWQpKQotCQkJCQkJcG9ydCA9IHNwOwotCQkJCX0KLQkJCX0KLQkJCWlmIChwb3J0ID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCByZWxvY2F0ZSBwb3J0OiAiICsgc2VydmVySWQgKyAiICIgKyBzZXJ2ZXIgKyAiICIgKyBwb3J0SWQpOwotCQkJCi0JCQlTdHJpbmcgcyA9IG1lbWVudG8uZ2V0U3RyaW5nKCJjb250ZW50VHlwZXMiKTsKLQkJCWlmIChzICE9IG51bGwpCi0JCQkJY29udGVudCA9IFNlcnZlclBsdWdpbi50b2tlbml6ZShzLCAiLCIpOwotCQkJCi0JCQlCb29sZWFuIGIgPSBtZW1lbnRvLmdldEJvb2xlYW4oInN0YXJ0ZWQiKTsKLQkJCWlmIChiICE9IG51bGwgJiYgYi5ib29sZWFuVmFsdWUoKSkgewotCQkJCXRyeSB7Ci0JCQkJCW5ld1BvcnQgPSBtb25pdG9yLnN0YXJ0TW9uaXRvcmluZyhzZXJ2ZXIsIHBvcnQsIG5ld1BvcnQpOwotCQkJCQlzdGFydGVkID0gdHJ1ZTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCByZXN0YXJ0IHNlcnZlciBtb25pdG9yIiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFNlcnZlck1vbml0b3JNYW5hZ2VyKCkgewotCQlJU2VydmVyTW9uaXRvcltdIG1vbml0b3JzID0gU2VydmVyUGx1Z2luLmdldFNlcnZlck1vbml0b3JzKCk7Ci0JCWlmIChtb25pdG9ycyAhPSBudWxsICYmIG1vbml0b3JzLmxlbmd0aCA+IDApCi0JCQltb25pdG9yID0gKFNlcnZlck1vbml0b3IpIG1vbml0b3JzWzBdOwotCQkKLQkJaW5zdGFuY2UgPSB0aGlzOwotCQlsb2FkTW9uaXRvcnMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJNb25pdG9yTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQluZXcgU2VydmVyTW9uaXRvck1hbmFnZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnN0YW5jZS5zYXZlTW9uaXRvcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb25pdG9yIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQuCi0JICogIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc2VydmVyIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgSVNlcnZlck1vbml0b3IgZ2V0Q3VycmVudFNlcnZlck1vbml0b3IoKSB7Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIFN3aXRjaCB0byB1c2UgYSBkaWZmZXJlbnQgc2VydmVyIG1vbml0b3IuIEFsbCBleGlzdGluZyBtb25pdG9ycyB3aWxsIGJlCi0JICogcmVtb3ZlZCBmcm9tIHRoZSBjdXJyZW50IG1vbml0b3IgYW5kIGFkZGVkIHRvIHRoZSBuZXcgbW9uaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TW9uaXRvcgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJNb25pdG9yKElTZXJ2ZXJNb25pdG9yIG5ld01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCAiTm90IGltcGxlbWVudGVkIHlldCIsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHBvcnRzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBtb25pdG9yZWQuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIG1vbml0b3JlZCBzZXJ2ZXIgcG9ydHMKLQkgKi8KLQlwdWJsaWMgSU1vbml0b3JlZFNlcnZlclBvcnRbXSBnZXRNb25pdG9yZWRQb3J0cyhJU2VydmVyIHNlcnZlcikgewotCQlMaXN0PElNb25pdG9yZWRTZXJ2ZXJQb3J0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9uaXRvcmVkU2VydmVyUG9ydD4oKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwb3J0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNb25pdG9yZWRQb3J0IG1wID0gKE1vbml0b3JlZFBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChtcC5zZXJ2ZXIuZXF1YWxzKHNlcnZlcikpCi0JCQkJbGlzdC5hZGQobXApOwotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJTW9uaXRvcmVkU2VydmVyUG9ydFtsaXN0LnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyBtb25pdG9yaW5nIHRoZSBnaXZlbiBwb3J0LCBhbmQgcmV0dXJucyB0aGUgbmV3IHBvcnQgIyB0byB1c2UgdGhhdCB3aWxsCi0JICogcm91dGUgdG8gdGhlIG1vbml0b3JlZCBwb3J0LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcG9ydCBhIHBvcnQKLQkgKiBAcGFyYW0gbW9uaXRvclBvcnQgdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqIEBwYXJhbSBjb250ZW50IHRoZSBjb250ZW50Ci0JICogQHJldHVybiBhIG1vbml0b3JlZCBzZXJ2ZXIgcG9ydAotCSAqLwotCXB1YmxpYyBJTW9uaXRvcmVkU2VydmVyUG9ydCBjcmVhdGVNb25pdG9yKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQsIGludCBtb25pdG9yUG9ydCwgU3RyaW5nW10gY29udGVudCkgewotCQlpZiAocG9ydCA9PSBudWxsIHx8IG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJTW9uaXRvcmVkUG9ydCBtcCA9IG5ldyBNb25pdG9yZWRQb3J0KHNlcnZlciwgcG9ydCwgbW9uaXRvclBvcnQsIGNvbnRlbnQpOwotCQlwb3J0cy5hZGQobXApOwotCQlyZXR1cm4gbXA7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBtb25pdG9yaW5nIHRoZSBnaXZlbiBwb3J0LiBUaHJvd3MgYSBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0KLQkgKiBzdG9wcGluZyB0aGUgbW9uaXRvcmluZwotCSAqCi0JICogQHBhcmFtIHBvcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNb25pdG9yKElNb25pdG9yZWRTZXJ2ZXJQb3J0IHBvcnQpIHsKLQkJaWYgKHBvcnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJcG9ydHMucmVtb3ZlKHBvcnQpOwotCQkJaWYgKHBvcnQuaXNTdGFydGVkKCkpCi0JCQkJbW9uaXRvci5zdG9wTW9uaXRvcmluZyhwb3J0LmdldFNlcnZlcigpLCBwb3J0LmdldFNlcnZlclBvcnQoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgcmVtb3ZlIG1vbml0b3IiLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXJ0IHRoZSBtb25pdG9yLiBJZiB0aGUgbXNwIHBvcnQgaXMgLTEsIGl0IHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgcG9ydCB0aGF0IGlzIGFjdHVhbGx5IGluIHVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbXNwCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRNb25pdG9yKElNb25pdG9yZWRTZXJ2ZXJQb3J0IG1zcCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobXNwID09IG51bGwgfHwgbXNwLmlzU3RhcnRlZCgpKQotCQkJcmV0dXJuOwotCQkKLQkJTW9uaXRvcmVkUG9ydCBwb3J0ID0gKE1vbml0b3JlZFBvcnQpIG1zcDsKLQkJcG9ydC5zZXRNb25pdG9yUG9ydChtb25pdG9yLnN0YXJ0TW9uaXRvcmluZyhtc3AuZ2V0U2VydmVyKCksIG1zcC5nZXRTZXJ2ZXJQb3J0KCksIG1zcC5nZXRNb25pdG9yUG9ydCgpKSk7Ci0JCXBvcnQuc2V0U3RhcnRlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIG1vbml0b3JpbmcuCi0JICogCi0JICogQHBhcmFtIG1zcAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BNb25pdG9yKElNb25pdG9yZWRTZXJ2ZXJQb3J0IG1zcCkgewotCQlpZiAobXNwID09IG51bGwgfHwgIW1zcC5pc1N0YXJ0ZWQoKSkKLQkJCXJldHVybjsKLQkJTW9uaXRvcmVkUG9ydCBwb3J0ID0gKE1vbml0b3JlZFBvcnQpIG1zcDsKLQkJbW9uaXRvci5zdG9wTW9uaXRvcmluZyhtc3AuZ2V0U2VydmVyKCksIG1zcC5nZXRTZXJ2ZXJQb3J0KCkpOwotCQlwb3J0LnNldFN0YXJ0ZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcHBlZCBwb3J0IHRvIHVzZSB3aGVuIG1ha2luZyByZXF1ZXN0cyB0byB0aGUgZ2l2ZW4gc2VydmVyCi0JICogYW5kIHBvcnQgbnVtYmVyLiBSZXR1cm5zIHRoZSBleGlzdGluZyBwb3J0IG51bWJlciBpZiB0aGUgcG9ydCBpcyBub3QgYmVpbmcKLQkgKiBtb25pdG9yZWQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBwb3J0IGEgcG9ydCBudW1iZXIKLQkgKiBAcGFyYW0gY29udGVudCB0aGUgY29udGVudAotCSAqIEByZXR1cm4gdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9uaXRvcmVkUG9ydChJU2VydmVyIHNlcnZlciwgaW50IHBvcnQsIFN0cmluZyBjb250ZW50KSB7Ci0JCXRyeSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHBvcnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJTW9uaXRvcmVkUG9ydCBtcCA9IChNb25pdG9yZWRQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG1wLmlzU3RhcnRlZCgpICYmIG1wLnNlcnZlci5lcXVhbHMoc2VydmVyKSAmJiBtcC5wb3J0LmdldFBvcnQoKSA9PSBwb3J0KSB7Ci0JCQkJCVN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IG1wLmdldENvbnRlbnRUeXBlcygpOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWlmIChjb250ZW50ICE9IG51bGwgJiYgY29udGVudFR5cGVzICE9IG51bGwgJiYgY29udGVudFR5cGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCWludCBzaXplID0gY29udGVudFR5cGVzLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQkJCWlmIChjb250ZW50LmVxdWFscyhjb250ZW50VHlwZXNbaV0pKQotCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCX0gZWxzZQotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlpZiAoZm91bmQgJiYgbXAubmV3UG9ydCAhPSAtMSkKLQkJCQkJCXJldHVybiBtcC5uZXdQb3J0OwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBwb3J0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9uaXRvcnMoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoTU9OSVRPUl9EQVRBX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJtb25pdG9ycyIpOwotCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHBvcnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJTW9uaXRvcmVkUG9ydCBtcCA9IChNb25pdG9yZWRQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG1wLmNhblNhdmUoKSkgewotCQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoIm1vbml0b3IiKTsKLQkJCQkJbXAuc2F2ZShjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQltZW1lbnRvLnNhdmVUb0ZpbGUoZmlsZW5hbWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc2F2aW5nIG1vbml0b3IgaW5mbyIsIGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWRNb25pdG9ycygpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyBtb25pdG9yIGluZm8iKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChNT05JVE9SX0RBVEFfRklMRSkudG9PU1N0cmluZygpOwotCQkKLQkJdHJ5IHsKLQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGZpbGVuYW1lKTsKLQkJCQotCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oIm1vbml0b3IiKTsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCU1vbml0b3JlZFBvcnQgbXAgPSBuZXcgTW9uaXRvcmVkUG9ydChjaGlsZHJlbltpXSwgbnVsbCk7Ci0JCQkJCXBvcnRzLmFkZChtcCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIG1vbml0b3I6ICIgKyBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgbW9uaXRvciBpbmZvIiwgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOTJmNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTm90aWZpY2F0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckV2ZW50OwotLyoqCi0gKiBOb3RpZmljYXRpb24gbWFuYWdlciBmb3Igc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyTm90aWZpY2F0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBMaXN0PExpc3RlbmVyRW50cnk+IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdGVuZXJFbnRyeT4oKTsKLQotCS8qKgotCSAqIEZvciBtYXNraW5nIGV2ZW50IG9uIGFsbCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9FVkVOVFMgPSAweEZGRkY7Ci0KLQlwcml2YXRlIGNsYXNzIExpc3RlbmVyRW50cnkgewotCQlwcml2YXRlIElTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lcjsKLQkJcHJpdmF0ZSBpbnQgZXZlbnRNYXNrOwotCi0JCXByb3RlY3RlZCBMaXN0ZW5lckVudHJ5KElTZXJ2ZXJMaXN0ZW5lciBjdXJMaXN0ZW5lciwgaW50IGN1ckV2ZW50TWFzaykgewotCQkJbGlzdGVuZXIgPSBjdXJMaXN0ZW5lcjsKLQkJCWV2ZW50TWFzayA9IGN1ckV2ZW50TWFzazsKLQkJfQotCi0JCXByb3RlY3RlZCBJU2VydmVyTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbGlzdGVuZXI7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgaW50IGdldEV2ZW50TWFzaygpIHsKLQkJCXJldHVybiBldmVudE1hc2s7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbm90aWZpY2F0aW9uIG1hbmFnZXIuCi0JICovCi0JcHVibGljIFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVyIGZvciBhbGwgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBjdXJMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBjdXJMaXN0ZW5lcikgewotCQlhZGRMaXN0ZW5lcihjdXJMaXN0ZW5lciwgQUxMX0VWRU5UUyk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lciBmb3IgdGhlIGV2ZW50cyBzcGVjaWZpZWQgYnkgdGhlIG1hc2suCi0JICogCi0JICogQHBhcmFtIGN1ckxpc3RlbmVyCi0JICogQHBhcmFtIGV2ZW50TWFzawotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBjdXJMaXN0ZW5lciwgaW50IGV2ZW50TWFzaykgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gQWRkaW5nIHNlcnZlciBsaXN0ZW5lciB0byBub3RpZmljYXRpb24gbWFuYWdlcjogIiArIGN1ckxpc3RlbmVyICsgIiAiICsgZXZlbnRNYXNrICsgIiAtPi0iKTsKLQkJaWYgKGN1ckxpc3RlbmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxpc3QpIHsKLQkJCWxpc3RlbmVyTGlzdC5hZGQobmV3IExpc3RlbmVyRW50cnkoY3VyTGlzdGVuZXIsIGV2ZW50TWFzaykpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnJvYWRjYXN0Q2hhbmdlKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0+LSBCcm9hZGNhc3Rpbmcgc2VydmVyIGV2ZW50OiAiICsgZXZlbnQgKyAiIC0+LSIpOwotCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIiAgU2VydmVyIGV2ZW50IGtpbmQ6ICIgKyBldmVudEtpbmQgKyAiIC0+LSIpOwotCQkKLQkJLy8gb25seSBub3RpZnkgbGlzdGVuZXJzIHRoYXQgbGlzdGVuIHRvIG1vZHVsZSBldmVudAotCQlpbnQgc2l6ZTsKLQkJTGlzdGVuZXJFbnRyeVtdIGxpc3RlbmVyczsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxpc3QpIHsKLQkJCXNpemUgPSBsaXN0ZW5lckxpc3Quc2l6ZSgpOwotCQkJbGlzdGVuZXJzID0gbGlzdGVuZXJMaXN0LnRvQXJyYXkobmV3IExpc3RlbmVyRW50cnlbc2l6ZV0pOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlMaXN0ZW5lckVudHJ5IGN1ckVudHJ5ID0gbGlzdGVuZXJzW2ldOwotCQkJaW50IG1hc2sgPSBjdXJFbnRyeS5nZXRFdmVudE1hc2soKTsKLQkJCQotCQkJLy8gY2hlY2sgaWYgdGhlIHR5cGUgb2YgdGhlIGV2ZW50IG1hdGNoZXMgdGhlIG1hc2ssIGUuZy4gc2VydmVyIG9yIG1vZHVsZSBjaGFuZ2UKLQkJCWJvb2xlYW4gaXNUeXBlTWF0Y2ggPSAoKG1hc2sgJiBldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFKSAhPSAwKSAKLQkJCQkJfHwgKChtYXNrICYgZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuTU9EVUxFX0NIQU5HRSkgIT0gMCk7Ci0JCQkvLyBjaGVjayB0aGUga2luZCBvZiBjaGFuZ2UKLQkJCWJvb2xlYW4gaXNLaW5kTWF0Y2ggPSAobWFzayAmIGV2ZW50S2luZCBeIFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgXiBTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFKSAhPSAwOwotCQkJCi0JCQlpZiAoaXNUeXBlTWF0Y2ggJiYgaXNLaW5kTWF0Y2gpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gRmlyaW5nIHNlcnZlciBldmVudCB0byBsaXN0ZW5lcjogIiArIGN1ckVudHJ5LmdldExpc3RlbmVyKCkgKyAiIC0+LSIpOwotCQkJCXRyeSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIiAgRmlyaW5nIHNlcnZlciBldmVudCB0byBsaXN0ZW5lcjogIiArIGN1ckVudHJ5LmdldExpc3RlbmVyKCkpOwotCQkJCQljdXJFbnRyeS5nZXRMaXN0ZW5lcigpLnNlcnZlckNoYW5nZWQoZXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgRXJyb3IgZmlyaW5nIHNlcnZlciBldmVudDogIiArIGN1ckVudHJ5LmdldExpc3RlbmVyKCksIGUpOwotCQkJCX0KLQkJCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICItPC0gRG9uZSBmaXJpbmcgc2VydmVyIGV2ZW50IC08LSIpOwotCQkJfQotCQl9Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi08LSBEb25lIGJyb2FkY2FzdGluZyBzZXJ2ZXIgZXZlbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBsaXN0ZW5lciBsaXN0IGlzIGVtcHR5LCBvciBmYWxzZSBvdGhlcndpc2UuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBsaXN0ZW5lciBsaXN0IGlzIGVtcHR5LCBvciBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIGxpc3RlbmVyTGlzdC5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgZnJvbSBub3RpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIGN1ckxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVNlcnZlckxpc3RlbmVyIGN1ckxpc3RlbmVyKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0+LSBSZW1vdmluZyBzZXJ2ZXIgbGlzdGVuZXIgZnJvbSBub3RpZmljYXRpb24gbWFuYWdlcjogIiArIGN1ckxpc3RlbmVyICsgIiAtPi0iKTsKLQkJaWYgKGN1ckxpc3RlbmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTGlzdCkgewotCQkJTGlzdGVuZXJFbnRyeSBtYXRjaGVkTGlzdGVuZXJFbnRyeSA9IG51bGw7Ci0JCQlJdGVyYXRvciBsaXN0ZW5lckl0ZXIgPSBsaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChtYXRjaGVkTGlzdGVuZXJFbnRyeSA9PSBudWxsICYmIGxpc3RlbmVySXRlci5oYXNOZXh0KCkpIHsKLQkJCQlMaXN0ZW5lckVudHJ5IGN1ckVudHJ5ID0gKExpc3RlbmVyRW50cnkpbGlzdGVuZXJJdGVyLm5leHQoKTsKLQkJCQlpZiAoY3VyTGlzdGVuZXIuZXF1YWxzKGN1ckVudHJ5LmdldExpc3RlbmVyKCkpKSB7Ci0JCQkJCW1hdGNoZWRMaXN0ZW5lckVudHJ5ID0gY3VyRW50cnk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1hdGNoZWRMaXN0ZW5lckVudHJ5ICE9IG51bGwpCi0JCQkJbGlzdGVuZXJMaXN0LnJlbW92ZShtYXRjaGVkTGlzdGVuZXJFbnRyeSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlNjM4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFdmVudDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlTGlzdGVuZXI7Ci0vKioKLSAqIFRoZSBtYWluIHNlcnZlciBwbHVnaW4gY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUFJFRl9GSUxFID0gIi5zZXJ2ZXJQcmVmZXJlbmNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX1NFUlZFUl9BREFQVEVSUyA9ICJleGNsdWRlU2VydmVyQWRhcHRlcnMiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIVVRET1dOX0pPQl9GQU1JTFkgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmZhbWlseSI7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdJU1RSWV9KT0JfRkFNSUxZID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucmVnaXN0cnkuZmFtaWx5IjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZShEYXRlRm9ybWF0LlNIT1JULCBEYXRlRm9ybWF0LlNIT1JUKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBudW0gPSAwOwotCi0JLy8gY2FjaGVkIGNvcHkgb2YgYWxsIGxhdW5jaGFibGUgYWRhcHRlcnMKLQlwcml2YXRlIHN0YXRpYyBMaXN0PExhdW5jaGFibGVBZGFwdGVyPiBsYXVuY2hhYmxlQWRhcHRlcnM7Ci0KLQkvLyBjYWNoZWQgY29weSBvZiBhbGwgbGF1bmNoYWJsZSBjbGllbnRzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxJQ2xpZW50PiBjbGllbnRzOwotCi0JLy8gY2FjaGVkIGNvcHkgb2YgYWxsIG1vZHVsZSBmYWN0b3JpZXMKLQlwcml2YXRlIHN0YXRpYyBMaXN0PE1vZHVsZUZhY3Rvcnk+IG1vZHVsZUZhY3RvcmllczsKLQotCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmVyUGx1Z2luIHNpbmdsZXRvbjsKLQotCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBwdWJsaXNoIHRhc2tzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxJUHVibGlzaFRhc2s+IHB1Ymxpc2hUYXNrczsKLQotCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBwdWJsaXNoZXJzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxQdWJsaXNoZXI+IHB1Ymxpc2hlcnM7Ci0KLQkvLwljYWNoZWQgY29weSBvZiBhbGwgc2VydmVyIG1vbml0b3JzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxJU2VydmVyTW9uaXRvcj4gbW9uaXRvcnM7Ci0KLQkvLwljYWNoZWQgY29weSBvZiBhbGwgcnVudGltZSBsb2NhdG9ycwotCXByaXZhdGUgc3RhdGljIExpc3Q8SVJ1bnRpbWVMb2NhdG9yPiBydW50aW1lTG9jYXRvcnM7Ci0KLQkvLyBjYWNoZWQgY29weSBvZiBhbGwgbW9kdWxlIGFydGlmYWN0IGFkYXB0ZXJzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxNb2R1bGVBcnRpZmFjdEFkYXB0ZXI+IG1vZHVsZUFydGlmYWN0QWRhcHRlcnM7Ci0KLQkvLwljYWNoZWQgY29weSBvZiBhbGwgaW5zdGFsbGFibGUgc2VydmVycwotCXByaXZhdGUgc3RhdGljIExpc3Q8SUluc3RhbGxhYmxlU2VydmVyPiBpbnN0YWxsYWJsZVNlcnZlcnM7Ci0KLQkvLwljYWNoZWQgY29weSBvZiBhbGwgaW5zdGFsbGFibGUgcnVudGltZXMKLQlwcml2YXRlIHN0YXRpYyBMaXN0PElJbnN0YWxsYWJsZVJ1bnRpbWU+IGluc3RhbGxhYmxlUnVudGltZXM7Ci0KLQkvLyByZWdpc3RyeSBsaXN0ZW5lcgotCXByaXZhdGUgc3RhdGljIElSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIHJlZ2lzdHJ5TGlzdGVuZXI7Ci0JCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQ7Ci0KLQkvLyBidW5kbGUgbGlzdGVuZXIKLQlwcml2YXRlIEJ1bmRsZUxpc3RlbmVyIGJ1bmRsZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBfREFUQV9GSUxFID0gInRtcC1kYXRhLnhtbCI7Ci0KLQljbGFzcyBUZW1wRGlyIHsKLQkJU3RyaW5nIHBhdGg7Ci0JCWludCBhZ2U7Ci0JfQotCi0JLy8gdGVtcCBkaXJlY3RvcmllcyAtIFN0cmluZyBrZXkgdG8gVGVtcERpcgotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBUZW1wRGlyPiB0ZW1wRGlySGFzaDsKLQotCS8qKgotCSAqIHNlcnZlciBjb3JlIHBsdWdpbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBTZXJ2ZXJQbHVnaW4uCi0JICovCi0JcHVibGljIFNlcnZlclBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJc2luZ2xldG9uID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5wbHVnaW4uU2VydmVyUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB0aGUgcmVxdWVzdG9yIGNhbiB1c2UKLQkgKiB0aHJvdWdob3V0IGl0J3MgbGlmZWN5Y2xlLiBUaGlzIGlzIHByaW1hcnkgdG8gYmUgdXNlZCBieQotCSAqIHNlcnZlciBpbnN0YW5jZXMgZm9yIHdvcmtpbmcgZGlyZWN0b3JpZXMsIGluc3RhbmNlIHNwZWNpZmljCi0JICogZmlsZXMsIGV0Yy4KLQkgKgotCSAqIDxwPkFzIGxvbmcgYXMgdGhlIHNhbWUga2V5IGlzIHVzZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBvbgotCSAqIGVhY2ggdXNlIG9mIHRoZSB3b3JrYmVuY2gsIHRoaXMgbWV0aG9kIGRpcmVjdG9yeSB3aWxsIHJldHVybgotCSAqIHRoZSBzYW1lIGRpcmVjdG9yeS4gSWYgdGhlIGRpcmVjdG9yeSBpcyBub3QgcmVxdWVzdGVkIG92ZXIgYQotCSAqIHBlcmlvZCBvZiB0aW1lLCB0aGUgZGlyZWN0b3J5IG1heSBiZSBkZWxldGVkIGFuZCBhIG5ldyBvbmUKLQkgKiB3aWxsIGJlIGFzc2lnbmVkIG9uIHRoZSBuZXh0IHJlcXVlc3QuIEZvciB0aGlzIHJlYXNvbiwgYQotCSAqIHNlcnZlciBpbnN0YW5jZSBzaG91bGQgcmVxdWVzdCB0aGUgdGVtcCBkaXJlY3Rvcnkgb24gc3RhcnR1cAotCSAqIGlmIGl0IHdhbnRzIHRvIHN0b3JlIGZpbGVzIHRoZXJlLiBJbiBhbGwgY2FzZXMsIHRoZSBpbnN0YW5jZQotCSAqIHNob3VsZCBoYXZlIGEgYmFja3VwIHBsYW4gYW55d2F5LCBhcyB0aGlzIGRpcmVjdG9yeSBtYXkgYmUKLQkgKiBkZWxldGVkIGFjY2lkZW50YWxseS48L3A+Ci0JICoKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybiBqYXZhLmlvLkZpbGUKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0VGVtcERpcmVjdG9yeShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQotCQkvLyBmaXJzdCwgbG9vayB0aHJvdWdoIGhhc2ggb2YgY3VycmVudCBkaXJlY3RvcmllcwotCQlJUGF0aCBzdGF0ZVBhdGggPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlUZW1wRGlyIGRpciA9IHRlbXBEaXJIYXNoLmdldChrZXkpOwotCQkJaWYgKGRpciAhPSBudWxsKSB7Ci0JCQkJZGlyLmFnZSA9IDA7Ci0JCQkJcmV0dXJuIHN0YXRlUGF0aC5hcHBlbmQoZGlyLnBhdGgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkKLQkJLy8gb3RoZXJ3aXNlLCBjcmVhdGUgYSBuZXcgZGlyZWN0b3J5Ci0JCi0JCS8vIGZpbmQgZmlyc3QgZnJlZSBkaXJlY3RvcnkKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQlGaWxlIGRpciA9IG51bGw7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXdoaWxlIChkaXIgPT0gbnVsbCB8fCBkaXIuZXhpc3RzKCkpIHsKLQkJCXBhdGggPSAidG1wIiArIGNvdW50OwotCQkJZGlyID0gc3RhdGVQYXRoLmFwcGVuZChwYXRoKS50b0ZpbGUoKTsKLQkJCWNvdW50ICsrOwotCQl9Ci0JCi0JCWRpci5ta2RpcnMoKTsKLQkKLQkJVGVtcERpciBkID0gbmV3IFRlbXBEaXIoKTsKLQkJZC5wYXRoID0gcGF0aDsKLQkJdGVtcERpckhhc2gucHV0KGtleSwgZCk7Ci0JCXNhdmVUZW1wRGlySW5mbygpOwotCQlyZXR1cm4gc3RhdGVQYXRoLmFwcGVuZChwYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGEgdGVtcCBkaXJlY3RvcnkuCi0JICogQHBhcmFtIGtleQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVRlbXBEaXJlY3RvcnkoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlJUGF0aCBzdGF0ZVBhdGggPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlUZW1wRGlyIGRpciA9IHRlbXBEaXJIYXNoLmdldChrZXkpOwotCQkJaWYgKGRpciAhPSBudWxsKSB7Ci0JCQkJdGVtcERpckhhc2gucmVtb3ZlKGtleSk7Ci0JCQkJc2F2ZVRlbXBEaXJJbmZvKCk7Ci0JCQkJZGVsZXRlRGlyZWN0b3J5KHN0YXRlUGF0aC5hcHBlbmQoZGlyLnBhdGgpLnRvRmlsZSgpLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgcmVtb3ZlIHRlbXAgZGlyZWN0b3J5IiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkVGVtcERpckluZm8oKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbmZvcm1hdGlvbiIpOwotCQlJUGF0aCBzdGF0ZVBhdGggPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IHN0YXRlUGF0aC5hcHBlbmQoVEVNUF9EQVRBX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkJCi0JCXRlbXBEaXJIYXNoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUZW1wRGlyPigpOwotCQl0cnkgewotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oZmlsZW5hbWUpOwotCQkJCi0JCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigidGVtcC1kaXJlY3RvcnkiKTsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTdHJpbmcga2V5ID0gY2hpbGRyZW5baV0uZ2V0U3RyaW5nKCJrZXkiKTsKLQkJCQkKLQkJCQlUZW1wRGlyIGQgPSBuZXcgVGVtcERpcigpOwotCQkJCWQucGF0aCA9IGNoaWxkcmVuW2ldLmdldFN0cmluZygicGF0aCIpOwotCQkJCWQuYWdlID0gY2hpbGRyZW5baV0uZ2V0SW50ZWdlcigiYWdlIikuaW50VmFsdWUoKTsKLQkJCQlkLmFnZSsrOwotCQkJCQotCQkJCXRlbXBEaXJIYXNoLnB1dChrZXksIGQpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW5mb3JtYXRpb24iLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgbG9nZ2luZy4KLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZVRlbXBEaXJJbmZvKCkgewotCQkvLyBzYXZlIHJlbWFpbmluZyBkaXJlY3RvcmllcwotCQlJUGF0aCBzdGF0ZVBhdGggPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IHN0YXRlUGF0aC5hcHBlbmQoVEVNUF9EQVRBX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJ0ZW1wLWRpcmVjdG9yaWVzIik7Ci0JCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHRlbXBEaXJIYXNoLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlUZW1wRGlyIGQgPSB0ZW1wRGlySGFzaC5nZXQoa2V5KTsKLQkKLQkJCQlpZiAoZC5hZ2UgPCA1KSB7Ci0JCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgidGVtcC1kaXJlY3RvcnkiKTsKLQkJCQkJY2hpbGQucHV0U3RyaW5nKCJrZXkiLCBrZXkpOwotCQkJCQljaGlsZC5wdXRTdHJpbmcoInBhdGgiLCBkLnBhdGgpOwotCQkJCQljaGlsZC5wdXRJbnRlZ2VyKCJhZ2UiLCBkLmFnZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWRlbGV0ZURpcmVjdG9yeShzdGF0ZVBhdGguYXBwZW5kKGQucGF0aCkudG9GaWxlKCksIG51bGwpOwotCQkJfQotCQotCQkJbWVtZW50by5zYXZlVG9GaWxlKGZpbGVuYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW5mb3JtYXRpb24iLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0tLS0tPi0tLS0tIFNlcnZlciBDb3JlIHBsdWdpbiBzdGFydHVwIC0tLS0tPi0tLS0tIik7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlidW5kbGVDb250ZXh0ID0gY29udGV4dDsKLQkJCi0JCVNlcnZlclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCkuc2V0RGVmYXVsdHMoKTsKLQotCQkvLyBsb2FkIHRlbXAgZGlyZWN0b3J5IGluZm9ybWF0aW9uCi0JCWxvYWRUZW1wRGlySW5mbygpOwotCQkKLQkJYnVuZGxlTGlzdGVuZXIgPSBuZXcgQnVuZGxlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBidW5kbGVDaGFuZ2VkKEJ1bmRsZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIGJ1bmRsZUlkID0gZXZlbnQuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCQkJLy9UcmFjZS50cmFjZShUcmFjZS5JTkZPLCBldmVudC5nZXRUeXBlKCkgKyAiICIgKyBidW5kbGVJZCk7Ci0JCQkJaWYgKEJ1bmRsZUV2ZW50LlNUT1BQRUQgPT0gZXZlbnQuZ2V0VHlwZSgpICYmIFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzQWN0aXZlQnVuZGxlKGJ1bmRsZUlkKSkKLQkJCQkJc3RvcEJ1bmRsZShidW5kbGVJZCk7Ci0JCQl9Ci0JCX07Ci0JCWNvbnRleHQuYWRkQnVuZGxlTGlzdGVuZXIoYnVuZGxlTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3BCdW5kbGUoZmluYWwgU3RyaW5nIGJ1bmRsZUlkKSB7Ci0JCWNsYXNzIFN0b3BKb2IgZXh0ZW5kcyBKb2IgewotCQkJcHVibGljIFN0b3BKb2IoKSB7Ci0JCQkJc3VwZXIoIkRpc3Bvc2luZyBzZXJ2ZXJzIik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJcmV0dXJuIFNIVVRET1dOX0pPQl9GQU1JTFkuZXF1YWxzKGZhbWlseSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IyKSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2h1dGRvd25CdW5kbGUoYnVuZGxlSWQpOwotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9Ci0JCQotCQl0cnkgewotCQkJU3RvcEpvYiBqb2IgPSBuZXcgU3RvcEpvYigpOwotCQkJam9iLnNldFVzZXIoZmFsc2UpOwotCQkJam9iLnNjaGVkdWxlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkvLyBpZ25vcmUgZXJyb3JzCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLS0tLS08LS0tLS0gU2VydmVyIENvcmUgcGx1Z2luIHNodXRkb3duIC0tLS0tPC0tLS0tIik7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCQotCQlpZiAocmVnaXN0cnlMaXN0ZW5lciAhPSBudWxsKQotCQkJUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5yZW1vdmVSZWdpc3RyeUNoYW5nZUxpc3RlbmVyKHJlZ2lzdHJ5TGlzdGVuZXIpOwotCQkKLQkJUmVzb3VyY2VNYW5hZ2VyLnNodXRkb3duKCk7Ci0JCVNlcnZlck1vbml0b3JNYW5hZ2VyLnNodXRkb3duKCk7Ci0JCQotCQl0cnkgewotCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFNIVVRET1dOX0pPQl9GQU1JTFksIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIHdhaXRpbmcgZm9yIHNodXRkb3duIGpvYiIsIGUpOwotCQl9Ci0JCWNvbnRleHQucmVtb3ZlQnVuZGxlTGlzdGVuZXIoYnVuZGxlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQWxsKExpc3Q8T2JqZWN0PiBsaXN0LCBPYmplY3RbXSBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJbGlzdC5hZGQob2JqW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhIHNlcnZlciBvciBydW50aW1lIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnQgYW4gb2JqZWN0Ci0JICogQHBhcmFtIG5hbWUgYSBuYW1lCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbmFtZSBpcyBpbiB1c2UsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOYW1lSW5Vc2UoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZSkKLQkJCWFkZEFsbChsaXN0LCBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyQXR0cmlidXRlcykKLQkJCWFkZEFsbChsaXN0LCBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKSk7Ci0JCQotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lV29ya2luZ0NvcHkpCi0JCQkJZWxlbWVudCA9ICgoSVJ1bnRpbWVXb3JraW5nQ29weSkgZWxlbWVudCkuZ2V0T3JpZ2luYWwoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcldvcmtpbmdDb3B5KQotCQkJCWVsZW1lbnQgPSAoKElTZXJ2ZXJXb3JraW5nQ29weSkgZWxlbWVudCkuZ2V0T3JpZ2luYWwoKTsKLQkJCWlmIChsaXN0LmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJCWxpc3QucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyQXR0cmlidXRlcyAmJiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoKChJU2VydmVyQXR0cmlidXRlcylvYmopLmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVJ1bnRpbWUgJiYgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCgoSVJ1bnRpbWUpb2JqKS5nZXROYW1lKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gdG9rZW5pemUgYSBzdHJpbmcgaW50byBhbiBhcnJheS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyIGEgc3RyaW5nIHRvIGJlIHBhcnNlZAotCSAqIEBwYXJhbSBkZWxpbSB0aGUgZGVsaW1pdGVycwotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdG9rZW5pemVkIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdG9rZW5pemUoU3RyaW5nIHN0ciwgU3RyaW5nIGRlbGltKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQkKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCBkZWxpbSk7Ci0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBzID0gc3QubmV4dFRva2VuKCk7Ci0JCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQotCQkJCWxpc3QuYWRkKHMudHJpbSgpKTsKLQkJfQotCQkKLQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocyk7Ci0JCXJldHVybiBzOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU+IGdldE1vZHVsZVR5cGVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0JCUxpc3Q8SU1vZHVsZVR5cGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGVUeXBlPigpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkKLQkJCXJldHVybiBsaXN0OwotCQkKLQkJaW50IHNpemUgPSBlbGVtZW50cy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlTdHJpbmdbXSB0eXBlcyA9IHRva2VuaXplKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgidHlwZXMiKSwgIiwiKTsKLQkJCVN0cmluZ1tdIHZlcnNpb25zID0gdG9rZW5pemUoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJ2ZXJzaW9ucyIpLCAiLCIpOwotCQkJaW50IHNpemVUID0gdHlwZXMubGVuZ3RoOwotCQkJaW50IHNpemVWID0gdmVyc2lvbnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplVDsgaisrKSB7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBzaXplVjsgaysrKQotCQkJCQlsaXN0LmFkZChNb2R1bGVUeXBlLmdldE1vZHVsZVR5cGUodHlwZXNbal0sIHZlcnNpb25zW2tdKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJyYXkgb2Ygc3RyaW5ncyBjb250YWlucyBhIHNwZWNpZmljCi0JICogc3RyaW5nLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBpZHMgYW4gYXJyYXkgb2Ygc3RyaW5ncywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gaWQgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5zIGEgc3BlY2lmaWMKLQkgKiAgICBzdHJpbmcsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nW10gaWRzLCBTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoaWRzID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWludCBzaXplID0gaWRzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChpZHNbaV0uZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBpZHNbaV0ubGVuZ3RoKCkgJiYgaWQuc3RhcnRzV2l0aChpZHNbaV0uc3Vic3RyaW5nKDAsIGlkc1tpXS5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhpZHNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZWN1cnNpdmVseSBkZWxldGUgYSBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gZGlyIGEgZm9sZGVyCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyByZXF1aXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKCFkaXIuZXhpc3RzKCkgfHwgIWRpci5pc0RpcmVjdG9yeSgpKQotCQkJCXJldHVybjsKLQkKLQkJCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLQkJCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRpbmdUYXNrLCBuZXcgU3RyaW5nW10ge2Rpci5nZXRBYnNvbHV0ZVBhdGgoKX0pLCBzaXplICogMTApOwotCQotCQkJLy8gY3ljbGUgdGhyb3VnaCBmaWxlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlGaWxlIGN1cnJlbnQgPSBmaWxlc1tpXTsKLQkJCQlpZiAoY3VycmVudC5pc0ZpbGUoKSkgewotCQkJCQljdXJyZW50LmRlbGV0ZSgpOwotCQkJCQltb25pdG9yLndvcmtlZCgxMCk7Ci0JCQkJfSBlbHNlIGlmIChjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldEFic29sdXRlUGF0aCgpfSkpOwotCQkJCQlkZWxldGVEaXJlY3RvcnkoY3VycmVudCwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTApKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkaXIuZGVsZXRlKCk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGRlbGV0aW5nIGRpcmVjdG9yeSAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpLCBlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBsYXVuY2hhYmxlIGFkYXB0ZXJzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBsYXVuY2hhYmxlIGFkYXB0ZXJzIHtAbGluayBJTGF1bmNoYWJsZUFkYXB0ZXJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJTGF1bmNoYWJsZUFkYXB0ZXJbXSBnZXRMYXVuY2hhYmxlQWRhcHRlcnMoKSB7Ci0JCWlmIChsYXVuY2hhYmxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCWxvYWRMYXVuY2hhYmxlQWRhcHRlcnMoKTsKLQkJSUxhdW5jaGFibGVBZGFwdGVyW10gbGEgPSBuZXcgSUxhdW5jaGFibGVBZGFwdGVyW2xhdW5jaGFibGVBZGFwdGVycy5zaXplKCldOwotCQlsYXVuY2hhYmxlQWRhcHRlcnMudG9BcnJheShsYSk7Ci0JCXJldHVybiBsYTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBjbGllbnQgaW5zdGFuY2VzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBjbGllbnQgaW5zdGFuY2VzIHtAbGluayBJQ2xpZW50fQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNsaWVudFtdIGdldENsaWVudHMoKSB7Ci0JCWlmIChjbGllbnRzID09IG51bGwpCi0JCQlsb2FkQ2xpZW50cygpOwotCQlJQ2xpZW50W10gYyA9IG5ldyBJQ2xpZW50W2NsaWVudHMuc2l6ZSgpXTsKLQkJY2xpZW50cy50b0FycmF5KGMpOwotCQlyZXR1cm4gYzsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCB0aGUgbGF1bmNoYWJsZSBhZGFwdGVycyBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZExhdW5jaGFibGVBZGFwdGVycygpIHsKLQkJaWYgKGxhdW5jaGFibGVBZGFwdGVycyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAubGF1bmNoYWJsZUFkYXB0ZXJzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgImxhdW5jaGFibGVBZGFwdGVycyIpOwotCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlMaXN0PExhdW5jaGFibGVBZGFwdGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMYXVuY2hhYmxlQWRhcHRlcj4oc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBMYXVuY2hhYmxlQWRhcHRlcihjZltpXSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIGxhdW5jaGFibGVBZGFwdGVyOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBsYXVuY2hhYmxlQWRhcHRlcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHNvcnQgYnkgcHJpb3JpdHkgdG8gcHV0IGhpZ2hlciBudW1iZXJzIGZpcnN0Ci0JCXNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplLTE7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IGkrMTsgaiA8IHNpemU7IGorKykgewotCQkJCUxhdW5jaGFibGVBZGFwdGVyIGEgPSBsaXN0LmdldChpKTsKLQkJCQlMYXVuY2hhYmxlQWRhcHRlciBiID0gbGlzdC5nZXQoaik7Ci0JCQkJaWYgKGEuZ2V0UHJpb3JpdHkoKSA8IGIuZ2V0UHJpb3JpdHkoKSkgewotCQkJCQlsaXN0LnNldChpLCBiKTsKLQkJCQkJbGlzdC5zZXQoaiwgYSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxhdW5jaGFibGVBZGFwdGVycyA9IGxpc3Q7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi08LSBEb25lIGxvYWRpbmcgLmxhdW5jaGFibGVBZGFwdGVycyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgY2xpZW50IGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkQ2xpZW50cygpIHsKLQkJaWYgKGNsaWVudHMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLmNsaWVudHMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiY2xpZW50cyIpOwotCQkKLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3Q8SUNsaWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUNsaWVudD4oc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBDbGllbnQoY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBjbGllbnRzOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBjbGllbnRzOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gc29ydCBieSBwcmlvcml0eSB0byBwdXQgaGlnaGVyIG51bWJlcnMgZmlyc3QKLQkJc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUtMTsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gaSsxOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkJQ2xpZW50IGEgPSAoQ2xpZW50KSBsaXN0LmdldChpKTsKLQkJCQlDbGllbnQgYiA9IChDbGllbnQpIGxpc3QuZ2V0KGopOwotCQkJCWlmIChhLmdldFByaW9yaXR5KCkgPCBiLmdldFByaW9yaXR5KCkpIHsKLQkJCQkJbGlzdC5zZXQoaSwgYik7Ci0JCQkJCWxpc3Quc2V0KGosIGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljbGllbnRzID0gbGlzdDsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi08LSBEb25lIGxvYWRpbmcgLmNsaWVudHMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHB1Ymxpc2ggdGFza3MuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHB1Ymxpc2ggdGFza3MgaW5zdGFuY2VzIHtAbGluayBJUHVibGlzaFRhc2t9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHVibGlzaFRhc2tbXSBnZXRQdWJsaXNoVGFza3MoKSB7Ci0JCWlmIChwdWJsaXNoVGFza3MgPT0gbnVsbCkKLQkJCWxvYWRQdWJsaXNoVGFza3MoKTsKLQkJSVB1Ymxpc2hUYXNrW10gc3QgPSBuZXcgSVB1Ymxpc2hUYXNrW3B1Ymxpc2hUYXNrcy5zaXplKCldOwotCQlwdWJsaXNoVGFza3MudG9BcnJheShzdCk7Ci0JCXJldHVybiBzdDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBwdWJsaXNoIHRhc2sgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRQdWJsaXNoVGFza3MoKSB7Ci0JCWlmIChwdWJsaXNoVGFza3MgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLnB1Ymxpc2hUYXNrcyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJwdWJsaXNoVGFza3MiKTsKLQkJCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlMaXN0PElQdWJsaXNoVGFzaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVB1Ymxpc2hUYXNrPihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IFB1Ymxpc2hUYXNrKGNmW2ldKSk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiICBMb2FkZWQgcHVibGlzaFRhc2s6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHB1Ymxpc2hUYXNrOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCQlwdWJsaXNoVGFza3MgPSBsaXN0OwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLTwtIERvbmUgbG9hZGluZyAucHVibGlzaFRhc2tzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBwdWJsaXNoZXJzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBwdWJsaXNoZXIgaW5zdGFuY2VzIHtAbGluayBQdWJsaXNoZXJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBQdWJsaXNoZXJbXSBnZXRQdWJsaXNoZXJzKCkgewotCQlpZiAocHVibGlzaGVycyA9PSBudWxsKQotCQkJbG9hZFB1Ymxpc2hlcnMoKTsKLQkJUHVibGlzaGVyW10gcHViID0gbmV3IFB1Ymxpc2hlcltwdWJsaXNoZXJzLnNpemUoKV07Ci0JCXB1Ymxpc2hlcnMudG9BcnJheShwdWIpOwotCQlyZXR1cm4gcHViOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2hlciB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgotCSAqIHB1Ymxpc2hlciAoe0BsaW5rICNnZXRQdWJsaXNoZXJzKCl9KSBmb3IgdGhlIG9uZSBhIG1hdGNoaW5nCi0JICogcHVibGlzaGVyIGlkICh7QGxpbmsgUHVibGlzaGVyI2dldElkKCl9KS4gVGhlIGlkIG1heSBub3QgYmUgbnVsbC4KLQkgKgotCSAqIEBwYXJhbSBpZCB0aGUgcHVibGlzaGVyIGlkCi0JICogQHJldHVybiB0aGUgcHVibGlzaGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBwdWJsaXNoZXJzCi0JICogICAgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFB1Ymxpc2hlciBmaW5kUHVibGlzaGVyKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCWlmIChwdWJsaXNoZXJzID09IG51bGwpCi0JCQlsb2FkUHVibGlzaGVycygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwdWJsaXNoZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVB1Ymxpc2hlciBwdWIgPSAoUHVibGlzaGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKHB1Yi5nZXRJZCgpKSkKLQkJCQlyZXR1cm4gcHViOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHB1Ymxpc2hlciBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZFB1Ymxpc2hlcnMoKSB7Ci0JCWlmIChwdWJsaXNoZXJzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5wdWJsaXNoZXJzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgInB1Ymxpc2hlcnMiKTsKLQkJCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlMaXN0PFB1Ymxpc2hlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UHVibGlzaGVyPihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IFB1Ymxpc2hlcihjZltpXSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIHB1Ymxpc2hlcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgcHVibGlzaGVyOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCQlwdWJsaXNoZXJzID0gbGlzdDsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi08LSBEb25lIGxvYWRpbmcgLnB1Ymxpc2hlcnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIG1vZHVsZSBtb2R1bGUgZmFjdG9yaWVzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIG1vZHVsZSBmYWN0b3JpZXMge0BsaW5rIE1vZHVsZUZhY3Rvcnl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVGYWN0b3J5W10gZ2V0TW9kdWxlRmFjdG9yaWVzKCkgewotCQlpZiAobW9kdWxlRmFjdG9yaWVzID09IG51bGwpCi0JCQlsb2FkTW9kdWxlRmFjdG9yaWVzKCk7Ci0JCQotCQlNb2R1bGVGYWN0b3J5W10gbWYgPSBuZXcgTW9kdWxlRmFjdG9yeVttb2R1bGVGYWN0b3JpZXMuc2l6ZSgpXTsKLQkJbW9kdWxlRmFjdG9yaWVzLnRvQXJyYXkobWYpOwotCQlyZXR1cm4gbWY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIGZhY3Rvcnkgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBtb2R1bGUgZmFjdG9yaWVzICh7QGxpbmsgI2dldE1vZHVsZUZhY3RvcmllcygpfSkgZm9yIHRoZSBvbmUgYSBtYXRjaGluZwotCSAqIG1vZHVsZSBmYWN0b3J5IGlkICh7QGxpbmsgTW9kdWxlRmFjdG9yeSNnZXRJZCgpfSkuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIG1vZHVsZSBmYWN0b3J5IGlkCi0JICogQHJldHVybiB0aGUgbW9kdWxlIGZhY3RvcnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIG1vZHVsZSBmYWN0b3J5Ci0JICogICAgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZHVsZUZhY3RvcnkgZmluZE1vZHVsZUZhY3RvcnkoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJaWYgKG1vZHVsZUZhY3RvcmllcyA9PSBudWxsKQotCQkJbG9hZE1vZHVsZUZhY3RvcmllcygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVGYWN0b3JpZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTW9kdWxlRmFjdG9yeSBmYWN0b3J5ID0gKE1vZHVsZUZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpZC5lcXVhbHMoZmFjdG9yeS5nZXRJZCgpKSkKLQkJCQlyZXR1cm4gZmFjdG9yeTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXVuY2hhYmxlIGFkYXB0ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBsYXVuY2hhYmxlIGFkYXB0ZXJzICh7QGxpbmsgI2dldExhdW5jaGFibGVBZGFwdGVycygpfSkgZm9yIHRoZSBvbmUgYSBtYXRjaGluZwotCSAqIGxhdW5jaGFibGUgYWRhcHRlciBpZCAoe0BsaW5rIElMYXVuY2hhYmxlQWRhcHRlciNnZXRJZCgpfSkuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIGxhdW5jaGFibGUgYWRhcHRlciBpZAotCSAqIEByZXR1cm4gdGhlIGxhdW5jaGFibGUgYWRhcHRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gbGF1bmNoYWJsZSBhZGFwdGVyCi0JICogICAgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElMYXVuY2hhYmxlQWRhcHRlciBmaW5kTGF1bmNoYWJsZUFkYXB0ZXIoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJaWYgKGxhdW5jaGFibGVBZGFwdGVycyA9PSBudWxsKQotCQkJbG9hZExhdW5jaGFibGVBZGFwdGVycygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsYXVuY2hhYmxlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUxhdW5jaGFibGVBZGFwdGVyIGxhID0gKElMYXVuY2hhYmxlQWRhcHRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhsYS5nZXRJZCgpKSkKLQkJCQlyZXR1cm4gbGE7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xpZW50IHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duCi0JICogY2xpZW50cyAoe0BsaW5rICNnZXRDbGllbnRzKCl9KSBmb3IgdGhlIG9uZSBhIG1hdGNoaW5nCi0JICogY2xpZW50IGlkICh7QGxpbmsgSUNsaWVudCNnZXRJZCgpfSkuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIGNsaWVudCBpZAotCSAqIEByZXR1cm4gdGhlIGNsaWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gY2xpZW50Ci0JICogICAgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDbGllbnQgZmluZENsaWVudChTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlpZiAoY2xpZW50cyA9PSBudWxsKQotCQkJbG9hZENsaWVudHMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY2xpZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJQ2xpZW50IGNsaWVudCA9IChJQ2xpZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKGNsaWVudC5nZXRJZCgpKSkKLQkJCQlyZXR1cm4gY2xpZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIG1vZHVsZSBmYWN0b3JpZXMgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRNb2R1bGVGYWN0b3JpZXMoKSB7Ci0JCWlmIChtb2R1bGVGYWN0b3JpZXMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLm1vZHVsZUZhY3RvcmllcyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJtb2R1bGVGYWN0b3JpZXMiKTsKLQkJCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlMaXN0PE1vZHVsZUZhY3Rvcnk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZUZhY3Rvcnk+KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlsaXN0LmFkZChuZXcgTW9kdWxlRmFjdG9yeShjZltpXSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIG1vZHVsZUZhY3RvcmllczogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgbW9kdWxlRmFjdG9yaWVzOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCQkKLQkJc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLSAxOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IHNpemU7IGorKykgewotCQkJCU1vZHVsZUZhY3RvcnkgYSA9IGxpc3QuZ2V0KGkpOwotCQkJCU1vZHVsZUZhY3RvcnkgYiA9IGxpc3QuZ2V0KGopOwotCQkJCWlmIChhLmdldE9yZGVyKCkgPiBiLmdldE9yZGVyKCkpIHsKLQkJCQkJbGlzdC5zZXQoaSwgYik7Ci0JCQkJCWxpc3Quc2V0KGosIGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQltb2R1bGVGYWN0b3JpZXMgPSBsaXN0OwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLTwtIERvbmUgbG9hZGluZyAubW9kdWxlRmFjdG9yaWVzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBzZXJ2ZXIgbW9uaXRvciBpbnN0YW5jZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHNlcnZlciBtb25pdG9yIGluc3RhbmNlcyB7QGxpbmsgSVNlcnZlck1vbml0b3J9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyTW9uaXRvcltdIGdldFNlcnZlck1vbml0b3JzKCkgewotCQlpZiAobW9uaXRvcnMgPT0gbnVsbCkKLQkJCWxvYWRTZXJ2ZXJNb25pdG9ycygpOwotCQlJU2VydmVyTW9uaXRvcltdIHNtID0gbmV3IElTZXJ2ZXJNb25pdG9yW21vbml0b3JzLnNpemUoKV07Ci0JCW1vbml0b3JzLnRvQXJyYXkoc20pOwotCQlyZXR1cm4gc207Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgc2VydmVyIG1vbml0b3IgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRTZXJ2ZXJNb25pdG9ycygpIHsKLQkJaWYgKG1vbml0b3JzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5zZXJ2ZXJNb25pdG9ycyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJpbnRlcm5hbFNlcnZlck1vbml0b3JzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3Q8SVNlcnZlck1vbml0b3I+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXJNb25pdG9yPihzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IFNlcnZlck1vbml0b3IoY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBzZXJ2ZXJNb25pdG9yOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBzZXJ2ZXJNb25pdG9yOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCQltb25pdG9ycyA9IGxpc3Q7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5zZXJ2ZXJNb25pdG9ycyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gcnVudGltZSBsb2NhdG9yIGluc3RhbmNlcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcnVudGltZSBsb2NhdG9yIGluc3RhbmNlcyB7QGxpbmsgSVJ1bnRpbWVMb2NhdG9yfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVMb2NhdG9yW10gZ2V0UnVudGltZUxvY2F0b3JzKCkgewotCQlpZiAocnVudGltZUxvY2F0b3JzID09IG51bGwpCi0JCQlsb2FkUnVudGltZUxvY2F0b3JzKCk7Ci0JCUlSdW50aW1lTG9jYXRvcltdIHJsID0gbmV3IElSdW50aW1lTG9jYXRvcltydW50aW1lTG9jYXRvcnMuc2l6ZSgpXTsKLQkJcnVudGltZUxvY2F0b3JzLnRvQXJyYXkocmwpOwotCQlyZXR1cm4gcmw7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgcnVudGltZSBsb2NhdG9ycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkUnVudGltZUxvY2F0b3JzKCkgewotCQlpZiAocnVudGltZUxvY2F0b3JzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5ydW50aW1lTG9jYXRvcnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAicnVudGltZUxvY2F0b3JzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3Q8SVJ1bnRpbWVMb2NhdG9yPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUnVudGltZUxvY2F0b3I+KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlsaXN0LmFkZChuZXcgUnVudGltZUxvY2F0b3IoY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBydW50aW1lTG9jYXRvcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgcnVudGltZUxvY2F0b3I6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JCXJ1bnRpbWVMb2NhdG9ycyA9IGxpc3Q7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5ydW50aW1lTG9jYXRvcnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIG1vZHVsZSBhcnRpZmFjdCBhZGFwdGVycy4KLQkgKgotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGUgYXJ0aWZhY3QgYWRhcHRlcnMKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZHVsZUFydGlmYWN0QWRhcHRlcltdIGdldE1vZHVsZUFydGlmYWN0QWRhcHRlcnMoKSB7Ci0JCWlmIChtb2R1bGVBcnRpZmFjdEFkYXB0ZXJzID09IG51bGwpCi0JCQlsb2FkTW9kdWxlQXJ0aWZhY3RBZGFwdGVycygpOwotCQkKLQkJTW9kdWxlQXJ0aWZhY3RBZGFwdGVyW10gbW9hID0gbmV3IE1vZHVsZUFydGlmYWN0QWRhcHRlclttb2R1bGVBcnRpZmFjdEFkYXB0ZXJzLnNpemUoKV07Ci0JCW1vZHVsZUFydGlmYWN0QWRhcHRlcnMudG9BcnJheShtb2EpOwotCQlyZXR1cm4gbW9hOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIG1vZHVsZSBhcnRpZmFjdCBhZGFwdGVycyBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZE1vZHVsZUFydGlmYWN0QWRhcHRlcnMoKSB7Ci0JCWlmIChtb2R1bGVBcnRpZmFjdEFkYXB0ZXJzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgIm1vZHVsZUFydGlmYWN0QWRhcHRlcnMiKTsKLQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJTGlzdDxNb2R1bGVBcnRpZmFjdEFkYXB0ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZUFydGlmYWN0QWRhcHRlcj4oc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXIoY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBtb2R1bGVBcnRpZmFjdEFkYXB0ZXI6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIG1vZHVsZUFydGlmYWN0QWRhcHRlcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHNvcnQgYnkgaW5kZXggdG8gcHV0IGxvd2VyIG51bWJlcnMgZmlyc3QgaW4gb3JkZXIKLQkJc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUtMTsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gaSsxOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkJTW9kdWxlQXJ0aWZhY3RBZGFwdGVyIGEgPSBsaXN0LmdldChpKTsKLQkJCQlNb2R1bGVBcnRpZmFjdEFkYXB0ZXIgYiA9IGxpc3QuZ2V0KGopOwotCQkJCWlmIChhLmdldFByaW9yaXR5KCkgPCBiLmdldFByaW9yaXR5KCkpIHsKLQkJCQkJbGlzdC5zZXQoaSwgYik7Ci0JCQkJCWxpc3Quc2V0KGosIGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQltb2R1bGVBcnRpZmFjdEFkYXB0ZXJzID0gbGlzdDsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi08LSBEb25lIGxvYWRpbmcgLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBtb2R1bGUgYXJ0aWZhY3QgbWF5IGJlIGF2YWlsYWJsZSBmb3IgdGhlIGdpdmVuIG9iamVjdCwKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKgotCSAqIEBwYXJhbSBvYmogYW4gb2JqZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhIG1vZHVsZSBhcnRpZmFjdCBhZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc01vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KCkgIiArIG9iaik7Ci0JCU1vZHVsZUFydGlmYWN0QWRhcHRlcltdIGFkYXB0ZXJzID0gZ2V0TW9kdWxlQXJ0aWZhY3RBZGFwdGVycygpOwotCQlpZiAoYWRhcHRlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBhZGFwdGVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChhZGFwdGVyc1tpXS5pc0VuYWJsZWQob2JqKSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoKSAtICIgKyBhZGFwdGVyc1tpXS5nZXRJZCgpKTsKLQkJCQkJCWlmIChhZGFwdGVyc1tpXS5pc0RlbGVnYXRlTG9hZGVkKCkpIHsKLQkJCQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJCQlJTW9kdWxlQXJ0aWZhY3RbXSBtYSA9IGFkYXB0ZXJzW2ldLmdldE1vZHVsZUFydGlmYWN0cyhvYmopOwotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiRGVlcCBlbmFibGVkIHRpbWU6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSk7Ci0JCQkJCQkJaWYgKG1hICE9IG51bGwpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJEZWVwIGVuYWJsZWQiKTsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiTm90IGVuYWJsZWQiKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJFbmFibGVkIik7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgdXNlIG1vZHVsZUFydGlmYWN0QWRhcHRlciIsIGNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbW9kdWxlIGFydGlmYWN0IGlmIG9uZSBjYW4gYmUgZm91bmQgd2l0aG91dCBsb2FkaW5nIHBsdWdpbnMuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4gYSBtb2R1bGUgYXJ0aWZhY3QsIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2R1bGVBcnRpZmFjdFtdIGdldE1vZHVsZUFydGlmYWN0cyhPYmplY3Qgb2JqKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlNlcnZlclBsdWdpbi5nZXRNb2R1bGVBcnRpZmFjdCgpICIgKyBvYmopOwotCQlNb2R1bGVBcnRpZmFjdEFkYXB0ZXJbXSBhZGFwdGVycyA9IGdldE1vZHVsZUFydGlmYWN0QWRhcHRlcnMoKTsKLQkJaWYgKGFkYXB0ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gYWRhcHRlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoYWRhcHRlcnNbaV0uaXNFbmFibGVkKG9iaikpIHsKLQkJCQkJCUlNb2R1bGVBcnRpZmFjdFtdIG1hID0gYWRhcHRlcnNbaV0uZ2V0TW9kdWxlQXJ0aWZhY3RzKG9iaik7Ci0JCQkJCQlpZiAobWEgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gbWE7Ci0JCQkJCQkvKmlmIChQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmhhc0FkYXB0ZXIob2JqLCBNT0RVTEVfQVJUSUZBQ1RfQ0xBU1MpKSB7Ci0JCQkJCQkJcmV0dXJuIChJTW9kdWxlQXJ0aWZhY3QpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihvYmosIE1PRFVMRV9BUlRJRkFDVF9DTEFTUyk7Ci0JCQkJCQl9Ki8KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgdXNlIG1vZHVsZUFydGlmYWN0QWRhcHRlciAiICsgYWRhcHRlcnNbaV0sIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gaW5zdGFsbGFibGUgc2VydmVycy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBpbnN0YWxsYWJsZSBzZXJ2ZXJzIHtAbGluayBJSW5zdGFsbGFibGVTZXJ2ZXJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVTZXJ2ZXJbXSBnZXRJbnN0YWxsYWJsZVNlcnZlcnMoKSB7Ci0JCWlmIChpbnN0YWxsYWJsZVNlcnZlcnMgPT0gbnVsbCkKLQkJCWxvYWRJbnN0YWxsYWJsZVNlcnZlcnMoKTsKLQkJCi0JCUxpc3Q8SUluc3RhbGxhYmxlU2VydmVyPiBhdmFpbGFibGVTZXJ2ZXJzID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVTZXJ2ZXI+KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gaW5zdGFsbGFibGVTZXJ2ZXJzLml0ZXJhdG9yKCk7Ci0JCUlSdW50aW1lVHlwZVtdIHJ1bnRpbWVUeXBlcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZVR5cGVzKCk7Ci0JCWludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUluc3RhbGxhYmxlU2VydmVyIHNlcnZlciA9IChJSW5zdGFsbGFibGVTZXJ2ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHNlcnZlci5nZXRJZCgpLmVxdWFscyhydW50aW1lVHlwZXNbaV0uZ2V0SWQoKSkpCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICghZm91bmQpCi0JCQkJYXZhaWxhYmxlU2VydmVycy5hZGQoc2VydmVyKTsKLQkJfQotCQkKLQkJSUluc3RhbGxhYmxlU2VydmVyW10gaXMgPSBuZXcgSUluc3RhbGxhYmxlU2VydmVyW2F2YWlsYWJsZVNlcnZlcnMuc2l6ZSgpXTsKLQkJYXZhaWxhYmxlU2VydmVycy50b0FycmF5KGlzKTsKLQkJcmV0dXJuIGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIGluc3RhbGxhYmxlIHJ1bnRpbWVzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGluc3RhbGxhYmxlIHJ1bnRpbWVzIHtAbGluayBJSW5zdGFsbGFibGVSdW50aW1lfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlUnVudGltZVtdIGdldEluc3RhbGxhYmxlUnVudGltZXMoKSB7Ci0JCS8vaWYgKGluc3RhbGxhYmxlUnVudGltZXMgPT0gbnVsbCkKLQkJCWxvYWRJbnN0YWxsYWJsZVJ1bnRpbWVzKCk7Ci0JCQotCQlJSW5zdGFsbGFibGVSdW50aW1lW10gaXIgPSBuZXcgSUluc3RhbGxhYmxlUnVudGltZVtpbnN0YWxsYWJsZVJ1bnRpbWVzLnNpemUoKV07Ci0JCWluc3RhbGxhYmxlUnVudGltZXMudG9BcnJheShpcik7Ci0JCXJldHVybiBpcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsYWJsZSBydW50aW1lIGZvciB0aGUgZ2l2ZW4gcnVudGltZSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUgZXhpc3RzLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lVHlwZUlkIGEgcnVudGltZSB0eXBlIGlkCi0JICogQHJldHVybiB0aGUgaW5zdGFsbGFibGUgcnVudGltZSBmb3IgdGhlIGdpdmVuIHJ1bnRpbWUgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICBpZiBub25lIGV4aXN0cyB7QGxpbmsgSUluc3RhbGxhYmxlUnVudGltZX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVJ1bnRpbWUgZmluZEluc3RhbGxhYmxlUnVudGltZShTdHJpbmcgcnVudGltZVR5cGVJZCkgewotCQlpZiAocnVudGltZVR5cGVJZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJLy9pZiAoaW5zdGFsbGFibGVSdW50aW1lcyA9PSBudWxsKQotCQkJbG9hZEluc3RhbGxhYmxlUnVudGltZXMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gaW5zdGFsbGFibGVSdW50aW1lcy5pdGVyYXRvcigpOwotCQkvL0lSdW50aW1lVHlwZVtdIHJ1bnRpbWVUeXBlcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZVR5cGVzKCk7Ci0JCS8vaW50IHNpemUgPSBydW50aW1lVHlwZXMubGVuZ3RoOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJSW5zdGFsbGFibGVSdW50aW1lIHJ1bnRpbWUgPSAoSUluc3RhbGxhYmxlUnVudGltZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJLy9mb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChydW50aW1lLmdldElkKCkuZXF1YWxzKHJ1bnRpbWVUeXBlSWQpKQotCQkJCQlyZXR1cm4gcnVudGltZTsKLQkJCS8vfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBpbnN0YWxsYWJsZSBzZXJ2ZXJzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRJbnN0YWxsYWJsZVNlcnZlcnMoKSB7Ci0JCWlmIChpbnN0YWxsYWJsZVNlcnZlcnMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLmluc3RhbGxhYmxlU2VydmVycyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiaW5zdGFsbGFibGVTZXJ2ZXJzIik7Ci0JCQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJTGlzdDxJSW5zdGFsbGFibGVTZXJ2ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVNlcnZlcj4oc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBJbnN0YWxsYWJsZVNlcnZlcihjZltpXSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIGluc3RhbGxhYmxlU2VydmVyOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBpbnN0YWxsYWJsZVNlcnZlcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJaW5zdGFsbGFibGVTZXJ2ZXJzID0gbGlzdDsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi08LSBEb25lIGxvYWRpbmcgLmluc3RhbGxhYmxlU2VydmVycyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgaW5zdGFsbGFibGUgcnVudGltZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZEluc3RhbGxhYmxlUnVudGltZXMoKSB7Ci0JCS8vaWYgKGluc3RhbGxhYmxlUnVudGltZXMgIT0gbnVsbCkKLQkJLy8JcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAuaW5zdGFsbGFibGVSdW50aW1lcyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiaW5zdGFsbGFibGVSdW50aW1lcyIpOwotCQkKLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCUxpc3Q8SUluc3RhbGxhYmxlUnVudGltZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlUnVudGltZT4oc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWlmICgicnVudGltZSIuZXF1YWxzKGNmW2ldLmdldE5hbWUoKSkpIHsKLQkJCQkJU3RyaW5nIG9zID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJvcyIpOwotCQkJCQlpZiAob3MgPT0gbnVsbCB8fCBvcy5jb250YWlucyhQbGF0Zm9ybS5nZXRPUygpKSkKLQkJCQkJCWxpc3QuYWRkKG5ldyBJbnN0YWxsYWJsZVJ1bnRpbWUyKGNmW2ldKSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWxpc3QuYWRkKG5ldyBJbnN0YWxsYWJsZVJ1bnRpbWUoY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBpbnN0YWxsYWJsZVJ1bnRpbWU6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIGluc3RhbGxhYmxlUnVudGltZTogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJaW5zdGFsbGFibGVSdW50aW1lcyA9IGxpc3Q7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5pbnN0YWxsYWJsZVJ1bnRpbWVzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVnaXN0cnlMaXN0ZW5lcihJUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZWdpc3RyeUxpc3RlbmVyID0gbGlzdGVuZXI7IAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZWZlcmVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9qZWN0LiBUaGUgcHJvamVjdCBtYXkgbm90Ci0JICogYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBQcm9qZWN0UHJvcGVydGllcyBnZXRQcm9qZWN0UHJvcGVydGllcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXJldHVybiBuZXcgUHJvamVjdFByb3BlcnRpZXMocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIGFuZCBiIG1hdGNoLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiBTdHJpbmdzIG1hdGNoIGlmIHRoZXkgYXJlIGVxdWFsLCBpZiBlaXRoZXIgaXMgbnVsbCwgaWYgZWl0aGVyIGlzICIqIiwgb3IgaWYKLQkgKiBvbmUgZW5kcyB3aXRoICIuKiIgYW5kIHRoZSBiZWdpbm5pbmcgbWF0Y2hlcyB0aGUgb3RoZXIgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBhIGEgc3RyaW5nIHRvIG1hdGNoCi0JICogQHBhcmFtIGIgYW5vdGhlciBzdHJpbmcgdG8gbWF0Y2gKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgYW5kIGIgbWF0Y2gsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsIHx8IGEuZXF1YWxzKGIpIHx8ICIqIi5lcXVhbHMoYSkgfHwgIioiLmVxdWFscyhiKQotCQkJfHwgKGEuZW5kc1dpdGgoIi4qIikgJiYgYi5zdGFydHNXaXRoKGEuc3Vic3RyaW5nKDAsIGEubGVuZ3RoKCkgLSAxKSkpCi0JCQl8fCAoYi5lbmRzV2l0aCgiLioiKSAmJiBhLnN0YXJ0c1dpdGgoYi5zdWJzdHJpbmcoMCwgYi5sZW5ndGgoKSAtIDEpKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGEuc3RhcnRzV2l0aChiKSB8fCBiLnN0YXJ0c1dpdGgoYSkpIHsKLQkJCVNlcnZlclBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiSW52YWxpZCBtYXRjaGluZyBydWxlcyB1c2VkOiAiICsgYSArICIvIiArIGIpKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJJbnZhbGlkIG1hdGNoaW5nIHJ1bGVzIHVzZWQ6ICIgKyBhICsgIi8iICsgYik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZFNlcnZlckFkYXB0ZXJzKCkgewotCQlyZXR1cm4gdG9rZW5pemUoZ2V0UHJvcGVydHkoRVhDTFVERV9TRVJWRVJfQURBUFRFUlMpLCAiLCIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlpZiAoUGxhdGZvcm0uZ2V0UHJvZHVjdCgpICE9IG51bGwpCi0JCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldFByb3BlcnR5KGtleSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZTg2NjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IHN0b3JlcyBwcmVmZXJlbmNlIGluZm9ybWF0aW9uIGZvciBzZXJ2ZXIgdG9vbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQcmVmZXJlbmNlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVVUT19QVUJMSVNIID0gImF1dG8tcHVibGlzaCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTU9EVUxFX1NUQVJUX1RJTUVPVVQgPSAibW9kdWxlLXN0YXJ0LXRpbWVvdXQiOwotCQkKLQlwcml2YXRlIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBTZXJ2ZXJQcmVmZXJlbmNlcyBpbnN0YW5jZTsKLQotCS8qKgotCSAqIFNlcnZlclByZWZlcmVuY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFNlcnZlclByZWZlcmVuY2VzKCkgewotCQlzdXBlcigpOwotCQlwcmVmZXJlbmNlcyA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhdGljIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0YXRpYyBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyUHJlZmVyZW5jZXMgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU2VydmVyUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBwdWJsaXNoaW5nIHNob3VsZCBvY2N1ciBiZWZvcmUgc3RhcnRpbmcgdGhlCi0JICogc2VydmVyLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvUHVibGlzaGluZygpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oUFJFRl9BVVRPX1BVQkxJU0gpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgcHVibGlzaGluZyBzaG91bGQgb2NjdXIgYmVmb3JlIHN0YXJ0aW5nIHRoZQotCSAqIHNlcnZlci4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEF1dG9QdWJsaXNoaW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgd2hldGhlciBzZXJ2ZXJzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZXN0YXJ0ZWQgd2hlbgotCSAqIHRoZXkgbmVlZCBhIHJlc3RhcnQuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvUmVzdGFydGluZyhib29sZWFuIHZhbHVlKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHB1Ymxpc2hpbmcgc2hvdWxkIGhhcHBlbiBiZWZvcmUgdGhlIHNlcnZlciBzdGFydHMuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaGluZyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQVVUT19QVUJMSVNILCB2YWx1ZSk7Ci0JCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSBzdGFydCB0aW1lb3V0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBzdGFydCB0aW1lb3V0Ci0JICovCi0JcHVibGljIGludCBnZXRNb2R1bGVTdGFydFRpbWVvdXQoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRJbnQoUFJFRl9NT0RVTEVfU1RBUlRfVElNRU9VVCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkZWZhdWx0IHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUFVCTElTSCwgaXNEZWZhdWx0QXV0b1B1Ymxpc2hpbmcoKSk7Ci0JCQkKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VULCAzMDAwMDEpOwotCQlib29sZWFuIHNhdmUgPSBmYWxzZTsKLQkJaWYgKHByZWZlcmVuY2VzLmlzRGVmYXVsdChQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VUKSkgewotCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9NT0RVTEVfU1RBUlRfVElNRU9VVCwgMzAwMDAwKTsKLQkJCXNhdmUgPSB0cnVlOwotCQl9Ci0JCWlmIChzYXZlKQotCQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclB1Ymxpc2hJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJQdWJsaXNoSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmNlODA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclB1Ymxpc2hJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlRGVsdGE7Ci0vKioKLSAqIEhlbHBlciB0byBvYnRhaW4gYW5kIHN0b3JlIHRoZSBwdWJsaXNoaW5nIGluZm9ybWF0aW9uICh3aGF0IGZpbGVzCi0gKiB3ZXJlIHB1Ymxpc2hlZCBhbmQgd2hlbikgZm9yIGEgc2luZ2xlIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclB1Ymxpc2hJbmZvIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKLQotCXByb3RlY3RlZCBJUGF0aCBwYXRoOwotCi0JLy8gbWFwIG9mIG1vZHVsZSBpZHMgdG8gTW9kdWxlUHVibGlzaEluZm8KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgTW9kdWxlUHVibGlzaEluZm8+IG1vZHVsZVB1Ymxpc2hJbmZvOwotCi0JLyoqCi0JICogU2VydmVyUHVibGlzaEluZm8gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmVyUHVibGlzaEluZm8oSVBhdGggcGF0aCkgewotCQlzdXBlcigpOwotCQkKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJbW9kdWxlUHVibGlzaEluZm8gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1vZHVsZVB1Ymxpc2hJbmZvPigpOwotCQlsb2FkKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0S2V5KElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkKLQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCXNiLmFwcGVuZCgiIyIpOwotCQkJCWlmIChtb2R1bGVbaV0gIT0gbnVsbCkKLQkJCQkJc2IuYXBwZW5kKG1vZHVsZVtpXS5nZXRJZCgpKTsKLQkJCQllbHNlCi0JCQkJCXNiLmFwcGVuZCgibnVsbCIpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRLZXkoU3RyaW5nIG1vZHVsZUlkKSB7Ci0JCXJldHVybiBtb2R1bGVJZDsKLQl9Ci0KLQlwcml2YXRlIElNb2R1bGVbXSBnZXRNb2R1bGUoU3RyaW5nIG1vZHVsZUlkKSB7Ci0JCWlmIChtb2R1bGVJZCA9PSBudWxsIHx8IG1vZHVsZUlkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JCQotCQlMaXN0PElNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobW9kdWxlSWQsICIjIik7Ci0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBtaWQgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCWlmIChtaWQgIT0gbnVsbCAmJiBtaWQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJSU1vZHVsZSBtID0gU2VydmVyVXRpbC5nZXRNb2R1bGUobWlkKTsKLQkJCQlpZiAobSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlsaXN0LmFkZChtKTsKLQkJCX0KLQkJfQotCQkKLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBuZXcgSU1vZHVsZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShtb2R1bGVzKTsKLQkJcmV0dXJuIG1vZHVsZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTW9kdWxlUHVibGlzaEluZm8oSU1vZHVsZVtdIG1vZHVsZSkgewotCQlTdHJpbmcga2V5ID0gZ2V0S2V5KG1vZHVsZSk7Ci0JCXN5bmNocm9uaXplZCAobW9kdWxlUHVibGlzaEluZm8pIHsKLQkJCXJldHVybiBtb2R1bGVQdWJsaXNoSW5mby5jb250YWluc0tleShrZXkpOwotCQl9Ci0JfQotCi0JLypwdWJsaWMgdm9pZCByZW1vdmVNb2R1bGVQdWJsaXNoSW5mbyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRLZXkobW9kdWxlKTsKLQkJbW9kdWxlUHVibGlzaEluZm8ucmVtb3ZlKGtleSk7Ci0JCQotCQlzYXZlKCk7Ci0JfSovCi0KLQkvKioKLQkgKiAKLQkgKiBOb3RlOiBzYXZlKCkgbXVzdCBiZSBjYWxsZWQgbWFudWFsbHkgYWZ0ZXIgbWFraW5nIHRoaXMgY2FsbC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlTGlzdAotCSAqIEBkZXByZWNhdGVkIFVzZSByZW1vdmVEZWxldGVkTW9kdWxlUHVibGlzaEluZm8oU2VydmVyLCBMaXN0KSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVsZXRlZE1vZHVsZVB1Ymxpc2hJbmZvKExpc3QgbW9kdWxlTGlzdCkgewotCQlyZW1vdmVEZWxldGVkTW9kdWxlUHVibGlzaEluZm8obnVsbCwgbW9kdWxlTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBzdWNjZXNzZnVsbHkgZGVsZXRlZCBtb2R1bGVzIGZyb20gdGhlIG5leHQgcHVibGlzaC4KLQkgKiBOb3RlOiBzYXZlKCkgbXVzdCBiZSBjYWxsZWQgbWFudWFsbHkgYWZ0ZXIgbWFraW5nIHRoaXMgY2FsbC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZUxpc3QgdGhlIG1vZHVsZXMgY3VycmVudGx5IG9uIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEZWxldGVkTW9kdWxlUHVibGlzaEluZm8oU2VydmVyIHNlcnZlciwgTGlzdCBtb2R1bGVMaXN0KSB7Ci0JCWludCBzaXplID0gbW9kdWxlTGlzdC5zaXplKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZW1vdmVkID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKG1vZHVsZVB1Ymxpc2hJbmZvKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZVB1Ymxpc2hJbmZvLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZSA9IChJTW9kdWxlW10pIG1vZHVsZUxpc3QuZ2V0KGkpOwotCQkJCQlTdHJpbmcga2V5MiA9IGdldEtleShtb2R1bGUpOwotCQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFscyhrZXkyKSkKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJbnRlZ2VyIGluID0gc2VydmVyLm1vZHVsZVB1Ymxpc2hTdGF0ZS5nZXQoa2V5KTsKLQkJCQkJCWlmIChpbiAhPSBudWxsICYmIGluLmludFZhbHVlKCkgIT0gSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpCi0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCFmb3VuZCkKLQkJCQkJcmVtb3ZlZC5hZGQoa2V5KTsKLQkJCX0KLQkJCQotCQkJaXRlcmF0b3IgPSByZW1vdmVkLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQltb2R1bGVQdWJsaXNoSW5mby5yZW1vdmUoa2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHVibGlzaCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlUHVibGlzaEluZm8gZ2V0TW9kdWxlUHVibGlzaEluZm8oSU1vZHVsZVtdIG1vZHVsZSkgewotCQlTdHJpbmcga2V5ID0gZ2V0S2V5KG1vZHVsZSk7Ci0JCQotCQkvLyBjaGVjayBpZiBpdCBub3cgZXhpc3RzCi0JCXN5bmNocm9uaXplZCAobW9kdWxlUHVibGlzaEluZm8pIHsKLQkJCWlmIChtb2R1bGVQdWJsaXNoSW5mby5jb250YWluc0tleShrZXkpKQotCQkJCXJldHVybiBtb2R1bGVQdWJsaXNoSW5mby5nZXQoa2V5KTsKLQkJCQotCQkJLy8gaGF2ZSB0byBjcmVhdGUgYSBuZXcgb25lCi0JCQlJTW9kdWxlIG1vZCA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07Ci0JCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSBuZXcgTW9kdWxlUHVibGlzaEluZm8oZ2V0S2V5KG1vZHVsZSksIG1vZC5nZXROYW1lKCksIG1vZC5nZXRNb2R1bGVUeXBlKCkpOwotCQkJbW9kdWxlUHVibGlzaEluZm8ucHV0KGtleSwgbXBpKTsKLQkJCXJldHVybiBtcGk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZW1vdmVkTW9kdWxlcyhMaXN0PElNb2R1bGVbXT4gbW9kdWxlTGlzdCkgewotCQlpbnQgc2l6ZSA9IG1vZHVsZUxpc3Quc2l6ZSgpOwotCQlMaXN0PE1vZHVsZVB1Ymxpc2hJbmZvPiByZW1vdmVkID0gbmV3IEFycmF5TGlzdDxNb2R1bGVQdWJsaXNoSW5mbz4oKTsKLQkJc3luY2hyb25pemVkIChtb2R1bGVQdWJsaXNoSW5mbykgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZSA9IG1vZHVsZUxpc3QuZ2V0KGkpOwotCQkJCQlTdHJpbmcga2V5MiA9IGdldEtleShtb2R1bGUpOwotCQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFscyhrZXkyKSkKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSBtb2R1bGVQdWJsaXNoSW5mby5nZXQoa2V5KTsKLQkJCQkJcmVtb3ZlZC5hZGQobXBpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWl0ZXJhdG9yID0gcmVtb3ZlZC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IChNb2R1bGVQdWJsaXNoSW5mbykgaXRlcmF0b3IubmV4dCgpOwotCQkJCUlNb2R1bGVbXSBtb2R1bGUyID0gZ2V0TW9kdWxlKG1waS5nZXRNb2R1bGVJZCgpKTsKLQkJCQlpZiAobW9kdWxlMiA9PSBudWxsIHx8IG1vZHVsZTIubGVuZ3RoID09IDApIHsKLQkJCQkJU3RyaW5nIG1vZHVsZUlkID0gbXBpLmdldE1vZHVsZUlkKCk7Ci0JCQkJCWlmIChtb2R1bGVJZCAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmdbXSBpZHMgPSBnZXRNb2R1bGVJZHMobW9kdWxlSWQpOwotCQkJCQkJaW50IGRlcHRoID0gaWRzLmxlbmd0aDsKLQkJCQkJCQotCQkJCQkJbW9kdWxlMiA9IG5ldyBJTW9kdWxlW2RlcHRoXTsKLQkJCQkJCVN0cmluZyBzID0gIiI7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKLQkJCQkJCQlzICs9IGlkc1tpXTsKLQkJCQkJCQlpZiAoaSA9PSBkZXB0aCAtIDEpCi0JCQkJCQkJCW1vZHVsZTJbaV0gPSBtcGkuZ2V0RGVsZXRlZE1vZHVsZSgpOwotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkyID0gbW9kdWxlUHVibGlzaEluZm8uZ2V0KHMpOwotCQkJCQkJCQlpZiAobXBpMiAhPSBudWxsKQotCQkJCQkJCQkJbW9kdWxlMltpXSA9IG1waTIuZ2V0RGVsZXRlZE1vZHVsZSgpOwotCQkJCQkJCX0KLQkJCQkJCQlzICs9ICIjIjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobW9kdWxlMiAhPSBudWxsICYmIG1vZHVsZTIubGVuZ3RoID4gMCkKLQkJCQkJbW9kdWxlTGlzdC5hZGQobW9kdWxlMik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSBhIGNvbWJpbmVkIG1vZHVsZSBpZCBzdHJpbmcgaW50byB0aGUgaW5kaXZpZHVhbCBtb2R1bGUgaWRzCi0JICogQHBhcmFtIG1vZHVsZUlkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtb2R1bGUgaWRzCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRNb2R1bGVJZHMoU3RyaW5nIG1vZHVsZUlkKSB7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobW9kdWxlSWQsICIjIik7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDIpOwotCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlsaXN0LmFkZChzdC5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJCi0JCWlmIChuZXcgRmlsZShmaWxlbmFtZSkuZXhpc3RzKCkpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgcHVibGlzaCBpbmZvIGZyb20gIiArIGZpbGVuYW1lKTsKLQkJCQotCQkJRGF0YUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpKSk7Ci0JCQkJaW4ucmVhZEJ5dGUoKTsKLQkJCQlpbi5yZWFkQnl0ZSgpOwotCQkJCS8vIHZlcnNpb24KLQkJCQlpbnQgdmVyID0gaW4ucmVhZEJ5dGUoKTsKLQkJCQlpZiAodmVyIDw9IDEpIHsKLQkJCQkJaW50IHNpemUgPSBpbi5yZWFkSW50KCk7CQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gbmV3IE1vZHVsZVB1Ymxpc2hJbmZvKGluKTsKLQkJCQkJCW1vZHVsZVB1Ymxpc2hJbmZvLnB1dChnZXRLZXkobXBpLmdldE1vZHVsZUlkKCkpLCBtcGkpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBwdWJsaXNoIGluZm9ybWF0aW9uIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGZpbGVuYW1lLmxlbmd0aCgpIC0gMykgKyAieG1sIjsKLQkJaWYgKG5ldyBGaWxlKGZpbGVuYW1lKS5leGlzdHMoKSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyBwdWJsaXNoIGluZm8gZnJvbSBvbGQgZm9ybWF0ICIgKyBmaWxlbmFtZSk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJSU1lbWVudG8gbWVtZW50bzIgPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGZpbGVuYW1lKTsKLQkJCQlGbG9hdCBmID0gbWVtZW50bzIuZ2V0RmxvYXQoVkVSU0lPTik7Ci0JCQkJaWYgKGYgIT0gbnVsbCAmJiBmLmZsb2F0VmFsdWUoKSA+PSAzKQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8yLmdldENoaWxkcmVuKCJtb2R1bGUiKTsKLQkJCQkKLQkJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSBuZXcgTW9kdWxlUHVibGlzaEluZm8oY2hpbGRyZW5baV0pOwotCQkJCQltb2R1bGVQdWJsaXNoSW5mby5wdXQoZ2V0S2V5KG1waS5nZXRNb2R1bGVJZCgpKSwgbXBpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBwdWJsaXNoIGluZm9ybWF0aW9uIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiU2F2aW5nIHB1Ymxpc2ggaW5mbyB0byAiICsgZmlsZW5hbWUpOwotCQkKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQl0cnkgewotCQkJb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSkpOwotCQkJb3V0LndyaXRlQnl0ZSgxNCk7Ci0JCQlvdXQud3JpdGVCeXRlKDE0KTsKLQkJCS8vIHZlcnNpb24KLQkJCW91dC53cml0ZUJ5dGUoMSk7Ci0JCQkKLQkJCXN5bmNocm9uaXplZCAobW9kdWxlUHVibGlzaEluZm8pIHsKLQkJCQlvdXQud3JpdGVJbnQobW9kdWxlUHVibGlzaEluZm8ua2V5U2V0KCkuc2l6ZSgpKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZVB1Ymxpc2hJbmZvLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlTdHJpbmcgY29udHJvbFJlZiA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gbW9kdWxlUHVibGlzaEluZm8uZ2V0KGNvbnRyb2xSZWYpOwotCQkJCQltcGkuc2F2ZShvdXQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIHB1Ymxpc2ggaW5mb3JtYXRpb24iLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJCi0JCS8vIHJlbW92ZSBvbGQgZmlsZQotCQlmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBmaWxlbmFtZS5sZW5ndGgoKSAtIDMpICsgInhtbCI7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKLQkJaWYgKGYuZXhpc3RzKCkpCi0JCQlmLmRlbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIE5vdGU6IHNhdmUoKSBtdXN0IGJlIGNhbGxlZCBtYW51YWxseSBhZnRlciBtYWtpbmcgdGhpcyBjYWxsLgotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gZ2V0TW9kdWxlUHVibGlzaEluZm8obW9kdWxlKTsKLQkJbXBpLmZpbGwobW9kdWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXREZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlRGVsdGFbMF07Ci0JCQotCQlyZXR1cm4gZ2V0TW9kdWxlUHVibGlzaEluZm8obW9kdWxlKS5nZXREZWx0YShtb2R1bGUpOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElNb2R1bGVSZXNvdXJjZVswXTsKLQkJCi0JCXJldHVybiBnZXRNb2R1bGVQdWJsaXNoSW5mbyhtb2R1bGUpLmdldE1vZHVsZVJlc291cmNlcyhtb2R1bGUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXREZWx0YShJTW9kdWxlUmVzb3VyY2VbXSBvcmlnaW5hbCwgSU1vZHVsZVJlc291cmNlW10gY3VycmVudCkgewotCQlpZiAob3JpZ2luYWwgPT0gbnVsbCB8fCBjdXJyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElNb2R1bGVSZXNvdXJjZURlbHRhWzBdOwotCQkKLQkJTGlzdDxNb2R1bGVSZXNvdXJjZURlbHRhPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2R1bGVSZXNvdXJjZURlbHRhPigpOwotCQlpbnQgc2l6ZSA9IG9yaWdpbmFsLmxlbmd0aDsKLQkJaW50IHNpemUyID0gY3VycmVudC5sZW5ndGg7Ci0JCQotCQlNYXA8SU1vZHVsZVJlc291cmNlLCBJTW9kdWxlUmVzb3VyY2U+IG9yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXA8SU1vZHVsZVJlc291cmNlLCBJTW9kdWxlUmVzb3VyY2U+KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCW9yaWdpbmFsTWFwLnB1dChvcmlnaW5hbFtpXSwgb3JpZ2luYWxbaV0pOwotCQkKLQkJLy8gYWRkZWQgYW5kIGNoYW5nZWQgcmVzb3VyY2VzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykgewotCQkJSU1vZHVsZVJlc291cmNlIG9sZCA9IG9yaWdpbmFsTWFwLnJlbW92ZShjdXJyZW50W2ldKTsKLQkJCWlmIChvbGQgPT0gbnVsbCkgewotCQkJCU1vZHVsZVJlc291cmNlRGVsdGEgZGVsdGEgPSBuZXcgTW9kdWxlUmVzb3VyY2VEZWx0YShjdXJyZW50W2ldLCBJTW9kdWxlUmVzb3VyY2VEZWx0YS5BRERFRCk7Ci0JCQkJaWYgKGN1cnJlbnRbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7Ci0JCQkJCUlNb2R1bGVGb2xkZXIgY3VycmVudEZvbGRlciA9IChJTW9kdWxlRm9sZGVyKSBjdXJyZW50W2ldOyAKLQkJCQkJZGVsdGEuc2V0Q2hpbGRyZW4oZ2V0RGVsdGFUcmVlKGN1cnJlbnRGb2xkZXIubWVtYmVycygpLCBJTW9kdWxlUmVzb3VyY2VEZWx0YS5BRERFRCkpOwotCQkJCX0KLQkJCQlsaXN0LmFkZChkZWx0YSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjdXJyZW50W2ldIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpIHsKLQkJCQkJLy8gaW5jbHVkZSBmaWxlcyBvbmx5IGlmIHRoZSBtb2RpZmljYXRpb24gc3RhbXAgaGFzIGNoYW5nZWQKLQkJCQkJSU1vZHVsZUZpbGUgbWYxID0gKElNb2R1bGVGaWxlKSBvbGQ7Ci0JCQkJCUlNb2R1bGVGaWxlIG1mMiA9IChJTW9kdWxlRmlsZSkgY3VycmVudFtpXTsKLQkJCQkJaWYgKG1mMS5nZXRNb2RpZmljYXRpb25TdGFtcCgpICE9IG1mMi5nZXRNb2RpZmljYXRpb25TdGFtcCgpKSB7Ci0JCQkJCQlsaXN0LmFkZChuZXcgTW9kdWxlUmVzb3VyY2VEZWx0YShjdXJyZW50W2ldLCBJTW9kdWxlUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBpbmNsdWRlIGZvbGRlcnMgb25seSBpZiB0aGVpciBjb250ZW50cyBoYXZlIGNoYW5nZWQKLQkJCQkJSU1vZHVsZUZvbGRlciBtZjEgPSAoSU1vZHVsZUZvbGRlcikgb2xkOwotCQkJCQlJTW9kdWxlRm9sZGVyIG1mMiA9IChJTW9kdWxlRm9sZGVyKSBjdXJyZW50W2ldOwotCQkJCQlJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIG1yZGMgPSBnZXREZWx0YShtZjEubWVtYmVycygpLCBtZjIubWVtYmVycygpKTsKLQkJCQkJaWYgKG1yZGMubGVuZ3RoID4gMCkgewotCQkJCQkJTW9kdWxlUmVzb3VyY2VEZWx0YSBtcmQgPSBuZXcgTW9kdWxlUmVzb3VyY2VEZWx0YShjdXJyZW50W2ldLCBJTW9kdWxlUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UpOwotCQkJCQkJbXJkLnNldENoaWxkcmVuKG1yZGMpOwotCQkJCQkJbGlzdC5hZGQobXJkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gcmVtb3ZlZCByZXNvdXJjZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChvcmlnaW5hbE1hcC5jb250YWluc0tleShvcmlnaW5hbFtpXSkpIHsKLQkJCQlNb2R1bGVSZXNvdXJjZURlbHRhIGRlbHRhID0gbmV3IE1vZHVsZVJlc291cmNlRGVsdGEob3JpZ2luYWxbaV0sIElNb2R1bGVSZXNvdXJjZURlbHRhLlJFTU9WRUQpOwotCQkJCWlmIChvcmlnaW5hbFtpXSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKLQkJCQkJSU1vZHVsZUZvbGRlciByZW1vdmVkRm9sZGVyID0gKElNb2R1bGVGb2xkZXIpIG9yaWdpbmFsW2ldOyAKLQkJCQkJZGVsdGEuc2V0Q2hpbGRyZW4oZ2V0RGVsdGFUcmVlKHJlbW92ZWRGb2xkZXIubWVtYmVycygpLCBJTW9kdWxlUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSk7Ci0JCQkJfQotCQkJCWxpc3QuYWRkKGRlbHRhKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSU1vZHVsZVJlc291cmNlRGVsdGFbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNEZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiBoYXNNb2R1bGVQdWJsaXNoSW5mbyhtb2R1bGUpIAotICAgICAgICAgICAgJiYgZ2V0TW9kdWxlUHVibGlzaEluZm8obW9kdWxlKS5oYXNEZWx0YShtb2R1bGUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNEZWx0YShJTW9kdWxlUmVzb3VyY2VbXSBvcmlnaW5hbCwgSU1vZHVsZVJlc291cmNlW10gY3VycmVudCkgewotCQlpZiAob3JpZ2luYWwgPT0gbnVsbCB8fCBjdXJyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IG9yaWdpbmFsLmxlbmd0aDsKLQkJaW50IHNpemUyID0gY3VycmVudC5sZW5ndGg7Ci0JCQotCQlNYXA8SU1vZHVsZVJlc291cmNlLCBJTW9kdWxlUmVzb3VyY2U+IG9yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXA8SU1vZHVsZVJlc291cmNlLCBJTW9kdWxlUmVzb3VyY2U+KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCW9yaWdpbmFsTWFwLnB1dChvcmlnaW5hbFtpXSwgb3JpZ2luYWxbaV0pOwotCQkKLQkJLy8gYWRkZWQgYW5kIGNoYW5nZWQgcmVzb3VyY2VzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykgewotCQkJSU1vZHVsZVJlc291cmNlIG9sZCA9IG9yaWdpbmFsTWFwLnJlbW92ZShjdXJyZW50W2ldKTsKLQkJCWlmIChvbGQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJaWYgKGN1cnJlbnRbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgewotCQkJCS8vIGluY2x1ZGUgZmlsZXMgb25seSBpZiB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIGhhcyBjaGFuZ2VkCi0JCQkJSU1vZHVsZUZpbGUgbWYxID0gKElNb2R1bGVGaWxlKSBvbGQ7Ci0JCQkJSU1vZHVsZUZpbGUgbWYyID0gKElNb2R1bGVGaWxlKSBjdXJyZW50W2ldOwotCQkJCWlmIChtZjEuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSAhPSBtZjIuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGluY2x1ZGUgZm9sZGVycyBvbmx5IGlmIHRoZWlyIGNvbnRlbnRzIGhhdmUgY2hhbmdlZAotCQkJCUlNb2R1bGVGb2xkZXIgbWYxID0gKElNb2R1bGVGb2xkZXIpIG9sZDsKLQkJCQlJTW9kdWxlRm9sZGVyIG1mMiA9IChJTW9kdWxlRm9sZGVyKSBjdXJyZW50W2ldOwotCQkJCWlmIChoYXNEZWx0YShtZjEubWVtYmVycygpLCBtZjIubWVtYmVycygpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHJlbW92ZWQgcmVzb3VyY2VzCi0JCXJldHVybiAhb3JpZ2luYWxNYXAuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHJlc291cmNlIGRlbHRhIGZvciBhbiBlbnRpcmUgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGdldERlbHRhVHJlZShJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMsIGludCBraW5kKSB7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlRGVsdGFbMF07Ci0JCQotCQlMaXN0PE1vZHVsZVJlc291cmNlRGVsdGE+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZVJlc291cmNlRGVsdGE+KCk7Ci0JCQotCQkvLyBsb29rIGZvciBkdXBsaWNhdGVzCi0JCWludCBzaXplID0gcmVzb3VyY2VzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU1vZHVsZVJlc291cmNlRGVsdGEgbXJkID0gbmV3IE1vZHVsZVJlc291cmNlRGVsdGEocmVzb3VyY2VzW2ldLCBraW5kKTsKLQkJCWlmIChyZXNvdXJjZXNbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7Ci0JCQkJSU1vZHVsZUZvbGRlciBtZiA9IChJTW9kdWxlRm9sZGVyKSByZXNvdXJjZXNbaV07Ci0JCQkJbXJkLnNldENoaWxkcmVuKGdldERlbHRhVHJlZShtZi5tZW1iZXJzKCksIGtpbmQpKTsKLQkJCX0KLQkJCWxpc3QuYWRkKG1yZCk7Ci0JCX0KLQkJCi0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElNb2R1bGVSZXNvdXJjZURlbHRhW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBsaXN0IG9mIG1vZHVsZXMgYmVpbmcgcHVibGlzaGVkIGRvZXMgbm90IG1hdGNoIHRoZSBwcmV2aW91cwotCSAqIGxpc3Qgb2YgcHVibGlzaGVkIG1vZHVsZXMuCi0JICogCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGNvbXBhcmUgdGhlIG1vZHVsZXMuIEZvciBub3csIGNvbXBhcmluZyB0aGUgc2l6ZSBpcyBmaW5lLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGVzIGEgbGlzdCBvZiBtb2R1bGVzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RydWN0dXJlIG9mIHB1Ymxpc2hlZCBtb2R1bGVzIGhhcyBjaGFuZ2VkLCBvcgotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNTdHJ1Y3R1cmVDaGFuZ2VkKExpc3QgbW9kdWxlcykgewotCQlzeW5jaHJvbml6ZWQgKG1vZHVsZVB1Ymxpc2hJbmZvKSB7Ci0JCQlyZXR1cm4gbW9kdWxlcy5zaXplKCkgIT0gbW9kdWxlUHVibGlzaEluZm8ua2V5U2V0KCkuc2l6ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmlsbCB0aGUgbW9kdWxlIGNhY2hlLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0Q2FjaGluZygpIHsKLQkJc3luY2hyb25pemVkIChtb2R1bGVQdWJsaXNoSW5mbykgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IChNb2R1bGVQdWJsaXNoSW5mbykgaXRlcmF0b3IubmV4dCgpOwotCQkJCW1waS5zdGFydENhY2hpbmcoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENsZWFycyBhbGwgY2FjaGVzIG9mIGN1cnJlbnQgbW9kdWxlIHJlc291cmNlcyBhbmQgZGVsdGFzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0JCXN5bmNocm9uaXplZCAobW9kdWxlUHVibGlzaEluZm8pIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlUHVibGlzaEluZm8udmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSAoTW9kdWxlUHVibGlzaEluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQltcGkuY2xlYXJDYWNoZSgpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclNjaGVkdWxpbmdSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJTY2hlZHVsaW5nUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGM3OTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclNjaGVkdWxpbmdSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBTaW1wbGUgam9iIHNjaGVkdWxpbmcgcnVsZSB0aGF0IHN0b3BzIGEgc2VydmVyIGZyb20gc3RhcnRpbmcsCi0gKiBwdWJsaXNoaW5nLCBvciBzdG9wcGluZyBhdCB0aGUgc2FtZSB0aW1lLgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2UgSVNlcnZlciBpbnN0YW5jZSBkaXJlY3RseQotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyU2NoZWR1bGluZ1J1bGUgaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUgewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQotCXB1YmxpYyBTZXJ2ZXJTY2hlZHVsaW5nUnVsZShJU2VydmVyIHNlcnZlcikgewotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlyZXR1cm4gKHJ1bGUgaW5zdGFuY2VvZiBJU2VydmVyIHx8IHJ1bGUgaW5zdGFuY2VvZiBTZXJ2ZXJTY2hlZHVsaW5nUnVsZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlpZiAoIShydWxlIGluc3RhbmNlb2YgSVNlcnZlcikgJiYgIShydWxlIGluc3RhbmNlb2YgU2VydmVyU2NoZWR1bGluZ1J1bGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlJU2VydmVyIHMgPSAoSVNlcnZlcikgcnVsZTsKLQkJCXJldHVybiBzZXJ2ZXIuZXF1YWxzKHMpOwotCQl9Ci0JCQotCQlTZXJ2ZXJTY2hlZHVsaW5nUnVsZSBzc3J1bGUgPSAoU2VydmVyU2NoZWR1bGluZ1J1bGUpIHJ1bGU7Ci0JCXJldHVybiBzc3J1bGUuc2VydmVyLmVxdWFscyhzZXJ2ZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU2VydmVyIHNjaGVkdWxpbmcgcnVsZSBmb3IgIiArIHNlcnZlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWNhODZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclR5cGUgaW1wbGVtZW50cyBJU2VydmVyVHlwZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVElNRU9VVCA9IDEwMDAgKiA2MCAqIDQ7IC8vIDQgbWludXRlcwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJUeXBlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgZmFjdG9yeS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdGFydEJlZm9yZVB1Ymxpc2goKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gInRydWUiLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZSgic3RhcnRCZWZvcmVQdWJsaXNoIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFNlcnZlckRlbGVnYXRlIGNyZWF0ZVNlcnZlckRlbGVnYXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIChTZXJ2ZXJEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIGNyZWF0ZVNlcnZlckJlaGF2aW91ckRlbGVnYXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIChTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJiZWhhdmlvdXJDbGFzcyIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVJ1bnRpbWVUeXBlIGdldFJ1bnRpbWVUeXBlKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHR5cGVJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkIik7Ci0JCQlpZiAodHlwZUlkID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUodHlwZUlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUnVudGltZSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJ1bnRpbWUiKTsKLQkJCXJldHVybiAidHJ1ZSIuZXF1YWxzKHMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIElMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBsYXVuY2hDb25maWdJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJsYXVuY2hDb25maWdJZCIpOwotCQkJaWYgKGxhdW5jaENvbmZpZ0lkID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlJTGF1bmNoTWFuYWdlciBsYXVuY2hNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJCXJldHVybiBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKGxhdW5jaENvbmZpZ0lkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2VydmVyIGNhbiBzdGFydCBvciBtYXkgYWxyZWFkeSBiZSBzdGFydGVkCi0JICogaW4gdGhlIGdpdmVuIG1vZGUsIGFuZCBmYWxzZSBpZiBub3QuIFVzZXMgdGhlIGxhdW5jaE1vZGUgYXR0cmlidXRlLAotCSAqIHdoaWNoIG1heSBjb250YWluIHRoZSBzdHJpbmdzICJydW4iLCAiZGVidWciLCBhbmQvb3IgInByb2ZpbGUiLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIFN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzTGF1bmNoTW9kZShTdHJpbmcgbGF1bmNoTW9kZSkgewotCQl0cnkgewotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIGNvbmZpZ1R5cGUgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZSgpOwotCQkJaWYgKGNvbmZpZ1R5cGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gY29uZmlnVHlwZS5zdXBwb3J0c01vZGUobGF1bmNoTW9kZSk7Ci0JCQkKLQkJCVN0cmluZyBtb2RlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImxhdW5jaE1vZGVzIik7Ci0JCQlpZiAobW9kZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBtb2RlLmluZGV4T2YobGF1bmNoTW9kZSkgPj0gMDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmVtb3RlSG9zdHMoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgaG9zdHMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgic3VwcG9ydHNSZW1vdGVIb3N0cyIpOwotCQkJcmV0dXJuIChob3N0cyAhPSBudWxsICYmIGhvc3RzLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJ0cnVlIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJ5dGUgZ2V0SW5pdGlhbFN0YXRlKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHN0YXRlU3RyaW5nID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImluaXRpYWxTdGF0ZSIpOwotCQkJaWYgKHN0YXRlU3RyaW5nICE9IG51bGwpCi0JCQkJc3RhdGVTdHJpbmcgPSBzdGF0ZVN0cmluZy50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKCJzdG9wcGVkIi5lcXVhbHMoc3RhdGVTdHJpbmcpKQotCQkJCXJldHVybiBJU2VydmVyLlNUQVRFX1NUT1BQRUQ7Ci0JCQllbHNlIGlmICgic3RhcnRlZCIuZXF1YWxzKHN0YXRlU3RyaW5nKSkKLQkJCQlyZXR1cm4gSVNlcnZlci5TVEFURV9TVEFSVEVEOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIElTZXJ2ZXIuU1RBVEVfVU5LTk9XTjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkgewotCQl0cnkgewotCQkJcmV0dXJuICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldEF0dHJpYnV0ZSgiaGFzQ29uZmlndXJhdGlvbiIpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVNlcnZlcihTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTZXJ2ZXJXb3JraW5nQ29weSBzd2MgPSBuZXcgU2VydmVyV29ya2luZ0NvcHkoaWQsIGZpbGUsIHJ1bnRpbWUsIHRoaXMpOwotCQlpZiAoaGFzUnVudGltZSgpKQotCQkJc3djLnNldFJ1bnRpbWUocnVudGltZSk7Ci0JCVNlcnZlclV0aWwuc2V0U2VydmVyRGVmYXVsdE5hbWUoc3djKTsKLQkJc3djLnNldERlZmF1bHRzKG1vbml0b3IpOwotCQkKLQkJaWYgKGhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBydW50aW1lICE9IG51bGwgJiYgcnVudGltZS5nZXRMb2NhdGlvbigpICE9IG51bGwgJiYgIXJ1bnRpbWUuZ2V0TG9jYXRpb24oKS5pc0VtcHR5KCkpCi0JCQlzd2MuaW1wb3J0UnVudGltZUNvbmZpZ3VyYXRpb24ocnVudGltZSwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gc3djOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHJ1bnRpbWUgaW5zdGFuY2VzIG9mCi0JICogdGhlIGdpdmVuIHJ1bnRpbWUgdHlwZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2QgZmlsdGVycyB0aGUgbGlzdCBvZiBrbm93bgotCSAqIHJ1bnRpbWUgKHtAbGluayBTZXJ2ZXJDb3JlI2dldFJ1bnRpbWVzKCl9KSBmb3Igb25lcyB3aXRoIGEgbWF0Y2hpbmcKLQkgKiBydW50aW1lIHR5cGUgKHtAbGluayBJUnVudGltZSNnZXRSdW50aW1lVHlwZSgpfSkuIFRoZSBhcnJheSB3aWxsIG5vdAotCSAqIGNvbnRhaW4gYW55IHdvcmtpbmcgY29waWVzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lVHlwZSB0aGUgcnVudGltZSB0eXBlCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGxpc3Qgb2YgcnVudGltZSBpbnN0YW5jZXMge0BsaW5rIElSdW50aW1lfQotCSAqIG9mIHRoZSBnaXZlbiBydW50aW1lIHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElSdW50aW1lW10gZ2V0UnVudGltZXMoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCUxpc3Q8SVJ1bnRpbWU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lPigpOwotCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lcygpOwotCQlpZiAocnVudGltZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChydW50aW1lc1tpXS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwgJiYgcnVudGltZXNbaV0uZ2V0UnVudGltZVR5cGUoKS5lcXVhbHMocnVudGltZVR5cGUpKQotCQkJCQlsaXN0LmFkZChydW50aW1lc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlSdW50aW1lW10gciA9IG5ldyBJUnVudGltZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBjcmVhdGVTZXJ2ZXIoU3RyaW5nIGlkLCBJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSVJ1bnRpbWUgcnVudGltZSA9IG51bGw7Ci0JCWlmIChoYXNSdW50aW1lKCkpIHsKLQkJCS8vIGxvb2sgZm9yIGV4aXN0aW5nIHJ1bnRpbWUKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IGdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gZ2V0UnVudGltZXMocnVudGltZVR5cGUpOwotCQkJaWYgKHJ1bnRpbWVzICE9IG51bGwgJiYgcnVudGltZXMubGVuZ3RoID4gMCkKLQkJCQlydW50aW1lID0gcnVudGltZXNbMF07Ci0JCQllbHNlIHsKLQkJCQkvLyBjcmVhdGUgcnVudGltZQotCQkJCXRyeSB7Ci0JCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdDID0gcnVudGltZVR5cGUuY3JlYXRlUnVudGltZShpZCwgbW9uaXRvcik7Ci0JCQkJCVNlcnZlclV0aWwuc2V0UnVudGltZURlZmF1bHROYW1lKHJ1bnRpbWVXQyk7Ci0JCQkJCXJ1bnRpbWUgPSBydW50aW1lV0M7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGRuJ3QgY3JlYXRlIHJ1bnRpbWUiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IG5ldyBTZXJ2ZXJXb3JraW5nQ29weShpZCwgZmlsZSwgcnVudGltZSwgdGhpcyk7Ci0JCWlmIChydW50aW1lICE9IG51bGwpCi0JCQlzd2Muc2V0UnVudGltZShydW50aW1lKTsKLQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZShzd2MpOwotCQkKLQkJc3djLnNldERlZmF1bHRzKG1vbml0b3IpOwotCQlpZiAoc3djLmdldFNlcnZlclR5cGUoKS5oYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkpCi0JCQlzd2MuaW1wb3J0UnVudGltZUNvbmZpZ3VyYXRpb24ocnVudGltZSwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gc3djOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFNlcnZlclByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHByb2plY3RzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKFNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0c1tpXSkuaXNTZXJ2ZXJQcm9qZWN0KCkpCi0JCQkJCXJldHVybiBwcm9qZWN0c1tpXTsKLQkJCX0KLQkJfQotCQkKLQkJU3RyaW5nIHMgPSBmaW5kVW51c2VkU2VydmVyUHJvamVjdE5hbWUoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChzKTsKLQkJcHJvamVjdC5jcmVhdGUobnVsbCk7Ci0JCXByb2plY3Qub3BlbihudWxsKTsKLQkJU2VydmVyUGx1Z2luLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLnNldFNlcnZlclByb2plY3QodHJ1ZSwgbnVsbCk7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIEZpbmRzIGFuIHVudXNlZCBwcm9qZWN0IG5hbWUgdG8gdXNlIGFzIGEgc2VydmVyIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZmluZFVudXNlZFNlcnZlclByb2plY3ROYW1lKCkgewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJU3RyaW5nIG5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5kZWZhdWx0U2VydmVyUHJvamVjdE5hbWUsICIiKS50cmltKCk7Ci0JCWludCBjb3VudCA9IDE7Ci0JCXdoaWxlIChyb290LmdldFByb2plY3QobmFtZSkuZXhpc3RzKCkpIHsKLQkJCW5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5kZWZhdWx0U2VydmVyUHJvamVjdE5hbWUsICsrY291bnQgKyAiIikudHJpbSgpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGltZW91dCAoaW4gbXMpIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhlIHNlcnZlciB0byBzdGFydC4KLQkgKiBUaGUgZGVmYXVsdCBpcyAyIG1pbnV0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIHN0YXJ0dXAgdGltZW91dAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRUaW1lb3V0KCkgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInN0YXJ0VGltZW91dCIpKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBERUZBVUxUX1RJTUVPVVQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0aW1lb3V0IChpbiBtcykgdG8gd2FpdCBiZWZvcmUgYXNzdW1pbmcgdGhhdCB0aGUgc2VydmVyCi0JICogaGFzIGZhaWxlZCB0byBzdG9wLiBUaGUgZGVmYXVsdCBpcyAyIG1pbnV0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIHNodXRkb3duIHRpbWVvdXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0b3BUaW1lb3V0KCkgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInN0b3BUaW1lb3V0IikpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIERFRkFVTFRfVElNRU9VVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQllbGVtZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2ZXJUeXBlWyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwYzE0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJXb3JraW5nQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkludGVybmFsSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJXb3JraW5nQ29weSBleHRlbmRzIFNlcnZlciBpbXBsZW1lbnRzIElTZXJ2ZXJXb3JraW5nQ29weSB7Ci0JcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIFdvcmtpbmdDb3B5SGVscGVyIHdjaDsKLQotCXByb3RlY3RlZCBTZXJ2ZXJEZWxlZ2F0ZSB3b3JraW5nQ29weURlbGVnYXRlOwotCi0JLy8gd29ya2luZyBjb3B5Ci0JcHVibGljIFNlcnZlcldvcmtpbmdDb3B5KFNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIoc2VydmVyLmdldEZpbGUoKSk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQkKLQkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHNlcnZlci5tYXApOwotCQl3Y2ggPSBuZXcgV29ya2luZ0NvcHlIZWxwZXIodGhpcyk7Ci0JCQotCQlyZXNvbHZlKCk7Ci0JfQotCi0JLy8gY3JlYXRpb24KLQlwdWJsaWMgU2VydmVyV29ya2luZ0NvcHkoU3RyaW5nIGlkLCBJRmlsZSBmaWxlLCBJUnVudGltZSBydW50aW1lLCBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7Ci0JCXN1cGVyKGlkLCBmaWxlLCBydW50aW1lLCBzZXJ2ZXJUeXBlKTsKLQkJd2NoID0gbmV3IFdvcmtpbmdDb3B5SGVscGVyKHRoaXMpOwotCQl3Y2guc2V0RGlydHkodHJ1ZSk7Ci0JCXNlcnZlclN0YXRlID0gKChTZXJ2ZXJUeXBlKXNlcnZlclR5cGUpLmdldEluaXRpYWxTdGF0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJU2VydmVyIGdldE9yaWdpbmFsKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgY3JlYXRlV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2VydmVyU3RhdGUoKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKLQkJcmV0dXJuIHN1cGVyLmdldFNlcnZlclN0YXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyU3RhdGUoaW50IHN0YXRlKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5zZXRTZXJ2ZXJTdGF0ZShzdGF0ZSk7Ci0JCWVsc2UKLQkJCXN1cGVyLnNldFNlcnZlclN0YXRlKHN0YXRlKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNlcnZlclB1Ymxpc2hTdGF0ZSgpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5nZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKTsKLQkJcmV0dXJuIHN1cGVyLmdldFNlcnZlclB1Ymxpc2hTdGF0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZlclB1Ymxpc2hTdGF0ZShpbnQgc3RhdGUpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLnNldFNlcnZlclB1Ymxpc2hTdGF0ZShzdGF0ZSk7Ci0JCWVsc2UKLQkJCXN1cGVyLnNldFNlcnZlclB1Ymxpc2hTdGF0ZShzdGF0ZSk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U2VydmVyU3RhdHVzKCkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVyLmdldFNlcnZlclN0YXR1cygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0U2VydmVyU3RhdHVzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5zZXRTZXJ2ZXJTdGF0dXMoc3RhdHVzKTsKLQkJZWxzZQotCQkJc3VwZXIuc2V0U2VydmVyU3RhdHVzKHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRNb2R1bGVTdGF0ZShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKTsKLQkJcmV0dXJuIHN1cGVyLmdldE1vZHVsZVN0YXRlKG1vZHVsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlU3RhdGUoSU1vZHVsZVtdIG1vZHVsZSwgaW50IHN0YXRlKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5zZXRNb2R1bGVTdGF0ZShtb2R1bGUsIHN0YXRlKTsKLQkJZWxzZQotCQkJc3VwZXIuc2V0TW9kdWxlU3RhdGUobW9kdWxlLCBzdGF0ZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRNb2R1bGVQdWJsaXNoU3RhdGUoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVyLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlUHVibGlzaFN0YXRlKElNb2R1bGVbXSBtb2R1bGUsIGludCBzdGF0ZSkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIuc2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSwgc3RhdGUpOwotCQllbHNlCi0JCQlzdXBlci5zZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlLCBzdGF0ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0TW9kdWxlUmVzdGFydFN0YXRlKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5nZXRNb2R1bGVSZXN0YXJ0U3RhdGUobW9kdWxlKTsKLQkJcmV0dXJuIHN1cGVyLmdldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVJlc3RhcnRTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBib29sZWFuIHIpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLnNldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUsIHIpOwotCQllbHNlCi0JCQlzdXBlci5zZXRNb2R1bGVSZXN0YXJ0U3RhdGUobW9kdWxlLCByKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRNb2R1bGVTdGF0dXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlyZXR1cm4gc2VydmVyLmdldE1vZHVsZVN0YXR1cyhtb2R1bGUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0TW9kdWxlU3RhdHVzKG1vZHVsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlU3RhdHVzKElNb2R1bGVbXSBtb2R1bGUsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5zZXRNb2R1bGVTdGF0dXMobW9kdWxlLCBzdGF0dXMpOwotCQllbHNlCi0JCQlzdXBlci5zZXRNb2R1bGVTdGF0dXMobW9kdWxlLCBzdGF0dXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kZSgpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5nZXRNb2RlKCk7Ci0JCXJldHVybiBtb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGUoU3RyaW5nIG1vZGUpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLnNldE1vZGUobW9kZSk7Ci0JCWVsc2UKLQkJCXN1cGVyLnNldE1vZGUobW9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgdmFsdWUpIHsKLQkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdDxTdHJpbmc+IHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTWFwIHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHkjc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BfTkFNRSwgbmFtZSk7Ci0JCWJvb2xlYW4gc2V0ID0gZ2V0QXR0cmlidXRlKFBST1BfSURfU0VULCBmYWxzZSk7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCAmJiAhc2V0KQotCQkJc2V0QXR0cmlidXRlKFBST1BfSUQsIG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gYikgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9MT0NLRUQsIGIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGlzIGVsZW1lbnQgaXMgcHJpdmF0ZS4KLQkgKiBHZW5lcmFsbHkgc3BlYWtpbmcsIGVsZW1lbnRzIG1hcmtlZCBwcml2YXRlIGFyZSBpbnRlcm5hbCBvbmVzCi0JICogdGhhdCBzaG91bGQgbm90IGJlIHNob3duIHRvIHVzZXJzIChiZWNhdXNlIHRoZXkgd29uJ3Qga25vdwotCSAqIGFueXRoaW5nIGFib3V0IHRoZW0pLgotCSAqIAotCSAqIEBwYXJhbSBiIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBpcyBwcml2YXRlLAotCSAqIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNlZSAjaXNQcml2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcml2YXRlKGJvb2xlYW4gYikgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9QUklWQVRFLCBiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX0hPU1ROQU1FLCBob3N0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaFRpbWUoaW50IHApIHsKLQkJc2V0QXR0cmlidXRlKFBST1BfQVVUT19QVUJMSVNIX1RJTUUsIHApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0VGltZW91dChpbnQgcCkgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9TVEFSVF9USU1FT1VULCBwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdG9wVGltZW91dChpbnQgcCkgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9TVE9QX1RJTUVPVVQsIHApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF1dG9QdWJsaXNoU2V0dGluZyhpbnQgcykgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9BVVRPX1BVQkxJU0hfU0VUVElORywgcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyQ29uZmlndXJhdGlvbihJRm9sZGVyIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JCWlmIChjb25maWd1cmF0aW9uID09IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoQ09ORklHVVJBVElPTl9JRCwgKFN0cmluZyludWxsKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKENPTkZJR1VSQVRJT05fSUQsIGNvbmZpZ3VyYXRpb24uZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNhYmxlIHRoZSBwcmVmZXJyZWQgcHVibGlzaCBvcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG9wIGEgcHVibGlzaCBvcGVyYXRpb24KLQkgKiBAcmV0dXJuIHRydWUgaWYgY2hhbmdlIGlzIG1hZGUuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVQcmVmZXJyZWRQdWJsaXNoT3BlcmF0aW9ucyhQdWJsaXNoT3BlcmF0aW9uIG9wKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gZ2V0QXR0cmlidXRlKFBST1BfRElTQUJMRURfUEVSRkVSUkVEX1RBU0tTLCAoTGlzdDxTdHJpbmc+KW51bGwpOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJU3RyaW5nIG9wSWQgPSBnZXRQdWJsaXNoT3BlcmF0aW9uSWQob3ApOwotCQlpZiAobGlzdC5jb250YWlucyhvcElkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJbGlzdC5hZGQob3BJZCk7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX0RJU0FCTEVEX1BFUkZFUlJFRF9UQVNLUywgbGlzdCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZSB0aGUgb3B0aW9uYWwgcHVibGlzaCBvcGVyYXRpb24uIE9wdGlvbmFsIHB1Ymxpc2ggb3BlcmF0aW9uIGlzIG5vdCByYW4gYnkgZGVmYXVsdC4KLQkgKiAKLQkgKiBAcGFyYW0gb3AgYSBwdWJsaXNoIG9wZXJhdGlvbgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjaGFuZ2UgaXMgbWFkZS4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gZW5hYmxlT3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9ucyhQdWJsaXNoT3BlcmF0aW9uIG9wKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gZ2V0QXR0cmlidXRlKFBST1BfRU5BQkxFRF9PUFRJT05BTF9UQVNLUywgKExpc3Q8U3RyaW5nPiludWxsKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCVN0cmluZyBvcElkID0gZ2V0UHVibGlzaE9wZXJhdGlvbklkKG9wKTsKLQkJaWYgKGxpc3QuY29udGFpbnMob3BJZCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWxpc3QuYWRkKG9wSWQpOwotCQlzZXRBdHRyaWJ1dGUoUFJPUF9FTkFCTEVEX09QVElPTkFMX1RBU0tTLCBsaXN0KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgYWxsIHByZWZlcnJlZCBvcGVyYXRpb25zIHRvIGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFByZWZlcnJlZFB1Ymxpc2hPcGVyYXRpb25zKCkgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9ESVNBQkxFRF9QRVJGRVJSRURfVEFTS1MsIChMaXN0PFN0cmluZz4pbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgYWxsIG9wdGlvbmFsIG9wZXJhdGlvbnMgdG8gZGVmYXVsdAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0T3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9ucygpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BfRU5BQkxFRF9PUFRJT05BTF9UQVNLUywgKExpc3Q8U3RyaW5nPiludWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoZXJFbmFibGVkKFB1Ymxpc2hlciBwdWIsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAocHViID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBjb3B5IG92ZXIgYWxsIGVsZW1lbnRzIGV4Y2VwdCB0aGUgdXBkYXRlZCBwdWJsaXNoZXIKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBnZXRBdHRyaWJ1dGUoUFJPUF9QVUJMSVNIRVJTLCBFTVBUWV9MSVNUKTsKLQkJTGlzdDxTdHJpbmc+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBpZCA9IGl0ZXIubmV4dCgpOwotCQkJaW50IGluZCA9IGlkLmluZGV4T2YoIjoiKTsKLQkJCWlmICghcHViLmdldElkKCkuZXF1YWxzKGlkLnN1YnN0cmluZygwLCBpbmQpKSkKLQkJCQluZXdMaXN0LmFkZChpZCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBzID0gcHViLmdldElkKCkgKyAiOiI7Ci0JCWlmIChlbmFibGVkKQotCQkJcyArPSAidHJ1ZSI7Ci0JCWVsc2UKLQkJCXMgKz0gImZhbHNlIjsKLQkJbmV3TGlzdC5hZGQocyk7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX1BVQkxJU0hFUlMsIG5ld0xpc3QpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpbGUgd2hlcmUgdGhpcyBzZXJ2ZXIgaW5zdGFuY2UgaXMgc2VyaWFsaXplZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBpbiB0aGUgd29ya3NwYWNlIHdoZXJlIHRoZSBzZXJ2ZXIgaW5zdGFuY2UKLQkgKiAgICBpcyBzZXJpYWxpemVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5mb3JtYXRpb24gaXMKLQkgKiAgICBpbnN0ZWFkIHRvIGJlIHBlcnNpc3RlZCB3aXRoIHRoZSB3b3Jrc3BhY2UgYnV0IG5vdCB3aXRoIGFueQotCSAqICAgIHBhcnRpY3VsYXIgd29ya3NwYWNlIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsZShJRmlsZSBmaWxlKSB7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weSNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gd2NoLmlzRGlydHkoKTsKLQl9Ci0KLQlwdWJsaWMgU2VydmVyRGVsZWdhdGUgZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlZ3VsYXIgZGVsZWdhdGUgaXMgbG9hZGVkIAotCQkvL2dldERlbGVnYXRlKCk7Ci0JCQotCQlpZiAod29ya2luZ0NvcHlEZWxlZ2F0ZSAhPSBudWxsIHx8IHNlcnZlclR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiB3b3JraW5nQ29weURlbGVnYXRlOwotCQkKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAod29ya2luZ0NvcHlEZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCXdvcmtpbmdDb3B5RGVsZWdhdGUgPSAoKFNlcnZlclR5cGUpIHNlcnZlclR5cGUpLmNyZWF0ZVNlcnZlckRlbGVnYXRlKCk7Ci0JCQkJCUludGVybmFsSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZVNlcnZlckRlbGVnYXRlKHdvcmtpbmdDb3B5RGVsZWdhdGUsIHRoaXMsIG1vbml0b3IpOwotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QRVJGT1JNQU5DRSwgIlNlcnZlcldvcmtpbmdDb3B5LmdldFdvcmtpbmdDb3B5RGVsZWdhdGUoKTogPCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICI+ICIgKyBnZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3b3JraW5nQ29weURlbGVnYXRlOwotCX0KLQotCXByb3RlY3RlZCBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSBnZXRCZWhhdmlvdXJEZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCkKLQkJCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZTsKLQkJCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKGJlaGF2aW91ckRlbGVnYXRlID09IG51bGwpCi0JCQkJYmVoYXZpb3VyRGVsZWdhdGUgPSBzZXJ2ZXIuZ2V0QmVoYXZpb3VyRGVsZWdhdGUobW9uaXRvcik7Ci0JCX0KLQkJcmV0dXJuIGJlaGF2aW91ckRlbGVnYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGJlaGF2aW91ciBkZWxlZ2F0ZSBpcyBjYWNoZWQgZnJvbSB0aGUgb3JpZ2luYWwgc2VydmVyCi0JCWJlaGF2aW91ckRlbGVnYXRlID0gbnVsbDsKLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHdvcmtpbmdDb3B5RGVsZWdhdGUgIT0gbnVsbCkKLQkJCXdvcmtpbmdDb3B5RGVsZWdhdGUuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBJU2VydmVyIHNhdmUoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIGdldE5hbWUoKSkpOwotCQkKLQkJaWYgKCFmb3JjZSAmJiBnZXRPcmlnaW5hbCgpICE9IG51bGwpCi0JCQl3Y2gudmFsaWRhdGVUaW1lc3RhbXAoKChTZXJ2ZXIpZ2V0T3JpZ2luYWwoKSkuZ2V0VGltZXN0YW1wKCkpOwotCQkKLQkJaW50IHRpbWVzdGFtcCA9IGdldFRpbWVzdGFtcCgpOwotCQltYXAucHV0KFBST1BfVElNRVNUQU1QLCBJbnRlZ2VyLnRvU3RyaW5nKHRpbWVzdGFtcCsxKSk7Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCXNlcnZlciA9IG5ldyBTZXJ2ZXIoZmlsZSk7Ci0JCQlzZXJ2ZXIuc2V0U2VydmVyU3RhdGUoc2VydmVyU3RhdGUpOwotCQkJc2VydmVyLnB1Ymxpc2hMaXN0ZW5lcnMgPSBwdWJsaXNoTGlzdGVuZXJzOwotCQkJc2VydmVyLm5vdGlmaWNhdGlvbk1hbmFnZXIgPSBub3RpZmljYXRpb25NYW5hZ2VyOwotCQl9Ci0JCQotCQlpZiAoZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkgewotCQkJSUZvbGRlciBmb2xkZXIgPSBnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoZm9sZGVyID09IG51bGwpIHsKLQkJCQlmb2xkZXIgPSBTZXJ2ZXJUeXBlLmdldFNlcnZlclByb2plY3QoKS5nZXRGb2xkZXIoZ2V0TmFtZSgpICsgIi1jb25maWciKTsKLQkJCQlpZiAoIWZvbGRlci5leGlzdHMoKSkKLQkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQlzZXRTZXJ2ZXJDb25maWd1cmF0aW9uKGZvbGRlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXNlcnZlci5zZXRJbnRlcm5hbCh0aGlzKTsKLQkJc2VydmVyLmRvU2F2ZShtb25pdG9yKTsKLQkJaWYgKGdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIGdldFNlcnZlclR5cGUoKS5oYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkpIHsKLQkJCUlGb2xkZXIgZm9sZGVyID0gZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGZvbGRlciAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGZvbGRlci5nZXRQcm9qZWN0KCk7Ci0JCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhcHJvamVjdC5leGlzdHMoKSkgewotCQkJCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkJCQkJcHJvamVjdC5vcGVuKG51bGwpOwotCQkJCQlTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuc2V0U2VydmVyUHJvamVjdCh0cnVlLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpCi0JCQkJCWZvbGRlci5jcmVhdGUoSVJlc291cmNlLkZPUkNFLCB0cnVlLCBudWxsKTsKLQkJCX0KLQkJfQotCQlpZiAoZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZShtb25pdG9yKSAhPSBudWxsKQotCQkJZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZShtb25pdG9yKS5zYXZlQ29uZmlndXJhdGlvbihtb25pdG9yKTsKLQkJd2NoLnNldERpcnR5KGZhbHNlKTsKLQkJCi0JCXJldHVybiBzZXJ2ZXI7Ci0JfQotCi0JcHVibGljIElTZXJ2ZXIgc2F2ZUFsbChib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBydW50aW1lLmlzV29ya2luZ0NvcHkoKSkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lOwotCQkJd2Muc2F2ZShmb3JjZSwgbW9uaXRvcik7Ci0JCX0KLQkJCi0JCXJldHVybiBzYXZlKGZvcmNlLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJd2NoLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIHNlcnZlci4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciBjYW5ub3QgYmUgbnVsbCIpOwotCQl3Y2gucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHByb3BlcnR5IGNoYW5nZSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIGEgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl3Y2guZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNlcnZlckxpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIuYWRkU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQllbHNlCi0JCQlzdXBlci5hZGRTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VydmVyTGlzdGVuZXIoSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWVsc2UKLQkJCXN1cGVyLnJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQdWJsaXNoTGlzdGVuZXIoSVB1Ymxpc2hMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIuYWRkUHVibGlzaExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJZWxzZQotCQkJc3VwZXIuYWRkUHVibGlzaExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQdWJsaXNoTGlzdGVuZXIoSVB1Ymxpc2hMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIucmVtb3ZlUHVibGlzaExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJZWxzZQotCQkJc3VwZXIucmVtb3ZlUHVibGlzaExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkKLQkJCXNldEF0dHJpYnV0ZShSVU5USU1FX0lELCBydW50aW1lLmdldElkKCkpOwotCQllbHNlCi0JCQlzZXRBdHRyaWJ1dGUoUlVOVElNRV9JRCwgKFN0cmluZyludWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSdW50aW1lSWQoU3RyaW5nIHJ1bnRpbWVJZCkgewotCQlzZXRBdHRyaWJ1dGUoUlVOVElNRV9JRCwgcnVudGltZUlkKTsKLQkJcmVzb2x2ZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyI21vZGlmeU1vZHVsZShvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBudWxsIGNoZWNrcyBhcmUgaW4gY2FuTW9kaWZ5TW9kdWxlcwotCQlJU3RhdHVzIHN0YXR1cyA9IGNhbk1vZGlmeU1vZHVsZXMoYWRkLCByZW1vdmUsIG1vbml0b3IpOwotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLnRhc2tNb2RpZnlNb2R1bGVzKTsKLQkJCWdldFdvcmtpbmdDb3B5RGVsZWdhdGUobW9uaXRvcikubW9kaWZ5TW9kdWxlcyhhZGQsIHJlbW92ZSwgbW9uaXRvcik7Ci0JCQl3Y2guc2V0RGlydHkodHJ1ZSk7Ci0JCQkKLQkJCS8vIHRyaWdnZXIgbG9hZCBvZiBtb2R1bGVzIGxpc3QKLQkJCWdldE1vZHVsZXMoKTsKLQkJCQotCQkJaWYgKGFkZCAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBhZGQubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCWlmICghbW9kdWxlcy5jb250YWlucyhhZGRbaV0pKSB7Ci0JCQkJCQltb2R1bGVzLmFkZChhZGRbaV0pOwotCQkJCQkJcmVzZXRTdGF0ZShuZXcgSU1vZHVsZVtdIHsgYWRkW2ldIH0sIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAocmVtb3ZlICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IHJlbW92ZS5sZW5ndGg7Ci0JCQkJZXh0ZXJuYWxNb2R1bGVzID0gZ2V0RXh0ZXJuYWxNb2R1bGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJaWYgKG1vZHVsZXMuY29udGFpbnMocmVtb3ZlW2ldKSkgewotCQkJCQkJbW9kdWxlcy5yZW1vdmUocmVtb3ZlW2ldKTsKLQkJCQkJCXJlc2V0U3RhdGUobmV3IElNb2R1bGVbXSB7IHJlbW92ZVtpXSB9LCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCQlpZiAoZXh0ZXJuYWxNb2R1bGVzICE9IG51bGwgJiYgZXh0ZXJuYWxNb2R1bGVzLmNvbnRhaW5zKHJlbW92ZVtpXSkpIHsKLQkJCQkJCWV4dGVybmFsTW9kdWxlcy5yZW1vdmUocmVtb3ZlW2ldKTsKLQkJCQkJCXJlc2V0U3RhdGUobmV3IElNb2R1bGVbXSB7IHJlbW92ZVtpXSB9LCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gY29udmVydCB0byBhdHRyaWJ1dGUKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihtb2R1bGUuZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIjo6Iik7Ci0JCQkJc2IuYXBwZW5kKG1vZHVsZS5nZXRJZCgpKTsKLQkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQkJaWYgKG10ICE9IG51bGwpIHsKLQkJCQkJc2IuYXBwZW5kKCI6OiIpOwotCQkJCQlzYi5hcHBlbmQobXQuZ2V0SWQoKSk7Ci0JCQkJCXNiLmFwcGVuZCgiOjoiKTsKLQkJCQkJc2IuYXBwZW5kKG10LmdldFZlcnNpb24oKSk7Ci0JCQkJfQotCQkJCWxpc3QuYWRkKHNiLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJc2V0QXR0cmlidXRlKE1PRFVMRV9MSVNULCBsaXN0KTsKLQkJCXJlc2V0T3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9ucygpOwotCQkJcmVzZXRQcmVmZXJyZWRQdWJsaXNoT3BlcmF0aW9ucygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl0aHJvdyBjZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgbW9kaWZ5TW9kdWxlKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCAiIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldFN0YXRlKElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlLCBQVUJMSVNIX1NUQVRFX1VOS05PV04pOwotCQlzZXRNb2R1bGVTdGF0ZShtb2R1bGUsIElTZXJ2ZXIuU1RBVEVfVU5LTk9XTik7Ci0JCXNldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUsIGZhbHNlKTsKLQkJc2V0TW9kdWxlU3RhdHVzKG1vZHVsZSwgbnVsbCk7Ci0JCXRyeSB7Ci0JCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBnZXRDaGlsZE1vZHVsZXMobW9kdWxlLCBtb25pdG9yKTsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJaW50IHNpemUyID0gbW9kdWxlLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSU1vZHVsZVtdIGNoaWxkID0gbmV3IE1vZHVsZVtzaXplMiArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobW9kdWxlLCAwLCBjaGlsZCwgMCwgc2l6ZTIpOwotCQkJCWNoaWxkW3NpemUyXSA9IGNoaWxkcmVuW2ldOwotCQkJCXJlc2V0UHVibGlzaFN0YXRlKGNoaWxkLCBtb25pdG9yKTsKLQkJCQlzZXRNb2R1bGVTdGF0ZShtb2R1bGUsIElTZXJ2ZXIuU1RBVEVfVU5LTk9XTik7Ci0JCQkJc2V0TW9kdWxlUmVzdGFydFN0YXRlKG1vZHVsZSwgZmFsc2UpOwotCQkJCXNldE1vZHVsZVN0YXR1cyhtb2R1bGUsIG51bGwpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAZGVwcmVjYXRlZCB1c2UgcmVzZXRTdGF0ZSgpIGluc3RlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldFB1Ymxpc2hTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSwgUFVCTElTSF9TVEFURV9VTktOT1dOKTsKLQkJdHJ5IHsKLQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IGdldENoaWxkTW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlpbnQgc2l6ZTIgPSBtb2R1bGUubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJTW9kdWxlW10gY2hpbGQgPSBuZXcgTW9kdWxlW3NpemUyICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShtb2R1bGUsIDAsIGNoaWxkLCAwLCBzaXplMik7Ci0JCQkJY2hpbGRbc2l6ZTJdID0gY2hpbGRyZW5baV07Ci0JCQkJcmVzZXRQdWJsaXNoU3RhdGUoY2hpbGQsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWdldFdvcmtpbmdDb3B5RGVsZWdhdGUobW9uaXRvcikuc2V0RGVmYXVsdHMobW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHNldERlZmF1bHRzKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVuYW1lRmlsZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkgewotCQkJSUZvbGRlciBmb2xkZXIgPSBnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlJRm9sZGVyIGZvbGRlcjIgPSBTZXJ2ZXJUeXBlLmdldFNlcnZlclByb2plY3QoKS5nZXRGb2xkZXIoZ2V0TmFtZSgpICsgIi1jb25maWciKTsKLQkJCWZvbGRlci5tb3ZlKGZvbGRlcjIuZ2V0RnVsbFBhdGgoKSwgdHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7Ci0JCQlzZXRTZXJ2ZXJDb25maWd1cmF0aW9uKGZvbGRlcjIpOwotCQkJc2F2ZSh0cnVlLCBtb25pdG9yKTsKLQkJfQotCQkKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZTIgPSBTZXJ2ZXJVdGlsLmdldFVudXNlZFNlcnZlckZpbGUoZmlsZS5nZXRQcm9qZWN0KCksIHRoaXMpOwotCQkJZmlsZS5tb3ZlKGZpbGUyLmdldEZ1bGxQYXRoKCksIHRydWUsIHRydWUsIG1vbml0b3IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBQdWJsaXNoIHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIHByb2dyZXNzIG1vbml0b3IuIFRoZSByZXN1bHQgb2YgdGhlCi0JICogcHVibGlzaCBvcGVyYXRpb24gaXMgcmV0dXJuZWQgYXMgYW4gSVN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwdWJsaXNoKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5wdWJsaXNoKGtpbmQsIG1vbml0b3IpOwotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hpbmcsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHB1Ymxpc2goaW50IGtpbmQsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVzMiwgSUFkYXB0YWJsZSBpbmZvLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlzZXJ2ZXIucHVibGlzaChraW5kLCBtb2R1bGVzMiwgaW5mbywgbGlzdGVuZXIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWxpc3RlbmVyLmRvbmUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hpbmcsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgSUxhdW5jaCBnZXRMYXVuY2goKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXIuZ2V0TGF1bmNoKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGJvb2xlYW4gY3JlYXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5nZXRMYXVuY2hDb25maWd1cmF0aW9uKGNyZWF0ZSwgbW9uaXRvcik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlcnZlciByZXN0YXJ0IHN0YXRlLgotCSAqCi0JICogQHBhcmFtIHN0YXRlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIuc2V0U2VydmVyUmVzdGFydFN0YXRlKHN0YXRlKTsKLQkJZWxzZQotCQkJc3VwZXIuc2V0U2VydmVyUmVzdGFydFN0YXRlKHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXIjZ2V0QWRhcHRlcihDbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAod29ya2luZ0NvcHlEZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKHdvcmtpbmdDb3B5RGVsZWdhdGUpKQotCQkJCXJldHVybiB3b3JraW5nQ29weURlbGVnYXRlOwotCQl9Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGRlbGVnYXRlKSkKLQkJCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCX0KLQkJaWYgKGJlaGF2aW91ckRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoYmVoYXZpb3VyRGVsZWdhdGUpKQotCQkJCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZTsKLQkJfQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlciNsb2FkQWRhcHRlcihDbGFzcywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGxvYWRBZGFwdGVyKENsYXNzIGFkYXB0ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlnZXRXb3JraW5nQ29weURlbGVnYXRlKG1vbml0b3IpOwotCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKHdvcmtpbmdDb3B5RGVsZWdhdGUpKQotCQkJcmV0dXJuIHdvcmtpbmdDb3B5RGVsZWdhdGU7Ci0JCQotCQlnZXREZWxlZ2F0ZShtb25pdG9yKTsKLQkJaWYgKGFkYXB0ZXIuaXNJbnN0YW5jZShkZWxlZ2F0ZSkpCi0JCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCQotCQlnZXRCZWhhdmlvdXJEZWxlZ2F0ZShtb25pdG9yKTsKLQkJaWYgKGFkYXB0ZXIuaXNJbnN0YW5jZShiZWhhdmlvdXJEZWxlZ2F0ZSkpCi0JCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGU7Ci0JCQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlcih0aGlzLCBhZGFwdGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogSW1wb3J0IHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBnaXZlbiBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lMgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQGRlcHJlY2F0ZWQgc2hvdWxkIHVzZSBpbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbigpIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRDb25maWd1cmF0aW9uKElSdW50aW1lIHJ1bnRpbWUyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWdldFdvcmtpbmdDb3B5RGVsZWdhdGUobW9uaXRvcikuaW1wb3J0Q29uZmlndXJhdGlvbihydW50aW1lMiwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIGltcG9ydENvbmZpZ3VyYXRpb24oKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbXBvcnQgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZyb20gdGhlIGdpdmVuIHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUyIGEgc2VydmVyIHJ1bnRpbWUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFueSBwcm9ibGVtIGltcG9ydGluZyB0aGUgY29uZmlndXJhdGlvbgotCSAqICAgIGZyb20gdGhlIHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbihJUnVudGltZSBydW50aW1lMiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlnZXRXb3JraW5nQ29weURlbGVnYXRlKG1vbml0b3IpLmltcG9ydFJ1bnRpbWVDb25maWd1cmF0aW9uKHJ1bnRpbWUyLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ29yZUV4Y2VwdGlvbiBjYWxsaW5nIGRlbGVnYXRlIGltcG9ydENvbmZpZ3VyYXRpb24oKSAiICsgdG9TdHJpbmcoKSwgY2UpOwotCQkJdGhyb3cgY2U7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIGltcG9ydENvbmZpZ3VyYXRpb24oKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZXMpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLnNldEV4dGVybmFsTW9kdWxlcyhtb2R1bGVzKTsKLQkJc3VwZXIuc2V0RXh0ZXJuYWxNb2R1bGVzKG1vZHVsZXMpOwotCX0KLQotCXB1YmxpYyBMaXN0PElNb2R1bGU+IGdldEV4dGVybmFsTW9kdWxlcygpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5nZXRFeHRlcm5hbE1vZHVsZXMoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEV4dGVybmFsTW9kdWxlcygpOwotCX0KLQotCS8qCi0JICogQnJlYWsgY29ubmVjdGlvbiB3aXRoIHRoZSBvcmlnaW5hbCBzZXJ2ZXIgc28gdGhhdCB0aGlzIHdvcmtpbmcgY29weSBjYW4KLQkgKiBiZSBkdXBsaWNhdGVkLiBUaGUgbmFtZSAqbXVzdCogYmUgc2V0IGFmdGVyd2FyZHMgdG8gY2hhbmdlIHRoZSBpZC4gCi0JICovCi0JcHVibGljIHZvaWQgZGlzYXNzb2NpYXRlKCkgewotCQlzZXJ2ZXIgPSBudWxsOwotCQlpZiAoZ2V0QXR0cmlidXRlKFBST1BfTE9DS0VELCBmYWxzZSkpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9MT0NLRUQsIGZhbHNlKTsKLQkJaWYgKGdldEF0dHJpYnV0ZShQUk9QX0lEX1NFVCwgZmFsc2UpKQotCQkJc2V0QXR0cmlidXRlKFBST1BfSURfU0VULCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2ZXJXb3JraW5nQ29weSAiICsgZ2V0SWQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU3RhcnRTZXJ2ZXJKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1N0YXJ0U2VydmVySm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMTIwZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU3RhcnRTZXJ2ZXJKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBBIGpvYiBmb3Igc3RhcnRpbmcgdGhlIHNlcnZlci4KLSAqIAotICogQGRlcHJlY2F0ZWQgLSB1c2UgQVBJIGRpcmVjdGx5LCBpdCB3aWxsIGtpY2sgb2ZmIGpvYnMgYXMgcmVxdWlyZWQKLSAqLwotcHVibGljIGNsYXNzIFN0YXJ0U2VydmVySm9iIGV4dGVuZHMgQ2hhaW5lZEpvYiB7Ci0JcHJvdGVjdGVkIFN0cmluZyBsYXVuY2hNb2RlOwotCi0JcHVibGljIFN0YXJ0U2VydmVySm9iKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5qb2JTdGFydGluZ1NlcnZlciwgc2VydmVyLmdldE5hbWUoKSksIHNlcnZlcik7Ci0JCXRoaXMubGF1bmNoTW9kZSA9IGxhdW5jaE1vZGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5qb2JzLkludGVybmFsSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIElTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKLQkJZ2V0U2VydmVyKCkuc3RhcnQobGF1bmNoTW9kZSwgbmV3IElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdCkgewotCQkJCXN0YXR1c1swXSA9IHJlc3VsdDsKLQkJCX0KLQkJfSk7Ci0JCQotCQl3aGlsZSAoc3RhdHVzWzBdID09IG51bGwgJiAhbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCWlmIChzdGF0dXNbMF0gIT0gbnVsbCkKLQkJCXJldHVybiBzdGF0dXNbMF07Ci0JCQotCQlnZXRTZXJ2ZXIoKS5zdG9wKHRydWUsIG51bGwpOwotCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1N0b3BTZXJ2ZXJKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1N0b3BTZXJ2ZXJKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiZjc1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TdG9wU2VydmVySm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogQSBqb2IgZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIuCi0gKiAKLSAqIEBkZXByZWNhdGVkIC0gdXNlIEFQSSBkaXJlY3RseSwgaXQgd2lsbCBraWNrIG9mZiBqb2JzIGFzIHJlcXVpcmVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdG9wU2VydmVySm9iIGV4dGVuZHMgQ2hhaW5lZEpvYiB7Ci0JcHVibGljIFN0b3BTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMuam9iU3RvcHBpbmdTZXJ2ZXIsIHNlcnZlci5nZXROYW1lKCkpLCBzZXJ2ZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5JbnRlcm5hbEpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBJU3RhdHVzW10gc3RhdHVzID0gbmV3IElTdGF0dXNbMV07Ci0JCWdldFNlcnZlcigpLnN0b3AoZmFsc2UsIG5ldyBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvbmUoSVN0YXR1cyByZXN1bHQpIHsKLQkJCQlzdGF0dXNbMF0gPSByZXN1bHQ7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJd2hpbGUgKHN0YXR1c1swXSA9PSBudWxsICYgIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzWzBdOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTJmZDdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTkZJRyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIElORk8gPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXQVJOSU5HID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VWRVJFID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRklORVIgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGSU5FU1QgPSA1OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBSRVNPVVJDRVMgPSA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFWFRFTlNJT05fUE9JTlQgPSA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMSVNURU5FUlMgPSA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBSVU5USU1FX1RBUkdFVCA9IDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFBFUkZPUk1BTkNFID0gMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFBVQkxJU0hJTkcgPSAxMTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxldmVsTmFtZXMgPSBuZXcgU3RyaW5nW10gewotCQkiQ09ORklHICAgIiwgIklORk8gICAgICIsICJXQVJOSU5HICAiLCAiU0VWRVJFICAgIiwgIkZJTkVSICAgICIsICJGSU5FU1QgICAiLAotCQkiUkVTT1VSQ0VTIiwgIkVYVEVOU0lPTiIsICJMSVNURU5FUlMiLCAiVEFSR0VUICAgIiwgIlBFUkYgICAgICIsICJQVUJMSVNIICAifTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoImRkL01NL3l5IEhIOm1tLnNzLlNTUyIpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gbG9nZ2VkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGxldmVsIGEgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoaW50IGxldmVsLCBTdHJpbmcgcykgewotCQl0cmFjZShsZXZlbCwgcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCBhIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoaW50IGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChsZXZlbCA9PSBTRVZFUkUpIHsKLQkJCWlmICghbG9nZ2VkLmNvbnRhaW5zKHMpKSB7Ci0JCQkJU2VydmVyUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKLQkJCQlsb2dnZWQuYWRkKHMpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQpOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKGxldmVsTmFtZXNbbGV2ZWxdKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChzZGYuZm9ybWF0KG5ldyBEYXRlKCkpKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChzKTsKLQkJLy9QbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihTZXJ2ZXJDb3JlLlBMVUdJTl9JRCArICIvIiArICJyZXNvdXJjZXMiKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oc2IudG9TdHJpbmcoKSk7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9VcGRhdGVTZXJ2ZXJKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1VwZGF0ZVNlcnZlckpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQyOGVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1VwZGF0ZVNlcnZlckpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlOwotLyoqCi0gKiBBY3Rpb24gdG8gdXBkYXRlIGEgc2VydmVyJ3Mgc3RhdHVzLgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2VydmVySm9iIGV4dGVuZHMgQ2hhaW5lZEpvYiB7Ci0JLyoqCi0JICogQW4gYWN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU2VydmVySm9iKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLmpvYlVwZGF0ZVNlcnZlciwgc2VydmVyLmdldE5hbWUoKSksIHNlcnZlcik7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlnZXRTZXJ2ZXIoKS5sb2FkQWRhcHRlcihTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5jbGFzcywgbW9uaXRvcik7Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvV29ya2luZ0NvcHlIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1dvcmtpbmdDb3B5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGUwY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvV29ya2luZ0NvcHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtpbmdDb3B5SGVscGVyIHsKLQlwcm90ZWN0ZWQgQmFzZSBiYXNlOwotCXByb3RlY3RlZCBib29sZWFuIGlzRGlydHk7Ci0KLQkvLyBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBwcm9wZXJ0eUxpc3RlbmVyczsKLQotCXB1YmxpYyBXb3JraW5nQ29weUhlbHBlcihCYXNlIGJhc2UpIHsKLQkJdGhpcy5iYXNlID0gYmFzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGludCB2YWx1ZSkgewotCQlpbnQgY3VycmVudCA9IGJhc2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIDApOwotCQlpZiAoYmFzZS5pc0F0dHJpYnV0ZVNldChhdHRyaWJ1dGVOYW1lKSAmJiBjdXJyZW50ID09IHZhbHVlKQotCQkJcmV0dXJuOwotCQkKLQkJaXNEaXJ0eSA9IHRydWU7Ci0JCWJhc2UubWFwLnB1dChhdHRyaWJ1dGVOYW1lLCBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KGF0dHJpYnV0ZU5hbWUsIG5ldyBJbnRlZ2VyKGN1cnJlbnQpLCBuZXcgSW50ZWdlcih2YWx1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlib29sZWFuIGN1cnJlbnQgPSBiYXNlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBmYWxzZSk7Ci0JCWlmIChiYXNlLmlzQXR0cmlidXRlU2V0KGF0dHJpYnV0ZU5hbWUpICYmIGN1cnJlbnQgPT0gdmFsdWUpCi0JCQlyZXR1cm47Ci0JCQotCQlpc0RpcnR5ID0gdHJ1ZTsKLQkJYmFzZS5tYXAucHV0KGF0dHJpYnV0ZU5hbWUsIEJvb2xlYW4udG9TdHJpbmcodmFsdWUpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoYXR0cmlidXRlTmFtZSwgbmV3IEJvb2xlYW4oY3VycmVudCksIG5ldyBCb29sZWFuKHZhbHVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIGN1cnJlbnQgPSBiYXNlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCAoU3RyaW5nKW51bGwpOwotCQlpZiAoYmFzZS5pc0F0dHJpYnV0ZVNldChhdHRyaWJ1dGVOYW1lKSAmJiBjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudC5lcXVhbHModmFsdWUpKQotCQkJcmV0dXJuOwotCQkKLQkJaXNEaXJ0eSA9IHRydWU7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJYmFzZS5tYXAucmVtb3ZlKGF0dHJpYnV0ZU5hbWUpOwotCQllbHNlCi0JCQliYXNlLm1hcC5wdXQoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChhdHRyaWJ1dGVOYW1lLCBjdXJyZW50LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0PFN0cmluZz4gdmFsdWUpIHsKLQkJTGlzdCBjdXJyZW50ID0gYmFzZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgKExpc3Q8U3RyaW5nPiludWxsKTsKLQkJaWYgKGJhc2UuaXNBdHRyaWJ1dGVTZXQoYXR0cmlidXRlTmFtZSkgJiYgY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQuZXF1YWxzKHZhbHVlKSkKLQkJCXJldHVybjsKLQkJCi0JCWlzRGlydHkgPSB0cnVlOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCWJhc2UubWFwLnJlbW92ZShhdHRyaWJ1dGVOYW1lKTsKLQkJZWxzZQotCQkJYmFzZS5tYXAucHV0KGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoYXR0cmlidXRlTmFtZSwgY3VycmVudCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTWFwIHZhbHVlKSB7Ci0JCU1hcCBjdXJyZW50ID0gYmFzZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgKE1hcCludWxsKTsKLQkJaWYgKGJhc2UuaXNBdHRyaWJ1dGVTZXQoYXR0cmlidXRlTmFtZSkgJiYgY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQuZXF1YWxzKHZhbHVlKSkKLQkJCXJldHVybjsKLQkJCi0JCWlzRGlydHkgPSB0cnVlOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCWJhc2UubWFwLnJlbW92ZShhdHRyaWJ1dGVOYW1lKTsKLQkJZWxzZQotCQkJYmFzZS5tYXAucHV0KGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoYXR0cmlidXRlTmFtZSwgY3VycmVudCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlKEJhc2UuUFJPUF9OQU1FLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NrZWQoYm9vbGVhbiBiKSB7Ci0JCXNldEF0dHJpYnV0ZShCYXNlLlBST1BfTE9DS0VELCBiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcml2YXRlKGJvb2xlYW4gYikgewotCQlzZXRBdHRyaWJ1dGUoQmFzZS5QUk9QX1BSSVZBVEUsIGIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHkjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGlzRGlydHk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUaW1lc3RhbXAoaW50IHRpbWVzdGFtcCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoYmFzZS5nZXRUaW1lc3RhbXAoKSAhPSB0aW1lc3RhbXApCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIElTZXJ2ZXJXb3JraW5nQ29weS5TQVZFX0NPTkZMSUNULCBNZXNzYWdlcy5lcnJvcldvcmtpbmdDb3B5VGltZXN0YW1wLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXByb3BlcnR5TGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPigyKTsKLQkJcHJvcGVydHlMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIHNlcnZlci4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHByb3BlcnR5TGlzdGVuZXJzICE9IG51bGwpCi0JCQlwcm9wZXJ0eUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBhIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCB2YWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKHByb3BlcnR5TGlzdGVuZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRyeSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHByb3BlcnR5TGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBmaXJpbmcgcHJvcGVydHkgY2hhbmdlIGV2ZW50IiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgaW4gcHJvcGVydHkgZXZlbnQiLCBlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERpcnR5KGJvb2xlYW4gZGlydHkpIHsKLQkJaXNEaXJ0eSA9IGRpcnR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1hNTE1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1hNTE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkYWQ2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotLyoqCi0gKiBBIE1lbWVudG8gaXMgYSBjbGFzcyBpbmRlcGVuZGVudCBjb250YWluZXIgZm9yIHBlcnNpc3RlbmNlCi0gKiBpbmZvLiAgSXQgaXMgYSByZWZsZWN0aW9uIG9mIDMgc3RvcmFnZSByZXF1aXJlbWVudHMuCi0gKgotICogMSkgICBXZSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcnNpc3QgYW4gb2JqZWN0IGFuZCByZXN0b3JlIGl0LiAgCi0gKiAyKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBiZSBhYnNlbnQuICBJZiBzbyB3ZSB3b3VsZCAKLSAqICAgICAgbGlrZSB0byBza2lwIHRoZSBvYmplY3QgYW5kIGtlZXAgcmVhZGluZy4gCi0gKiAzKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBjaGFuZ2UuICBJZiBzbyB0aGUgbmV3IGNsYXNzIAotICogICAgICBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgcGVyc2lzdGVuY2UgaW5mby4KLSAqCi0gKiBXZSBjb3VsZCBhc2sgdGhlIG9iamVjdHMgdG8gc2VyaWFsaXplIHRoZW1zZWx2ZXMgaW50byBhbiAKLSAqIE9iamVjdE91dHB1dFN0cmVhbSwgRGF0YU91dHB1dFN0cmVhbSwgb3IgSGFzaHRhYmxlLiAgSG93ZXZlciAKLSAqIGFsbCBvZiB0aGVzZSBhcHByb2FjaGVzIGZhaWwgdG8gbWVldCB0aGUgc2Vjb25kIHJlcXVpcmVtZW50LgotICoKLSAqIE1lbWVudG8gc3VwcG9ydHMgYmluYXJ5IHBlcnNpc3RhbmNlIHdpdGggYSB2ZXJzaW9uIElELgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHsKLQlwcml2YXRlIERvY3VtZW50IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBtZW1lbnRvIGZvciB0aGUgZG9jdW1lbnQgYW5kIGVsZW1lbnQuICBGb3Igc2ltcGxpY2l0eQotCSAqIHlvdSBzaG91bGQgdXNlIGNyZWF0ZVJlYWRSb290IGFuZCBjcmVhdGVXcml0ZVJvb3QgdG8gY3JlYXRlIHRoZSBpbml0aWFsCi0JICogbWVtZW50b3Mgb24gYSBkb2N1bWVudC4KLQkgKi8KLQlwcml2YXRlIFhNTE1lbWVudG8oRG9jdW1lbnQgZG9jLCBFbGVtZW50IGVsKSB7Ci0JCWZhY3RvcnkgPSBkb2M7Ci0JCWVsZW1lbnQgPSBlbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpIHsKLQkJRWxlbWVudCBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudCh0eXBlKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgRG9jdW1lbnQgZnJvbSBhIFJlYWRlciBhbmQgYW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciByZWFkaW5nIAotCSAqIGEgZG9jdW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVJlYWRSb290KElucHV0U3RyZWFtIGluKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQlOb2RlIG5vZGUgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCAoRWxlbWVudCkgbm9kZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhIHJvb3QgbWVtZW50byBmb3Igd3JpdGluZyBhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIGEgdHlwZQotCSAqIEByZXR1cm4gYSBtZW1lbnRvCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVdyaXRlUm9vdChTdHJpbmcgdHlwZSkgewotCQlEb2N1bWVudCBkb2N1bWVudDsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpOwotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZG9jdW1lbnQsIGVsZW1lbnQpOyAgICAgICAgICAgIAotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpIHsKLQkJLy8gR2V0IHRoZSBub2Rlcy4KLQkJTm9kZUxpc3Qgbm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQotCQkvLyBGaW5kIHRoZSBmaXJzdCBub2RlIHdoaWNoIGlzIGEgY2hpbGQgb2YgdGhpcyBub2RlLgotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQotCQkJCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgZWxlbWVudDIpOwotCQkJfQotCQl9Ci0JCi0JCS8vIEEgY2hpbGQgd2FzIG5vdCBmb3VuZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIFtdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKSB7Ci0JCS8vIEdldCB0aGUgbm9kZXMuCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbmV3IElNZW1lbnRvWzBdOwotCQotCQkvLyBFeHRyYWN0IGVhY2ggbm9kZSB3aXRoIGdpdmVuIHR5cGUuCi0JCUxpc3Q8RWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oc2l6ZSk7Ci0JCWZvciAoaW50IG5YID0gMDsgblggPCBzaXplOyBuWCArKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShuWCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQyID0gKEVsZW1lbnQpbm9kZTsKLQkJCQlpZiAoZWxlbWVudDIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHModHlwZSkpCi0JCQkJCWxpc3QuYWRkKGVsZW1lbnQyKTsKLQkJCX0KLQkJfQotCQotCQkvLyBDcmVhdGUgYSBtZW1lbnRvIGZvciBlYWNoIG5vZGUuCi0JCXNpemUgPSBsaXN0LnNpemUoKTsKLQkJSU1lbWVudG8gW10gcmVzdWx0cyA9IG5ldyBJTWVtZW50b1tzaXplXTsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBzaXplOyB4ICsrKSB7Ci0JCQlyZXN1bHRzW3hdID0gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgbGlzdC5nZXQoeCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyBtZW1lbnRvIGFzIGEgYnl0ZSBhcnJheS4KLQkgKgotCSAqIEByZXR1cm4gYnl0ZVtdCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRDb250ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXNhdmUob3V0KTsKLQkJcmV0dXJuIG91dC50b0J5dGVBcnJheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5wdXQgc3RyZWFtIGZvciB3cml0aW5nIHRvIHRoZSBkaXNrIHdpdGggYSBsb2NhbCBsb2NhbGUuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEuaW8uSW5wdXRTdHJlYW0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlzYXZlKG91dCk7Ci0JCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBGbG9hdCBnZXRGbG9hdChTdHJpbmcga2V5KSB7Ci0JCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IAotCQlTdHJpbmcgc3RyVmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IEZsb2F0KHN0clZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SW50ZWdlcihTdHJpbmcga2V5KSB7Ci0JCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IAotCQlTdHJpbmcgc3RyVmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoc3RyVmFsdWUpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IAotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TmFtZXMoKSB7Ci0JCU5hbWVkTm9kZU1hcCBtYXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IHNpemUgPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBtYXAuaXRlbShpKTsKLQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJbGlzdC5hZGQobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYSBtZW1lbnRvIGZyb20gdGhlIGdpdmVuIGZpbGVuYW1lLgotCSAqCi0JICogQHBhcmFtIGluIGphdmEuaW8uSW5wdXRTdHJlYW0KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWVtZW50byBsb2FkTWVtZW50byhJbnB1dFN0cmVhbSBpbikgewotCQlyZXR1cm4gY3JlYXRlUmVhZFJvb3QoaW4pOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGEgbWVtZW50byBmcm9tIHRoZSBnaXZlbiBmaWxlbmFtZS4KLQkgKgotCSAqIEBwYXJhbSBmaWxlbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS51aS5JTWVtZW50bwotCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1lbWVudG8gbG9hZE1lbWVudG8oU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpKTsKLQkJCXJldHVybiBYTUxNZW1lbnRvLmNyZWF0ZVJlYWRSb290KGluKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgbikgewotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZy52YWx1ZU9mKG4pKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGlzIE1lbWVudG8gdG8gYSBXcml0ZXIuCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2F2aW5nCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zKTsKLQkJU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZmFjdG9yeSk7Ci0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsICJVVEYtOCIpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59aW5kZW50LWFtb3VudCIsICIyIik7Ci0JCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgKElPRXhjZXB0aW9uKSAobmV3IElPRXhjZXB0aW9uKCkuaW5pdENhdXNlKGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtZW1lbnRvIHRvIHRoZSBnaXZlbiBmaWxlLgotCSAqCi0JICogQHBhcmFtIGZpbGVuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlVG9GaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gdyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSk7Ci0JCQlzYXZlKHcpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl3LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgc2F2ZVRvU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc2F2ZShvdXQpOwotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCJVVEYtOCIpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSU1lbWVudG8jZ2V0Qm9vbGVhbihTdHJpbmcpCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5KSB7Ci0JCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBzdHJWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJaWYgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHN0clZhbHVlKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8jcHV0Qm9vbGVhbihTdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgcHV0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQl9Ci0KLQkvKioKLSAgICAqIFJldHVybnMgdGhlIFRleHQgbm9kZSBvZiB0aGUgbWVtZW50by4gRWFjaCBtZW1lbnRvIGlzIGFsbG93ZWQgb25seSAKLSAgICAqIG9uZSBUZXh0IG5vZGUuCi0gICAgKiAKLSAgICAqIEByZXR1cm4gdGhlIFRleHQgbm9kZSBvZiB0aGUgbWVtZW50bywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLSAgICAqIHRoZSBtZW1lbnRvIGhhcyBubyBUZXh0IG5vZGUuCi0gICAgKi8KLSAgIHByaXZhdGUgVGV4dCBnZXRUZXh0Tm9kZSgpIHsKLSAgICAgICAvLyBHZXQgdGhlIG5vZGVzLgotICAgICAgIE5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLSAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotICAgICAgIGZvciAoaW50IG5YID0gMDsgblggPCBzaXplOyBuWCsrKSB7Ci0gICAgICAgICAgIE5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgICAgIHJldHVybiAoVGV4dCkgbm9kZTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICAvLyBhIFRleHQgbm9kZSB3YXMgbm90IGZvdW5kCi0gICAgICAgcmV0dXJuIG51bGw7Ci0gICB9Ci0gIAotCS8qIChub24tSmF2YWRvYykKLSAgICAqLwotICAgcHVibGljIHZvaWQgcHV0VGV4dERhdGEoU3RyaW5nIGRhdGEpIHsKLSAgICAgICBUZXh0IHRleHROb2RlID0gZ2V0VGV4dE5vZGUoKTsKLSAgICAgICBpZiAodGV4dE5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICB0ZXh0Tm9kZSA9IGZhY3RvcnkuY3JlYXRlVGV4dE5vZGUoZGF0YSk7Ci0JCQkvLyBBbHdheXMgYWRkIHRoZSB0ZXh0IG5vZGUgYXMgdGhlIGZpcnN0IGNoaWxkIChmaXhlcyBidWcgOTM3MTgpIAotCQkJZWxlbWVudC5pbnNlcnRCZWZvcmUodGV4dE5vZGUsIGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgICB0ZXh0Tm9kZS5zZXREYXRhKGRhdGEpOwotICAgICAgIH0KLSAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvRmFjZXRNYXBwaW5nVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL0ZhY2V0TWFwcGluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5Nzg0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvRmFjZXRNYXBwaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogVGhlIG1haW4gc2VydmVyIHRvb2xpbmcgcGx1Z2luIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgRmFjZXRNYXBwaW5nVXRpbCBleHRlbmRzIFBsdWdpbiB7Ci0JLy8JY2FjaGVkIGNvcHkgb2YgYWxsIHJ1bnRpbWUgY29tcG9uZW50IHByb3ZpZGVycwotCXByaXZhdGUgc3RhdGljIExpc3Q8UnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlcj4gcnVudGltZUNvbXBvbmVudFByb3ZpZGVyczsKLQotCS8vCWNhY2hlZCBjb3B5IG9mIGFsbCBydW50aW1lIGZhY2V0IG1hcHBpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxSdW50aW1lRmFjZXRNYXBwaW5nPiBydW50aW1lRmFjZXRNYXBwaW5nczsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHJ1bnRpbWUgZmFjZXQgbWFwcGluZyBpbnN0YW5jZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJ1bnRpbWUgZmFjZXQgbWFwcGluZyBpbnN0YW5jZXMKLQkgKiAgICB7QGxpbmsgUnVudGltZUZhY2V0TWFwcGluZ30KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJ1bnRpbWVGYWNldE1hcHBpbmdbXSBnZXRSdW50aW1lRmFjZXRNYXBwaW5nKCkgewotCQlpZiAocnVudGltZUZhY2V0TWFwcGluZ3MgPT0gbnVsbCkKLQkJCWxvYWRSdW50aW1lRmFjZXRNYXBwaW5nKCk7Ci0JCQotCQlSdW50aW1lRmFjZXRNYXBwaW5nW10gcmZtID0gbmV3IFJ1bnRpbWVGYWNldE1hcHBpbmdbcnVudGltZUZhY2V0TWFwcGluZ3Muc2l6ZSgpXTsKLQkJcnVudGltZUZhY2V0TWFwcGluZ3MudG9BcnJheShyZm0pOwotCQlyZXR1cm4gcmZtOwotCX0KLQotCS8qKgotCSAqIFVzZXMgdGhlIHJ1bnRpbWUgY29tcG9uZW50IHByb3ZpZGVyKHMpIHRoYXQgc3VwcG9ydHMgdGhlIGdpdmVuIHJ1bnRpbWUgdG8gYWRkCi0JICogYWRkaXRpb25hbCBydW50aW1lIGNvbXBvbmVudHMgdG8gdGhlIGxpc3QuCi0JICogVGhlIHJ1bnRpbWVUeXBlIG1heSBub3QgYmUgbnVsbC4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSBleGlzdGluZyBsaXN0IG9mIGNvbXBvbmVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmFjZXRSdW50aW1lQ29tcG9uZW50cyhJUnVudGltZSBydW50aW1lLCBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBjb21wb25lbnRzKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwgfHwgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlpZiAocnVudGltZUNvbXBvbmVudFByb3ZpZGVycyA9PSBudWxsKQotCQkJbG9hZFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcnMoKTsKLQkJCi0JCUl0ZXJhdG9yPFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXI+IGl0ZXJhdG9yID0gcnVudGltZUNvbXBvbmVudFByb3ZpZGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyIHJ1bnRpbWVDb21wb25lbnRQcm92aWRlciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChydW50aW1lQ29tcG9uZW50UHJvdmlkZXIuc3VwcG9ydHNSdW50aW1lVHlwZShydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkpKSB7Ci0JCQkJTGlzdDxJUnVudGltZUNvbXBvbmVudD4gbGlzdCA9IHJ1bnRpbWVDb21wb25lbnRQcm92aWRlci5nZXRDb21wb25lbnRzKHJ1bnRpbWUpOwotCQkJCWlmIChsaXN0ICE9IG51bGwpCi0JCQkJCWNvbXBvbmVudHMuYWRkQWxsKGxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgcnVudGltZSBjb21wb25lbnQgcHJvdmlkZXJzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzKCkgewotCQlpZiAocnVudGltZUNvbXBvbmVudFByb3ZpZGVycyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPi0gTG9hZGluZyAucnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgInJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVycyIpOwotCQkKLQkJLy8gbG9hZCBuZXcgd3N0IGV4dGVuc2lvbiBwb2ludAotCQlMaXN0PFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXI+KGNmLmxlbmd0aCk7Ci0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlIDogY2YpIHsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQobmV3IFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXIoY2UpKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCBydW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlcjogIiArIGNlLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgcnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXI6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBsb2FkIG9sZCBqc3QgZXh0ZW5zaW9uIHBvaW50Ci0JCWNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWxSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJzIik7Ci0JCQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNmKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyKGNlKSk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgcnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXI6ICIgKyBjZS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyOiAiICsgY2UuZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCQlydW50aW1lQ29tcG9uZW50UHJvdmlkZXJzID0gbGlzdDsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLnJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVycyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgcnVudGltZSBmYWNldCBtYXBwaW5ncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkUnVudGltZUZhY2V0TWFwcGluZygpIHsKLQkJaWYgKHJ1bnRpbWVGYWNldE1hcHBpbmdzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0+LSBMb2FkaW5nIC5ydW50aW1lRmFjZXRNYXBwaW5nIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lRmFjZXRNYXBwaW5ncyIpOwotCQkKLQkJTGlzdDxSdW50aW1lRmFjZXRNYXBwaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSdW50aW1lRmFjZXRNYXBwaW5nPihjZi5sZW5ndGgpOwotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA6IGNmKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKG5ldyBSdW50aW1lRmFjZXRNYXBwaW5nKGNlKSk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgcnVudGltZUZhY2V0TWFwcGluZzogIiArIGNlLmdldEF0dHJpYnV0ZSgicnVudGltZVR5cGVJZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBydW50aW1lRmFjZXRNYXBwaW5nOiAiICsgY2UuZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCQlydW50aW1lRmFjZXRNYXBwaW5ncyA9IGxpc3Q7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPC0gRG9uZSBsb2FkaW5nIC5ydW50aW1lRmFjZXRNYXBwaW5nIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9GYWNldFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9GYWNldFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjYzZiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvRmFjZXRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLlJ1bnRpbWVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBmYWNldCBydW50aW1lcyBhbmQgc2VydmVyIHJ1bnRpbWVzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIHN0YXRpYyBtZW1iZXJzLgotICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3IgaW5zdGFudGlhdGVkLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRVdGlsIHsKLQkvKioKLQkgKiBTdGF0aWMgdXRpbGl0eSBjbGFzcyAtIGNhbm5vdCBjcmVhdGUgYW4gaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBGYWNldFV0aWwoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciBydW50aW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBmYWNldCBydW50aW1lLCBvciBudWxsCi0JICogaWYgbm9uZSBjb3VsZCBiZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIGZhY2V0IHJ1bnRpbWUKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgcnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBmYWNldCBydW50aW1lLCBvcgotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgY291bGQgYmUgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZSBnZXRSdW50aW1lKG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgcnVudGltZSkgewotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJU3RyaW5nIGlkID0gcnVudGltZS5nZXRQcm9wZXJ0eSgiaWQiKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWZvciAoSVJ1bnRpbWUgciA6IHJ1bnRpbWVzKSB7Ci0JCQlpZiAoaWQuZXF1YWxzKHIuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHI7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY2V0IHJ1bnRpbWUgdGhhdCBjb3JyZXNwb25kcyB0byBhIHNlcnZlciBydW50aW1lLCBvciBudWxsCi0JICogaWYgbm9uZSBjb3VsZCBiZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHNlcnZlciBydW50aW1lCi0JICogQHJldHVybiB0aGUgZmFjZXQgcnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzZXJ2ZXIgcnVudGltZSwgb3IKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNvdWxkIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBnZXRSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCVN0cmluZyBpZCA9IHJ1bnRpbWUuZ2V0SWQoKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVNldCBydW50aW1lcyA9IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcnVudGltZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBydW50aW1lMiA9IChvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKHJ1bnRpbWUyLmdldFByb3BlcnR5KCJpZCIpKSkKLQkJCQlyZXR1cm4gcnVudGltZTI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgZmFjZXRzIG9uIGEgcHJvamVjdCBhcmUgc3VwcG9ydGVkIGJ5IGEgZ2l2ZW4gc2VydmVyLiBSZXR1cm5zCi0JICogYW4gT0sgc3RhdHVzIGlmIHRoZSBzZXJ2ZXIncyBydW50aW1lIHN1cHBvcnRzIHRoZSBwcm9qZWN0J3MgZmFjZXRzLCBhbmQgYW4KLQkgKiBFUlJPUiBzdGF0dXMgKHdpdGggbWVzc2FnZSkgaWYgaXQgZG9lc24ndC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiBPSyBzdGF0dXMgaWYgdGhlIHNlcnZlcidzIHJ1bnRpbWUgc3VwcG9ydHMgdGhlIHByb2plY3QncyBmYWNldHMsIGFuZCBhbgotCSAqICAgIEVSUk9SIHN0YXR1cyAod2l0aCBtZXNzYWdlKSBpZiBpdCBkb2Vzbid0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIHZlcmlmeUZhY2V0cyhJUHJvamVjdCBwcm9qZWN0LCBJU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck5vUnVudGltZSwgbnVsbCk7Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpOwotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JOb1J1bnRpbWUsIG51bGwpOwotCQkKLQkJb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBydW50aW1lMiA9IGdldFJ1bnRpbWUocnVudGltZSk7Ci0JCQotCQlpZiAocnVudGltZTIgPT0gbnVsbCkgLy8gYnVnIDE1MDE5NCAtIHdoYXQgZG8gd2UgZG8gaWYgdGhlIGZhY2V0IHJ1bnRpbWUgZG9lc24ndCBleGlzdCB5ZXQKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0cygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXQgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoIXJ1bnRpbWUyLnN1cHBvcnRzKGZhY2V0KSkKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JGYWNldCwgZmFjZXQuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0TGFiZWwoKSwgZmFjZXQuZ2V0VmVyc2lvblN0cmluZygpKSwgbnVsbCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybiBjZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBydW50aW1lIGlzIGJlaW5nIHRhcmdldGVkIGJ5IHRoZSBmYWNldAotCSAqIGZyYW1ld29yaywgYW5kIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBydW50aW1lIGlzIGluIHVzZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1J1bnRpbWVUYXJnZXRlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCXRyeSB7Ci0JCQlvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIHJ1bnRpbWUyID0gZ2V0UnVudGltZShydW50aW1lKTsKLQkJCQotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogcHJvamVjdHMpIHsKLQkJCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJU2V0PG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU+IHNldCA9IGZhY2V0ZWRQcm9qZWN0LmdldFRhcmdldGVkUnVudGltZXMoKTsKLQkJCQkJCWlmIChzZXQgIT0gbnVsbCAmJiBzZXQuY29udGFpbnMocnVudGltZTIpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBkZXRlcm1pbmUgaWYgcnVudGltZSBpcyBpbiB1c2UiLCB0KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcnVudGltZSBmcm9tIHRoZSB0YXJnZXQgb2YgYWxsIHByb2plY3RzLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgZm9yIGFueSByZWFzb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlVGFyZ2V0cyhJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgcnVudGltZTIgPSBnZXRSdW50aW1lKHJ1bnRpbWUpOwotCQkJCi0JCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJaWYgKHByb2plY3RzICE9IG51bGwpIHsKLQkJCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBwcm9qZWN0cykgewotCQkJCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQkJCWlmIChmYWNldGVkUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlTZXQ8b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZT4gc2V0ID0gZmFjZXRlZFByb2plY3QuZ2V0VGFyZ2V0ZWRSdW50aW1lcygpOwotCQkJCQkJaWYgKHNldCAhPSBudWxsICYmIHNldC5jb250YWlucyhydW50aW1lMikpCi0JCQkJCQkJZmFjZXRlZFByb2plY3QucmVtb3ZlVGFyZ2V0ZWRSdW50aW1lKHJ1bnRpbWUyLCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJdGhyb3cgY2U7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHJlbW92ZSBydW50aW1lIHRhcmdldCIsIHQpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lQnJpZGdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUJyaWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDBiODEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIFN1cHBvcnQgZm9yIGFsbCBzZXJ2ZXIgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZVR5cGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZUJyaWRnZSBpbXBsZW1lbnRzIElSdW50aW1lQnJpZGdlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcDxTdHJpbmcsIExpc3Q8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPj4gbWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPj4oKTsKLQotCXN0YXRpYyB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIGlkLCBTdHJpbmcgaWQyLCBTdHJpbmcgdmVyc2lvbikgewotCQlMaXN0PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4gbGlzdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlsaXN0ID0gbWFwcGluZ3MuZ2V0KGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPigyKTsKLQkJCi0JCXRyeSB7Ci0JCQlsaXN0LmFkZChSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lQ29tcG9uZW50VHlwZShpZDIpLmdldFZlcnNpb24odmVyc2lvbikpOwotCQkJbWFwcGluZ3MucHV0KGlkLCBsaXN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBhZGQgcnVudGltZSBtYXBwaW5ncwotCQlJUnVudGltZVR5cGVbXSBydW50aW1lVHlwZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVUeXBlcygpOwotCQlpbnQgc2l6ZSA9IHJ1bnRpbWVUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlSdW50aW1lVHlwZSBydCA9IChSdW50aW1lVHlwZSkgcnVudGltZVR5cGVzW2ldOwotCQkJU3RyaW5nIGNvbXBvbmVudCA9IHJ0LmdldEZhY2V0UnVudGltZUNvbXBvbmVudCgpOwotCQkJU3RyaW5nIHZlcnNpb24gPSBydC5nZXRGYWNldFJ1bnRpbWVWZXJzaW9uKCk7Ci0JCQlpZiAoY29tcG9uZW50ICE9IG51bGwgJiYgISIiLmVxdWFscyhjb21wb25lbnQpICYmIHZlcnNpb24gIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHZlcnNpb24pKQotCQkJCWFkZE1hcHBpbmcocnQuZ2V0SWQoKSwgY29tcG9uZW50LCB2ZXJzaW9uKTsKLQkJfQotCQkKLQkJLy8gYWRkIGV4dGVuc2lvbiBtYXBwaW5ncwotCQlSdW50aW1lRmFjZXRNYXBwaW5nW10gcmZtcyA9IEZhY2V0TWFwcGluZ1V0aWwuZ2V0UnVudGltZUZhY2V0TWFwcGluZygpOwotCQlzaXplID0gcmZtcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJYWRkTWFwcGluZyhyZm1zW2ldLmdldFJ1bnRpbWVUeXBlSWQoKSwgcmZtc1tpXS5nZXRSdW50aW1lQ29tcG9uZW50KCksIHJmbXNbaV0uZ2V0VmVyc2lvbigpKTsKLQkJCi0JCS8vIGdlbmVyaWMgcnVudGltZXMKLQkJYWRkTWFwcGluZygib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MzMjMiLCAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuamJvc3MiLCAiMy4yLjMiKTsKLQotCQlhZGRNYXBwaW5nKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hczQiLCAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUuam9uYXMiLCAiNC4wIik7Ci0JCQotCQlhZGRNYXBwaW5nKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5vcmFjbGUxMDEzIiwgIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZSIsICIxMC4xLjMiKTsKLQkJCi0JCWFkZE1hcHBpbmcoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZS42IiwgIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYnNwaGVyZSIsICI2LjAiKTsKLQl9Ci0KLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RXhwb3J0ZWRSdW50aW1lTmFtZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCVNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4ocnVudGltZXMubGVuZ3RoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcnVudGltZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBydW50aW1lc1tpXTsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKLQkJCWlmIChydW50aW1lVHlwZSAhPSBudWxsICYmIG1hcHBpbmdzLmNvbnRhaW5zS2V5KHJ1bnRpbWVUeXBlLmdldElkKCkpKSB7Ci0JCQkJcmVzdWx0LmFkZChydW50aW1lLmdldElkKCkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3R1YiBicmlkZ2UoU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHJ1bnRpbWVzW2ldLmdldElkKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBuZXcgU3R1YihydW50aW1lc1tpXSk7Ci0JCQlpZiAocnVudGltZXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gbmV3IFN0dWIocnVudGltZXNbaV0pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0dWIgZXh0ZW5kcyBJUnVudGltZUJyaWRnZS5TdHViIHsKLQkJcHJpdmF0ZSBJUnVudGltZSBydW50aW1lOwotCi0JCXB1YmxpYyBTdHViKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJCXRoaXMucnVudGltZSA9IHJ1bnRpbWU7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gZ2V0UnVudGltZUNvbXBvbmVudHMoKSB7Ci0JCQlMaXN0PElSdW50aW1lQ29tcG9uZW50PiBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDxJUnVudGltZUNvbXBvbmVudD4oMik7Ci0JCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJCXJldHVybiBjb21wb25lbnRzOwotCQkJCi0JCQkvLyBkZWZpbmUgc2VydmVyIHJ1bnRpbWUgY29tcG9uZW50Ci0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oNSk7Ci0JCQlpZiAocnVudGltZS5nZXRMb2NhdGlvbigpICE9IG51bGwpCi0JCQkJcHJvcGVydGllcy5wdXQoImxvY2F0aW9uIiwgcnVudGltZS5nZXRMb2NhdGlvbigpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQllbHNlCi0JCQkJcHJvcGVydGllcy5wdXQoImxvY2F0aW9uIiwgIiIpOwotCQkJcHJvcGVydGllcy5wdXQoIm5hbWUiLCBydW50aW1lLmdldE5hbWUoKSk7Ci0JCQlwcm9wZXJ0aWVzLnB1dCgiaWQiLCBydW50aW1lLmdldElkKCkpOwotCQkJaWYgKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJcHJvcGVydGllcy5wdXQoInR5cGUiLCBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJCQlwcm9wZXJ0aWVzLnB1dCgidHlwZS1pZCIsIHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIHR5cGVJZCA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotCQkJaWYgKG1hcHBpbmdzLmNvbnRhaW5zS2V5KHR5cGVJZCkpIHsKLQkJCQlBcnJheUxpc3QgbGlzdCA9IChBcnJheUxpc3QpIG1hcHBpbmdzLmdldCh0eXBlSWQpOwotCQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIG1hcHBlZCA9IChJUnVudGltZUNvbXBvbmVudFZlcnNpb24pIGxpc3QuZ2V0KGkpOwotCQkJCQljb21wb25lbnRzLmFkZChSdW50aW1lTWFuYWdlci5jcmVhdGVSdW50aW1lQ29tcG9uZW50KG1hcHBlZCwgcHJvcGVydGllcykpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJRmFjZXRNYXBwaW5nVXRpbC5hZGRGYWNldFJ1bnRpbWVDb21wb25lbnRzKHJ1bnRpbWUsIGNvbXBvbmVudHMpOwotCQkJCi0JCQlyZXR1cm4gY29tcG9uZW50czsKLQkJfQotCi0JCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoKSB7Ci0JCQlmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQkJcHJvcHMucHV0KCJpZCIsIHJ1bnRpbWUuZ2V0SWQoKSk7Ci0JCQkJcHJvcHMucHV0KCJsb2NhbGl6ZWQtbmFtZSIsIHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJCQlTdHJpbmcgcyA9ICgoUnVudGltZSlydW50aW1lKS5nZXRBdHRyaWJ1dGUoImFsdGVybmF0ZS1uYW1lcyIsIChTdHJpbmcpbnVsbCk7Ci0JCQkJaWYgKHMgIT0gbnVsbCkKLQkJCQkgICAgcHJvcHMucHV0KCJhbHRlcm5hdGUtbmFtZXMiLCBzKTsKLQkJCX0KLQkJCXJldHVybiBwcm9wczsKLQkJfQotCQkKLQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCSAgICByZXR1cm4gcnVudGltZS52YWxpZGF0ZSggbW9uaXRvciApOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUNvbXBvbmVudFByb3ZpZGVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTY0NTBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgUnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lIGNvbXBvbmVudCBoYW5kbGVyLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIFJ1bnRpbWVDb21wb25lbnRQcm92aWRlcldyYXBwZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVR5cGVJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbGVtZW50LmdldEF0dHJpYnV0ZSgicnVudGltZVR5cGVJZHMiKSwgIiwiKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApCi0JCQkJCWxpc3QuYWRkKHN0ci50cmltKCkpOwotCQkJfQotCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHMpOwotCQkJcmV0dXJuIHM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgcGFyc2UgcnVudGltZSB0eXBlIGlkczogIiArIGVsZW1lbnQpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciByZXNvdXJjZSB0eXBlIChnaXZlbiBieSB0aGUKLQkgKiBpZCkgY2FuIGJlIG9wZW5lZCB3aXRoIHRoaXMgZWRpdG9yLiBUaGlzIHJlc3VsdCBpcyBiYXNlZCBvbgotCSAqIHRoZSByZXN1bHQgb2YgdGhlIGdldFNlcnZlclJlc291cmNlcygpIG1ldGhvZC4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lVHlwZSBhIHJ1bnRpbWUgdHlwZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzUnVudGltZVR5cGUoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCWlmIChydW50aW1lVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaWQgPSBydW50aW1lVHlwZS5nZXRJZCgpOwotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZ1tdIHMgPSBnZXRSdW50aW1lVHlwZUlkcygpOwotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IHNpemUgPSBzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChzW2ldLmVuZHNXaXRoKCIqIikpIHsKLQkJCQlpZiAoaWQubGVuZ3RoKCkgPj0gc1tpXS5sZW5ndGgoKSAmJiBpZC5zdGFydHNXaXRoKHNbaV0uc3Vic3RyaW5nKDAsIHNbaV0ubGVuZ3RoKCkgLSAxKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChpZC5lcXVhbHMoc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogTG9hZHMgdGhlIGRlbGVnYXRlIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBSdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlckRlbGVnYXRlIGdldERlbGVnYXRlKCkgewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChSdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZSNnZXRSdW50aW1lQ29tcG9uZW50cyhJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gZ2V0Q29tcG9uZW50cyhJUnVudGltZSBydW50aW1lKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLmdldFJ1bnRpbWVDb21wb25lbnRzKHJ1bnRpbWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJSdW50aW1lQ29tcG9uZW50UHJvdmlkZXJXcmFwcGVyWyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvZmFjZXRzL1J1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0M2MzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUZhY2V0Q29tcG9uZW50UHJvdmlkZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuZmFjZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLS8qKgotICogQSBydW50aW1lIGNvbXBvbmVudCBwcm92aWRlciBjYW4gcHJvdmlkZSBhZGRpdGlvbmFsIHJ1bnRpbWUgY29tcG9uZW50cyBmb3IgYSBmYWNldCBydW50aW1lLgotICogVGhpcyBwcm92aWRlciBpcyBzY29wZWQgYnkgcnVudGltZSB0eXBlIGFuZCBtYXkgcHJvdmlkZSBjb21wb25lbnRzIGZvciBtdWx0aXBsZQotICogcnVudGltZSBpbnN0YW5jZXMuCi0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCi0gKiB0byBleHRlbmQgdGhlIDxjb2RlPmludGVybmFsUnVudGltZUNvbXBvbmVudFByb3ZpZGVyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogCi0gKiBAcGxhbm5lZGZvciAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJ1bnRpbWVGYWNldENvbXBvbmVudFByb3ZpZGVyRGVsZWdhdGUgewotCXB1YmxpYyBSdW50aW1lRmFjZXRDb21wb25lbnRQcm92aWRlckRlbGVnYXRlKCkgewotCQkvLyBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JfQotCi0JLyoqCi0JICogQWRkIHJ1bnRpbWUgY29tcG9uZW50cyB0byB0aGUgZ2l2ZW4gcnVudGltZS4gQ29tcG9uZW50cyBzaG91bGQgYmUgY3JlYXRlZCBieSBjYWxsaW5nCi0JICogUnVudGltZU1hbmFnZXIuY3JlYXRlUnVudGltZUNvbXBvbmVudChJUnVudGltZUNvbXBvbmVudFZlcnNpb24sIE1hcCkKLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHNlcnZlciBydW50aW1lCi0JICogQHJldHVybiBhIGxpc3Qgb2YgcnVudGltZXMsIG9yIGFuIGVtcHR5IGxpc3Qgb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm8gYWRkaXRpb25hbCBjb21wb25lbnRzCi0JICovCi0JcHVibGljIGFic3RyYWN0IExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGdldFJ1bnRpbWVDb21wb25lbnRzKElSdW50aW1lIHJ1bnRpbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lRmFjZXRNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9mYWNldHMvUnVudGltZUZhY2V0TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTJlOWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL2ZhY2V0cy9SdW50aW1lRmFjZXRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5mYWNldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVGYWNldE1hcHBpbmcgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcnVudGltZSBmYWNldCBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIFJ1bnRpbWVGYWNldE1hcHBpbmcoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZVR5cGVJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkIik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ29tcG9uZW50KCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJ1bnRpbWUtY29tcG9uZW50Iik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJSdW50aW1lRmFjZXRNYXBwaW5nWyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9TZXJ2ZXJMb2NhdG9yRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1NlcnZlckxvY2F0b3JEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJmODEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1NlcnZlckxvY2F0b3JEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIEEgc2VydmVyIGxvY2F0b3IgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gbG9jYXRlIG9yIHNlYXJjaCBmb3IgYWRkaXRpb25hbAotICogc2VydmVyIG9mIGEgcGFydGljdWxhciB0eXBlLCBvbiBhIHBhcnRpY3VsYXIgaG9zdC4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+c2VydmVyTG9jYXRvcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckxvY2F0b3JEZWxlZ2F0ZSB7Ci0JLyoqCi0JICogQSBjYWxsYmFjayBsaXN0ZW5lciB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcy4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJTZWFyY2hMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBDYWxsZWQgd2hlbiBhIG5ldyBzZXJ2ZXIgaXMgZm91bmQgYnkgdGhlIGxvY2F0b3IuCi0JCSAqIFRoZSBzZXJ2ZXIgbXVzdCBuZXZlciBiZSBudWxsLgotCQkgKiAKLQkJICogQHBhcmFtIHNlcnZlciB0aGUgcnVudGltZSB0aGF0IHdhcyBmb3VuZC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNlcnZlckZvdW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIpOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIGZvciBzZXJ2ZXJzLiAKLQkgKiBJdCB1c2VzIHRoZSBjYWxsYmFjayBsaXN0ZW5lciB0byByZXBvcnQgc2VydmVycyB0aGF0IGFyZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gaG9zdCBhIGhvc3Qgc3RyaW5nIGNvbmZvcm1pbmcgdG8gUkZDIDI3MzIKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBsaXN0ZW5lciB0byByZXBvcnQgc3RhdHVzIHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlYXJjaEZvclNlcnZlcnMoU3RyaW5nIGhvc3QsIElTZXJ2ZXJTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFyRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Rhci9UYXJFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmJkODU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Rhci9UYXJFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC50YXI7Ci0vKioKLSAqIFJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZSBpbiBhIHRhciBhcmNoaXZlLgotICogPHA+Ci0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2Zlci4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFRhckVudHJ5IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgbG9uZyBtb2RlLCB0aW1lLCBzaXplOwotCXByaXZhdGUgaW50IHR5cGU7Ci0JaW50IGZpbGVwb3M7Ci0KLQkvKioKLQkgKiBFbnRyeSB0eXBlIGZvciBub3JtYWwgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRSA9ICcwJzsKLQotCS8qKgotCSAqIEVudHJ5IHR5cGUgZm9yIGRpcmVjdG9yaWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVE9SWSA9ICc1JzsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgVGFyRW50cnkgZm9yIGEgZmlsZSBvZiB0aGUgZ2l2ZW4gbmFtZSBhdCB0aGUKLQkgKiBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBmaWxlbmFtZQotCSAqIEBwYXJhbSBwb3MgcG9zaXRpb24gaW4gdGhlIGZpbGUgaW4gYnl0ZXMKLQkgKi8KLQlUYXJFbnRyeShTdHJpbmcgbmFtZSwgaW50IHBvcykgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQltb2RlID0gMDY0NDsKLQkJdHlwZSA9IEZJTEU7Ci0JCWZpbGVwb3MgPSBwb3M7Ci0JCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAvIDEwMDA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFRhckVudHJ5IGZvciBhIGZpbGUgb2YgdGhlIGdpdmVuIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUgZmlsZW5hbWUKLQkgKi8KLQlwdWJsaWMgVGFyRW50cnkoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyhuYW1lLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIGZpbGUsIG9uZSBvZiBGSUxFLCBMSU5LLCBTWU1fTElOSywKLQkgKiBDSEFSX0RFVklDRSwgQkxPQ0tfREVWSUNFLCBESVJFQ1RPUlkgb3IgRklGTy4KLQkgKiAKLQkgKiBAcmV0dXJuIGZpbGUgdHlwZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RmlsZVR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGUgb2YgdGhlIGZpbGUgaW4gVU5JWCBwZXJtaXNzaW9ucyBmb3JtYXQuCi0JICogCi0JICogQHJldHVybiBmaWxlIG1vZGUKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RlKCkgewotCQlyZXR1cm4gbW9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gZmlsZW5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGZpbGUgaW4gYnl0ZXMuCi0JICogCi0JICogQHJldHVybiBmaWxlc2l6ZQotCSAqLwotCXB1YmxpYyBsb25nIGdldFNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBmaWxlIGluIHNlY29uZHMgc2luY2UgSmFudWFyeQotCSAqIDFzdCAxOTcwLgotCSAqIAotCSAqIEByZXR1cm4gdGltZQotCSAqLwotCXB1YmxpYyBsb25nIGdldFRpbWUoKSB7Ci0JCXJldHVybiB0aW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHR5cGUgb2YgdGhlIGZpbGUsIG9uZSBvZiBGSUxFLCBMSU5LLCBTWU1MSU5LLCBDSEFSX0RFVklDRSwKLQkgKiBCTE9DS19ERVZJQ0UsIG9yIERJUkVDVE9SWS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbGVUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kZSBvZiB0aGUgZmlsZSBpbiBVTklYIHBlcm1pc3Npb25zIGZvcm1hdC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGUobG9uZyBtb2RlKSB7Ci0JCXRoaXMubW9kZSA9IG1vZGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBpbiBieXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gc2l6ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemUobG9uZyBzaXplKSB7Ci0JCXRoaXMuc2l6ZSA9IHNpemU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGZpbGUgaW4gc2Vjb25kcyBzaW5jZSBKYW51YXJ5Ci0JICogMXN0IDE5NzAuCi0JICogCi0JICogQHBhcmFtIHRpbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lKGxvbmcgdGltZSkgewotCQl0aGlzLnRpbWUgPSB0aW1lOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFyRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhM2IxZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvdGFyL1RhckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLnRhcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0vKioKLSAqIEV4Y2VwdGlvbiBnZW5lcmF0ZWQgdXBvbiBlbmNvdW50ZXJpbmcgY29ycnVwdGVkIHRhciBmaWxlcy4KLSAqIDxwPgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwud2l6YXJkcy5kYXRhdHJhbnNmZXIuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYXJFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0JLyoqCi0JICogR2VuZXJhdGVkIHNlcmlhbCB2ZXJzaW9uIFVJRCBmb3IgdGhpcyBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyODg2NjcxMjU0NTE4ODUzNTI4TDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBUYXJFeGNlcHRpb24gd2l0aG91dCBhIGRldGFpbCBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFRhckV4Y2VwdGlvbigpIHsKLSAgICAJc3VwZXIoKTsKLSAgICB9Ci0JCi0JLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFRhckV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzIHRoZSBkZXRhaWwgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFRhckV4Y2VwdGlvbihTdHJpbmcgcykgewotICAgIAlzdXBlcihzKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvdGFyL1RhckZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Rhci9UYXJGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTc0NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvdGFyL1RhckZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwudGFyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07Ci0vKioKLSAqIFJlYWRzIGEgLnRhciBvciAudGFyLmd6IGFyY2hpdmUgZmlsZSwgcHJvdmlkaW5nIGFuIGluZGV4IGVudW1lcmF0aW9uCi0gKiBhbmQgYWxsb3dzIGZvciBhY2Nlc3NpbmcgYW4gSW5wdXRTdHJlYW0gZm9yIGFyYml0cmFyeSBmaWxlcyBpbiB0aGUKLSAqIGFyY2hpdmUuCi0gKiA8cD4KLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLndpemFyZHMuZGF0YXRyYW5zZmVyLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVGFyRmlsZSB7Ci0JcHJpdmF0ZSBGaWxlIGZpbGU7Ci0JcHJvdGVjdGVkIFRhcklucHV0U3RyZWFtIGVudHJ5RW51bWVyYXRpb25TdHJlYW07Ci0JcHJvdGVjdGVkIFRhckVudHJ5IGN1ckVudHJ5OwotCXByaXZhdGUgVGFySW5wdXRTdHJlYW0gZW50cnlTdHJlYW07Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFRhckZpbGUgZm9yIHRoZSBnaXZlbiBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHRocm93cyBUYXJFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFRhckZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgVGFyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0KLQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkvLyBGaXJzdCwgY2hlY2sgaWYgaXQncyBhIEdaSVBJbnB1dFN0cmVhbS4KLQkJdHJ5IHsKLQkJCWluID0gbmV3IEdaSVBJbnB1dFN0cmVhbShpbik7Ci0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJLy9JZiBpdCBpcyBub3QgY29tcHJlc3NlZCB3ZSBjbG9zZQotCQkJLy90aGUgb2xkIG9uZSBhbmQgcmVjcmVhdGUKLQkJCWluLmNsb3NlKCk7CQkKLQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJfQotCQllbnRyeUVudW1lcmF0aW9uU3RyZWFtID0gbmV3IFRhcklucHV0U3RyZWFtKGluKTsKLQkJY3VyRW50cnkgPSBlbnRyeUVudW1lcmF0aW9uU3RyZWFtLmdldE5leHRFbnRyeSgpOwotCX0KLQkKLQkvKioKLQkgKiBDbG9zZSB0aGUgdGFyIGZpbGUgaW5wdXQgc3RyZWFtLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUgY2Fubm90IGJlIHN1Y2Nlc3NmdWxseSBjbG9zZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVudHJ5RW51bWVyYXRpb25TdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgVGFyRmlsZSBmb3IgdGhlIGdpdmVuIHBhdGggbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAdGhyb3dzIFRhckV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgVGFyRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBUYXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJdGhpcyhuZXcgRmlsZShmaWxlbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gY2F0YWxvZ3VpbmcgdGhlIHRhciBhcmNoaXZlLgotCSAqIAotCSAqIEByZXR1cm4gZW51bWVyYXRpb24gb2YgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGVudHJpZXMoKSB7Ci0JCXJldHVybiBuZXcgRW51bWVyYXRpb24oKSB7CQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCQkJcmV0dXJuIChjdXJFbnRyeSAhPSBudWxsKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLQkJCQlUYXJFbnRyeSBvbGRFbnRyeSA9IGN1ckVudHJ5OwotCQkJCXRyeSB7Ci0JCQkJCWN1ckVudHJ5ID0gZW50cnlFbnVtZXJhdGlvblN0cmVhbS5nZXROZXh0RW50cnkoKTsKLQkJCQl9IGNhdGNoKFRhckV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWN1ckVudHJ5ID0gbnVsbDsKLQkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJY3VyRW50cnkgPSBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gb2xkRW50cnk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBJbnB1dFN0cmVhbSBmb3IgdGhlIGdpdmVuIGZpbGUgaW4gdGhlIHRhciBhcmNoaXZlLgotCSAqIAotCSAqIEBwYXJhbSBlbnRyeQotCSAqIEByZXR1cm4gYW4gaW5wdXQgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gZmlsZQotCSAqIEB0aHJvd3MgVGFyRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShUYXJFbnRyeSBlbnRyeSkgdGhyb3dzIFRhckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZihlbnRyeVN0cmVhbSA9PSBudWxsIHx8ICFlbnRyeVN0cmVhbS5za2lwVG9FbnRyeShlbnRyeSkpIHsKLQkJCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCS8vIEZpcnN0LCBjaGVjayBpZiBpdCdzIGEgR1pJUElucHV0U3RyZWFtLgotCQkJdHJ5IHsKLQkJCQlpbiA9IG5ldyBHWklQSW5wdXRTdHJlYW0oaW4pOwotCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJfQotCQkJZW50cnlTdHJlYW0gPSBuZXcgVGFySW5wdXRTdHJlYW0oaW4sIGVudHJ5KSB7Ci0JCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCQkJCS8vIElnbm9yZSBjbG9zZSgpIHNpbmNlIHdlIHdhbnQgdG8gcmV1c2UgdGhlIHN0cmVhbS4KLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWlmKGVudHJ5U3RyZWFtID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaHVoPyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGVudHJ5U3RyZWFtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggbmFtZSBvZiB0aGUgZmlsZSB0aGlzIGFyY2hpdmUgcmVwcmVzZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHBhdGgKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmaWxlLmdldFBhdGgoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvdGFyL1RhcklucHV0U3RyZWFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFySW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViMTZmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC90YXIvVGFySW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwudGFyOwotCi1pbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0vKioKLSAqIElucHV0IHN0cmVhbSBmb3IgcmVhZGluZyBmaWxlcyBpbiB1c3RhciBmb3JtYXQgKHRhcikgY29tcGF0aWJsZQotICogd2l0aCB0aGUgc3BlY2lmaWNhdGlvbiBpbiBJRUVFIFN0ZCAxMDAzLjEtMjAwMS4gIEFsc28gc3VwcG9ydHMKLSAqIGxvbmcgZmlsZW5hbWVzIGVuY29kZWQgdXNpbmcgdGhlIEdOVSBATG9uZ0xpbmsgZXh0ZW5zaW9uLgotICogPHA+Ci0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC53aXphcmRzLmRhdGF0cmFuc2Zlci4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFRhcklucHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVySW5wdXRTdHJlYW0gewotCXByaXZhdGUgaW50IG5leHRFbnRyeSA9IDA7Ci0JcHJpdmF0ZSBpbnQgbmV4dEVPRiA9IDA7Ci0JcHJpdmF0ZSBpbnQgZmlsZXBvcyA9IDA7Ci0JcHJpdmF0ZSBpbnQgYnl0ZXNyZWFkID0gMDsKLQlwcml2YXRlIFRhckVudHJ5IGZpcnN0RW50cnkgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGxvbmdMaW5rTmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRhciBpbnB1dCBzdHJlYW0gb24gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gaW4gaW5wdXQgc3RyZWFtCi0JICogQHRocm93cyBUYXJFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFRhcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB0aHJvd3MgVGFyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyKGluKTsKLQotCQkvLyBSZWFkIGluIHRoZSBmaXJzdCBUYXJFbnRyeSB0byBtYWtlIHN1cmUKLQkJLy8gdGhlIGlucHV0IGlzIGEgdmFsaWQgdGFyIGZpbGUgc3RyZWFtLgotCQlmaXJzdEVudHJ5ID0gZ2V0TmV4dEVudHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHRhciBpbnB1dCBzdHJlYW0sIHNraXBwaW5nIGFoZWFkIHRvIHRoZSBnaXZlbiBlbnRyeQotCSAqIGluIHRoZSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBpbiBpbnB1dCBzdHJlYW0KLQkgKiBAcGFyYW0gZW50cnkgc2tpcHMgdG8gdGhpcyBlbnRyeSBpbiB0aGUgZmlsZQotCSAqIEB0aHJvd3MgVGFyRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCVRhcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBUYXJFbnRyeSBlbnRyeSkgdGhyb3dzIFRhckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlzdXBlcihpbik7Ci0JCXNraXBUb0VudHJ5KGVudHJ5KTsKLQl9Ci0KLQkvKioKLQkgKiAgVGhlIGNoZWNrc3VtIG9mIGEgdGFyIGZpbGUgaGVhZGVyIGlzIHNpbXBseSB0aGUgc3VtIG9mIHRoZSBieXRlcyBpbgotCSAqICB0aGUgaGVhZGVyLgotCSAqIAotCSAqIEBwYXJhbSBoZWFkZXIKLQkgKiBAcmV0dXJuIGNoZWNrc3VtCi0JICovCi0JcHJpdmF0ZSBsb25nIGhlYWRlckNoZWNrc3VtKGJ5dGVbXSBoZWFkZXIpIHsKLQkJbG9uZyBzdW0gPSAwOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKLQkJCXN1bSArPSBoZWFkZXJbaV0gJiAweGZmOwotCQl9Ci0JCXJldHVybiBzdW07Ci0JfQotCi0JLyoqCi0JICogU2tpcHMgYWhlYWQgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBlbnRyeSBpbiB0aGUgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZW50cnkKLQkgKiBAcmV0dXJucyBmYWxzZSBpZiB0aGUgZW50cnkgaGFzIGFscmVhZHkgYmVlbiBwYXNzZWQKLQkgKiBAdGhyb3dzIFRhckV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlib29sZWFuIHNraXBUb0VudHJ5KFRhckVudHJ5IGVudHJ5KSB0aHJvd3MgVGFyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWludCBieXRlc3Rvc2tpcCA9IGVudHJ5LmZpbGVwb3MgLSBieXRlc3JlYWQ7Ci0JCWlmKGJ5dGVzdG9za2lwIDwgMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXdoaWxlKGJ5dGVzdG9za2lwID4gMCkgewotCQkJbG9uZyByZXQgPSBpbi5za2lwKGJ5dGVzdG9za2lwKTsKLQkJCWlmKHJldCA8IDApIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oImVhcmx5IGVuZCBvZiBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnl0ZXN0b3NraXAgLT0gcmV0OwotCQkJYnl0ZXNyZWFkICs9IHJldDsKLQkJfQotCQlmaWxlcG9zID0gZW50cnkuZmlsZXBvczsKLQkJbmV4dEVudHJ5ID0gMDsKLQkJbmV4dEVPRiA9IDA7Ci0JCS8vIFJlYWQgbmV4dCBoZWFkZXIgdG8gc2VlayB0byBmaWxlIGRhdGEuCi0JCWdldE5leHRFbnRyeSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGhlYWRlciBjaGVja3N1bSBpcyBjb3JyZWN0LgotCSAqIAotCSAqIEBwYXJhbSBoZWFkZXIKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBoZWFkZXIgaGFzIGEgdmFsaWQgY2hlY2tzdW0KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFRhckhlYWRlcihieXRlW10gaGVhZGVyKSB7Ci0JCWxvbmcgZmlsZUNoZWNrc3VtLCBjYWxjdWxhdGVkQ2hlY2tzdW07Ci0JCWludCBwb3MsIGk7Ci0JCQotCQlwb3MgPSAxNDg7Ci0JCVN0cmluZ0J1ZmZlciBjaGVja3N1bVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlpZihoZWFkZXJbcG9zICsgaV0gPT0gJyAnKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZihoZWFkZXJbcG9zICsgaV0gPT0gMCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpIGhlYWRlcltwb3MgKyBpXSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNoZWNrc3VtU3RyaW5nLmFwcGVuZCgoY2hhcikgaGVhZGVyW3BvcyArIGldKTsKLQkJfQotCQlpZihjaGVja3N1bVN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYoY2hlY2tzdW1TdHJpbmcuY2hhckF0KDApICE9ICcwJykgewotCQkJY2hlY2tzdW1TdHJpbmcuaW5zZXJ0KDAsICcwJyk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZpbGVDaGVja3N1bSA9IExvbmcuZGVjb2RlKGNoZWNrc3VtU3RyaW5nLnRvU3RyaW5nKCkpLmxvbmdWYWx1ZSgpOwotCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vVGhpcyBpcyBub3QgdmFsaWQgaWYgaXQgY2Fubm90IGJlIHBhcnNlZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gQmxhbmsgb3V0IHRoZSBjaGVja3N1bS4KLQkJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQloZWFkZXJbcG9zICsgaV0gPSAnICc7Ci0JCX0KLQkJY2FsY3VsYXRlZENoZWNrc3VtID0gaGVhZGVyQ2hlY2tzdW0oaGVhZGVyKTsKLQotCQlyZXR1cm4gKGZpbGVDaGVja3N1bSA9PSBjYWxjdWxhdGVkQ2hlY2tzdW0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgZW50cnkgaW4gdGhlIHRhciBmaWxlLiAgRG9lcyBub3QgaGFuZGxlCi0JICogR05VIEBMb25nTGluayBleHRlbnNpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5leHQgZW50cnkgaW4gdGhlIHRhciBmaWxlCi0JICogQHRocm93cyBUYXJFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JVGFyRW50cnkgZ2V0TmV4dEVudHJ5SW50ZXJuYWwoKSB0aHJvd3MgVGFyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBoZWFkZXIgPSBuZXcgYnl0ZVs1MTJdOwotCQlpbnQgcG9zID0gMDsKLQkJaW50IGk7Ci0KLQkJaWYoZmlyc3RFbnRyeSAhPSBudWxsKSB7Ci0JCQlUYXJFbnRyeSBlbnRyeVJldHVybiA9IGZpcnN0RW50cnk7Ci0JCQlmaXJzdEVudHJ5ID0gbnVsbDsKLQkJCXJldHVybiBlbnRyeVJldHVybjsKLQkJfQotCi0JCXdoaWxlKG5leHRFbnRyeSA+IDApIHsKLQkJCWxvbmcgcmV0ID0gaW4uc2tpcChuZXh0RW50cnkpOwotCQkJaWYocmV0IDwgMCkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiZWFybHkgZW5kIG9mIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluZXh0RW50cnkgLT0gcmV0OwotCQkJYnl0ZXNyZWFkICs9IHJldDsKLQkJfQotCi0JCWludCBieXRlc3RvcmVhZCA9IDUxMjsKLQkJd2hpbGUoYnl0ZXN0b3JlYWQgPiAwKSB7Ci0JCQlpbnQgcmV0ID0gc3VwZXIucmVhZChoZWFkZXIsIDUxMiAtIGJ5dGVzdG9yZWFkLCBieXRlc3RvcmVhZCk7Ci0JCQlpZiggcmV0IDwgMCApIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oImVhcmx5IGVuZCBvZiBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnl0ZXN0b3JlYWQgLT0gcmV0OwotCQkJYnl0ZXNyZWFkICs9IHJldDsKLQkJfQotCi0JCS8vIElmIHdlIGhhdmUgYSBoZWFkZXIgb2YgYWxsIHplcm9zLCB0aGlzIG1hcmtzIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0JCWlmKGhlYWRlckNoZWNrc3VtKGhlYWRlcikgPT0gMCkgewotCQkJLy8gV2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0JCQlpZihmaWxlcG9zID4gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBJbnZhbGlkIHN0cmVhbS4KLQkJCXRocm93IG5ldyBUYXJFeGNlcHRpb24oIm5vdCBpbiB0YXIgZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLy8gVmFsaWRhdGUgY2hlY2tzdW0uCi0JCWlmKCFpc1ZhbGlkVGFySGVhZGVyKGhlYWRlcikpIHsKLQkJCXRocm93IG5ldyBUYXJFeGNlcHRpb24oIm5vdCBpbiB0YXIgZm9ybWF0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXdoaWxlIChwb3MgPCAxMDAgJiYgaGVhZGVyW3Bvc10gIT0gMCkgewotCQkJcG9zKys7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBuZXcgU3RyaW5nKGhlYWRlciwgMCwgcG9zLCAiVVRGOCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFByZXBlbmQgdGhlIHByZWZpeCBoZXJlLgotCQlwb3MgPSAzNDU7Ci0JCWlmKGhlYWRlcltwb3NdICE9IDApIHsKLQkJCXdoaWxlIChwb3MgPCA1MDAgJiYgaGVhZGVyW3Bvc10gIT0gMCkgewotCQkJCXBvcysrOwotCQkJfQotCQkJU3RyaW5nIHByZWZpeCA9IG5ldyBTdHJpbmcoaGVhZGVyLCAzNDUsIHBvcyAtIDM0NSwgIlVURjgiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IHByZWZpeCArICIvIiArIG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJVGFyRW50cnkgZW50cnk7Ci0JCWlmKGxvbmdMaW5rTmFtZSAhPSBudWxsKSB7Ci0JCQllbnRyeSA9IG5ldyBUYXJFbnRyeShsb25nTGlua05hbWUsIGZpbGVwb3MpOwotCQkJbG9uZ0xpbmtOYW1lID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCWVudHJ5ID0gbmV3IFRhckVudHJ5KG5hbWUsIGZpbGVwb3MpOwotCQl9Ci0JCWlmKGhlYWRlclsxNTZdICE9IDApIHsKLQkJCWVudHJ5LnNldEZpbGVUeXBlKGhlYWRlclsxNTZdKTsKLQkJfQotCQkKLQkJcG9zID0gMTAwOwotCQlTdHJpbmdCdWZmZXIgbW9kZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlpZihoZWFkZXJbcG9zICsgaV0gPT0gMCkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoaGVhZGVyW3BvcyArIGldID09ICcgJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbW9kZS5hcHBlbmQoKGNoYXIpIGhlYWRlcltwb3MgKyBpXSk7Ci0JCX0KLQkJaWYobW9kZS5sZW5ndGgoKSA+IDAgJiYgbW9kZS5jaGFyQXQoMCkgIT0gJzAnKSB7Ci0JCQltb2RlLmluc2VydCgwLCAnMCcpOwotCQl9Ci0JCXRyeSB7Ci0JCQlsb25nIGZpbGVNb2RlID0gTG9uZy5kZWNvZGUobW9kZS50b1N0cmluZygpKS5sb25nVmFsdWUoKTsKLQkJCWVudHJ5LnNldE1vZGUoZmlsZU1vZGUpOwotCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsgLy8gVE9ETwotCQkJdGhyb3cgbmV3IFRhckV4Y2VwdGlvbigiVGFySW1wb3J0X2ludmFsaWRfdGFyX2Zvcm1hdCIgKyBuZmUpOwotCQl9Ci0JCQotCQlwb3MgPSAxMDAgKyAyNDsKLQkJU3RyaW5nQnVmZmVyIHNpemUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcihpID0gMDsgaSA8IDEyOyBpKyspIHsKLQkJCWlmKGhlYWRlcltwb3MgKyBpXSA9PSAwKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZihoZWFkZXJbcG9zICsgaV0gPT0gJyAnKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlzaXplLmFwcGVuZCgoY2hhcikgaGVhZGVyW3BvcyArIGldKTsKLQkJfQotCQlpZihzaXplLmNoYXJBdCgwKSAhPSAnMCcpIHsKLQkJCXNpemUuaW5zZXJ0KDAsICcwJyk7Ci0JCX0KLQkJaW50IGZpbGVTaXplOwotCQl0cnkgewotCQkJZmlsZVNpemUgPSBJbnRlZ2VyLmRlY29kZShzaXplLnRvU3RyaW5nKCkpLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeyAvLyBUT0RPCi0JCQl0aHJvdyBuZXcgVGFyRXhjZXB0aW9uKCJEYXRhVHJhbnNmZXJNZXNzYWdlcy5UYXJJbXBvcnRfaW52YWxpZF90YXJfZm9ybWF0IiArIG5mZSk7Ci0JCX0KLQotCQllbnRyeS5zZXRTaXplKGZpbGVTaXplKTsKLQkJbmV4dEVPRiA9IGZpbGVTaXplOwotCQlpZihmaWxlU2l6ZSAlIDUxMiA+IDApIHsKLQkJCW5leHRFbnRyeSA9IGZpbGVTaXplICsgKDUxMiAtIChmaWxlU2l6ZSAlIDUxMikpOwotCQl9IGVsc2UgewotCQkJbmV4dEVudHJ5ID0gZmlsZVNpemU7Ci0JCX0KLQkJZmlsZXBvcyArPSAobmV4dEVudHJ5ICsgNTEyKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIE1vdmVzIGFoZWFkIHRvIHRoZSBuZXh0IGZpbGUgaW4gdGhlIHRhciBhcmNoaXZlIGFuZCByZXR1cm5zCi0JICogYSBUYXJFbnRyeSBvYmplY3QgZGVzY3JpYmluZyBpdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IGVudHJ5IGluIHRoZSB0YXIgZmlsZQotCSAqIEB0aHJvd3MgVGFyRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBUYXJFbnRyeSBnZXROZXh0RW50cnkoKSB0aHJvd3MgVGFyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCVRhckVudHJ5IGVudHJ5ID0gZ2V0TmV4dEVudHJ5SW50ZXJuYWwoKTsKLQotCQlpZihlbnRyeSAhPSBudWxsICYmIGVudHJ5LmdldE5hbWUoKS5lcXVhbHMoIi4vLi9ATG9uZ0xpbmsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbiBmb3IgZG9pbmcgbG9uZyBmaWxlbmFtZXMuCi0JCQkvLyBXZSBnZXQgYSBmaWxlIGNhbGxlZCAuLy4vQExvbmdMaW5rIHdoaWNoIGp1c3QgY29udGFpbnMKLQkJCS8vIHRoZSByZWFsIHBhdGhuYW1lLgotCQkJYnl0ZVtdIGxvbmdOYW1lRGF0YSA9IG5ldyBieXRlWyhpbnQpIGVudHJ5LmdldFNpemUoKV07Ci0JCQlpbnQgYnl0ZXNyZWFkMiA9IDA7Ci0JCQl3aGlsZSAoYnl0ZXNyZWFkMiA8IGxvbmdOYW1lRGF0YS5sZW5ndGgpIHsKLQkJCQlpbnQgY3VyID0gcmVhZChsb25nTmFtZURhdGEsIGJ5dGVzcmVhZDIsIGxvbmdOYW1lRGF0YS5sZW5ndGggLSBieXRlc3JlYWQpOwotCQkJCWlmIChjdXIgPCAwKSB7Ci0JCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiZWFybHkgZW5kIG9mIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWJ5dGVzcmVhZDIgKz0gY3VyOwotCQkJfQotCi0JCQlpbnQgcG9zID0gMDsKLQkJCXdoaWxlIChwb3MgPCBsb25nTmFtZURhdGEubGVuZ3RoICYmIGxvbmdOYW1lRGF0YVtwb3NdICE9IDApIHsKLQkJCQlwb3MrKzsKLQkJCX0KLQkJCWxvbmdMaW5rTmFtZSA9IG5ldyBTdHJpbmcobG9uZ05hbWVEYXRhLCAwLCBwb3MsICJVVEY4Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBnZXROZXh0RW50cnlJbnRlcm5hbCgpOwotCQl9Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI3JlYWQoYnl0ZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKG5leHRFT0YgPT0gMCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmKGxlbiA+IG5leHRFT0YpIHsKLQkJCWxlbiA9IG5leHRFT0Y7Ci0JCX0KLQkJaW50IHNpemUgPSBzdXBlci5yZWFkKGIsIG9mZiwgbGVuKTsKLQkJbmV4dEVudHJ5IC09IHNpemU7Ci0JCW5leHRFT0YgLT0gc2l6ZTsKLQkJYnl0ZXNyZWFkICs9IHNpemU7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVsxXTsKLQkJaW50IHNpemUgPSByZWFkKGRhdGEsIDAsIDEpOwotCQlpZiAoc2l6ZSA8IDApIHsKLQkJCXJldHVybiBzaXplOwotCQl9Ci0JCXJldHVybiBkYXRhWzBdOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9DbGllbnREZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvQ2xpZW50RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwMzFkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9DbGllbnREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIEEgbGF1bmNoYWJsZSBjbGllbnQgaXMgYSBjbGllbnQgc2lkZSBhcHBsaWNhdGlvbiBvciB0ZXN0IGhhcm5lc3MgdGhhdCBjYW4KLSAqIGJlIGxhdW5jaGVkIChydW4pIGFnYWluc3QgYSByZXNvdXJjZSBydW5uaW5nIG9uIGEgc2VydmVyLgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5jbGllbnRzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENsaWVudERlbGVnYXRlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBsYXVuY2hhYmxlIGNhbiBiZSBydW4gYnkgdGhpcyBjbGllbnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRoYXQgdGhlIGNsaWVudCBpcyBiZWluZyBydW4gYWdhaW5zdAotCSAqIEBwYXJhbSBsYXVuY2hhYmxlIHRoZSBvYmplY3QgdG8gcnVuIG9uIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSB0aGUgbGF1bmNoIG1vZGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbGllbnQgc3VwcG9ydHMgdGhpcyBjb21iaW5hdGlvbiwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgb3IgZXhlY3V0ZXMgb24gdGhlIGxhdW5jaGFibGUuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRoYXQgdGhlIGNsaWVudCBpcyBiZWluZyBydW4gYWdhaW5zdAotCSAqIEBwYXJhbSBsYXVuY2hhYmxlIHRoZSBvYmplY3QgdG8gcnVuIG9uIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSB0aGUgbGF1bmNoIG1vZGUKLQkgKiBAcGFyYW0gbGF1bmNoIHRoZSBsYXVuY2ggb2YgdGhlIHNlcnZlciwgaWYgYXZhaWxhYmxlCi0JICogQHJldHVybiBzdGF0dXMgaW5kaWNhdGluZyB3aGF0IChpZiBhbnl0aGluZykgd2VudCB3cm9uZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIGxhdW5jaChJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTGF1bmNoIGxhdW5jaCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZUZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWNjNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0vKioKLSAqIEEgZmlsZSB3aXRoaW4gYSBtb2R1bGUuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlRmlsZSBleHRlbmRzIElNb2R1bGVSZXNvdXJjZSB7Ci0JLyoqCi0JICogUmV0dXJucyBhIG1vZGlmaWNhdGlvbiBzdGFtcC4gV2hlbmV2ZXIgdGhlIG1vZGlmaWNhdGlvbgotCSAqIHN0YW1wIGNoYW5nZXMsIHRoZXJlIG1heSBoYXZlIGJlZW4gYSBjaGFuZ2UgdG8gdGhlIGZpbGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlRm9sZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhN2UwMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZUZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLS8qKgotICogQSBmb2xkZXIgd2l0aGluIGEgbW9kdWxlLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZUZvbGRlciBleHRlbmRzIElNb2R1bGVSZXNvdXJjZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVtYmVycyAoY29udGVudHMpIG9mIHRoaXMgZm9sZGVyLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbW9kdWxlIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhpcyBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gbWVtYmVycygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjk2NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotLyoqCi0gKiBBIHJlc291cmNlIChmaWxlIG9yIGZvbGRlcikgd2l0aGluIGEgbW9kdWxlLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZVJlc291cmNlIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHJlbGF0aXZlIHBhdGggdG8gdGhpcyByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgcmVsYXRpdmUgcGF0aCB0byB0aGlzIHJlc291cmNlCi0JICovCi0JcHVibGljIElQYXRoIGdldE1vZHVsZVJlbGF0aXZlUGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVSZXNvdXJjZURlbHRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlUmVzb3VyY2VEZWx0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzQ1MDgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVSZXNvdXJjZURlbHRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotLyoqCi0gKiBBIG1vZHVsZSByZXNvdXJjZSBkZWx0YS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVSZXNvdXJjZURlbHRhIHsKLQkvKioKLQkgKiBLaW5kIGNvbnN0YW50ICh2YWx1ZSAwKSBmb3Igbm8gY2hhbmdlLgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0NIQU5HRSA9IDA7Ci0KLQkvKioKLQkgKiBLaW5kIGNvbnN0YW50ICh2YWx1ZSAxKSBmb3IgYWRkZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEREVEID0gMTsKLQotCS8qKgotCSAqIEtpbmQgY29uc3RhbnQgKHZhbHVlIDIpIGZvciBjaGFuZ2VkIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEID0gMjsKLQotCS8qKgotCSAqIEtpbmQgY29uc3RhbnQgKHZhbHVlIDMpIGZvciByZW1vdmVkIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEID0gMzsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSByZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGlzIGRlbHRhLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIHJlc291cmNlCi0JICovCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZSBnZXRNb2R1bGVSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUga2luZCBvZiB0aGlzIHJlc291cmNlIGRlbHRhLgotCSAqIE5vcm1hbGx5LCBvbmUgb2YgPGNvZGU+QURERUQ8L2NvZGU+LCAKLQkgKiA8Y29kZT5SRU1PVkVEPC9jb2RlPiwgPGNvZGU+Q0hBTkdFRDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUga2luZCBvZiB0aGlzIHJlc291cmNlIGRlbHRhCi0JICogCi0JICogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNBRERFRAotCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlRGVsdGEjUkVNT1ZFRAotCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlRGVsdGEjQ0hBTkdFRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBtb2R1bGUgcmVzb3VyY2UgZGVsdGFzIGZvciBhbGwgY2hpbGRyZW4gb2YgdGhpcyByZXNvdXJjZSAKLQkgKiB3aGljaCB3ZXJlIGFkZGVkLCByZW1vdmVkLCBvciBjaGFuZ2VkLiBSZXR1cm5zIGFuIGVtcHR5Ci0JICogYXJyYXkgaWYgdGhlcmUgYXJlIG5vIGFmZmVjdGVkIGNoaWxkcmVuLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QsIGZ1bGx5IGVxdWl2YWxlbnQgdG86Ci0JICogPHByZT4KLQkgKiAgIGdldEFmZmVjdGVkQ2hpbGRyZW4oQURERUQgfCBSRU1PVkVEIHwgQ0hBTkdFRCwgSVJlc291cmNlLk5PTkUpOwotCSAqIDwvcHJlPgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIGRlbHRhcyBmb3IgYWxsIGFmZmVjdGVkIGNoaWxkcmVuCi0JICogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNBRERFRAotCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlRGVsdGEjUkVNT1ZFRAotCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlRGVsdGEjQ0hBTkdFRAotCSAqLwotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUtcmVsYXRpdmUgcGF0aCBvZiB0aGlzIHJlc291cmNlIGRlbHRhLgotCSAqIFJldHVybnMgdGhlIGVtcHR5IHBhdGggZm9yIHJlc291cmNlcyBpbiB0aGUgbW9kdWxlIHJvb3QuCi0JICogPHA+Ci0JICogQSByZXNvdXJjZSdzIG1vZHVsZS1yZWxhdGl2ZSBwYXRoIGluZGljYXRlcyB0aGUgcm91dGUgZnJvbSB0aGUgbW9kdWxlCi0JICogdG8gdGhlIHJlc291cmNlLiBXaXRoaW4gYSBtb2R1bGUsIHRoZXJlIGlzIGV4YWN0bHkgb25lIHN1Y2ggcGF0aAotCSAqIGZvciBhbnkgZ2l2ZW4gcmVzb3VyY2UuIFRoZSByZXR1cm5lZCBwYXRoIG5ldmVyIGhhcyBhIHRyYWlsaW5nIHNlcGFyYXRvci4KLQkgKiA8L3A+Ci0JICogQHJldHVybiB0aGUgbW9kdWxlLXJlbGF0aXZlIHBhdGggb2YgdGhpcyByZXNvdXJjZSBkZWx0YQotCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlI2dldE1vZHVsZVJlbGF0aXZlUGF0aCgpCi0JICovCi0JcHVibGljIElQYXRoIGdldE1vZHVsZVJlbGF0aXZlUGF0aCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lVUkxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSVVSTFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NTczZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSVVSTFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIGEgc2VydmVyIGRlbGVnYXRlIHRoYXQgY2FuIHByb3ZpZGUgVVJMcyBmb3IgYSBtb2R1bGUgcHVibGlzaGVkCi0gKiB0byB0aGUgc2VydmVyLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVSTFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGJhc2UgVVJMIG9mIHRoaXMgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIuIChlLmcuIAotCSAqICJodHRwOi8vbG9jYWxob3N0OjgwODAvbXlQcm9qZWN0IikgCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsIGlmIHRoaXMgc2VydmVyIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBjb25maWd1cmF0aW9uCi0JICogb3IgaWYgdGhlIHNlcnZlciBpcyBub3QgcnVubmluZy4gVGhlIHJldHVybmVkIFVSTCBtdXN0IG5vdCBlbmQgaW4gYSB0cmFpbGluZwotCSAqIHNsYXNoLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbW9kdWxlIGlzIG51bGwsIHRoZSByZXR1cm5lZCBVUkwgd2lsbCBqdXN0IGJlIHRvIHRoZSByb290IG9mCi0JICogdGhlIHNlcnZlciAoZS5nLiAiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1vZHVsZSBpcyBub3QgYWxyZWFkeSBhZGRlZCB0byB0aGUgc2VydmVyLCB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuCi0JICogYXMgY2xvc2UgYW4gYXBwcm94aW1hdGlvbiBhcyBwb3NzaWJsZS4gKGZvciBpbnN0YW5jZSwgZm9yIGEgSjJFRSB3ZWIgcHJvamVjdAotCSAqIGl0IG1heSB1c2UgdGhlIHByb2plY3QncyBjb250ZXh0IHJvb3QsIHdoaWNoIG1heSBub3QgYmUgdGhlIHNhbWUgd2hlbiBkZXBsb3llZAotCSAqIHRvIGEgc2VydmVyKQotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgY29tLmlibS5ldG9vbHMuc2VydmVyLmNvcmUuSU1vZHVsZQotCSAqIEByZXR1cm4gamF2YS5uZXQuVVJMCi0JICovCi0JcHVibGljIFVSTCBnZXRNb2R1bGVSb290VVJMKElNb2R1bGUgbW9kdWxlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JbnRlcm5hbEluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JbnRlcm5hbEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZTQ0MWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSW50ZXJuYWxJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotLyoqCi0gKiBUaGlzIGlzIGFuIGludGVybmFsIHV0aWxpdHkgY2xhc3MgdGhhdCBpcyB1c2VkIGJ5IHRoZSBzZXJ2ZXIgZnJhbWV3b3JrLgotICogSXQgaXMgbm90IEFQSSBhbmQgc2hvdWxkIG5ldmVyIGJlIHVzZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGNsYXNzIEludGVybmFsSW5pdGlhbGl6ZXIgewotCS8qKgotCSAqIEludGVybmFsIG1ldGhvZCAtIGRvIG5vdCBjYWxsLgotCSAqIAotCSAqIEBwYXJhbSBkZWxlZ2F0ZQotCSAqIEBwYXJhbSBuZXdTZXJ2ZXIKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplU2VydmVyRGVsZWdhdGUoU2VydmVyRGVsZWdhdGUgZGVsZWdhdGUsIFNlcnZlciBuZXdTZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlkZWxlZ2F0ZS5pbml0aWFsaXplKG5ld1NlcnZlciwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwgbWV0aG9kIC0gZG8gbm90IGNhbGwuCi0JICogCi0JICogQHBhcmFtIGRlbGVnYXRlCi0JICogQHBhcmFtIG5ld1NlcnZlcgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZShTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSBkZWxlZ2F0ZSwgU2VydmVyIG5ld1NlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWRlbGVnYXRlLmluaXRpYWxpemUobmV3U2VydmVyLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBtZXRob2QgLSBkbyBub3QgY2FsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsZWdhdGUKLQkgKiBAcGFyYW0gbmV3UnVudGltZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVSdW50aW1lRGVsZWdhdGUoUnVudGltZURlbGVnYXRlIGRlbGVnYXRlLCBSdW50aW1lIG5ld1J1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlkZWxlZ2F0ZS5pbml0aWFsaXplKG5ld1J1bnRpbWUsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIG1ldGhvZCAtIGRvIG5vdCBjYWxsLgotCSAqIAotCSAqIEBwYXJhbSBkZWxlZ2F0ZQotCSAqIEBwYXJhbSBuZXdNb2R1bGVGYWN0b3J5Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZU1vZHVsZUZhY3RvcnlEZWxlZ2F0ZShNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZGVsZWdhdGUsIE1vZHVsZUZhY3RvcnkgbmV3TW9kdWxlRmFjdG9yeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWRlbGVnYXRlLmluaXRpYWxpemUobmV3TW9kdWxlRmFjdG9yeSwgbW9uaXRvcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmZDRlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9MYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIFRoaXMgaW50ZXJmYWNlLCB0eXBpY2FsbHkgaW1wbGVtZW50ZWQgYnkgdGhlIHNlcnZlciBjb2RlLCBjb252ZXJ0cyBmcm9tCi0gKiBhbiBJTW9kdWxlQXJ0aWZhY3QgdG8gYW4gb2JqZWN0IGxhdW5jaGFibGUgb24gdGhlIHNlcnZlci4KLSAqIAotICogPHA+VGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBsYXVuY2hhYmxlQWRhcHRlciBleHRlbnNpb24gcG9pbnQuPC9wPgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5sYXVuY2hhYmxlQWRhcHRlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSB7Ci0JLyoqCi0JICogUmV0dXJucyBhIGxhdW5jaGFibGUgb2JqZWN0IGZyb20gdGhpcyBtb2R1bGUgYXJ0aWZhY3QuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZUFydGlmYWN0IGEgbW9kdWxlIGFydGlmYWN0Ci0JICogW2lzc3VlOiBpZiB0aGUgbGF1bmNoYWJsZSBvYmplY3QgY2Fubm90IGJlIGZvdW5kLCBzaG91bGQgaXQgdGhyb3cgYSBDb3JlRXhjcGV0aW9uIG9yIHJldHVybiBudWxsP10KLQkgKiBAcmV0dXJuIHRoZSBsYXVuY2hhYmxlIG9iamVjdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZG9pbmcgdGhlIGNvbnZlcnNpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL01vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTU0NzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLS8qKgotICogQSBtb2R1bGUgYXJ0aWZhY3QgYWRhcHRlciBjb252ZXJ0cyBmcm9tIHNvbWUgdmlldydzIG1vZGVsCi0gKiBvYmplY3QgaW50byBhIG1vZHVsZSBhcnRpZmFjdCB0aGF0IGlzIHJlY29nbml6ZWQgYnkgb25lIG9yCi0gKiBtb3JlIHNlcnZlciB0eXBlcy4KLSAqIAotICogPHA+VGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAqIGV4dGVuc2lvbiBwb2ludC48L3A+Ci0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCi0gKiB0byBleHRlbmQgdGhlIDxjb2RlPm1vZHVsZUFydGlmYWN0QWRhcHRlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgewotCS8qKgotCSAqIENvbnZlcnRzIGZyb20gYW4gYXJiaXRyYXJ5IG9iamVjdCB0byBhbiBtb2R1bGUgYXJ0aWZhY3QuCi0JICoKLQkgKiBAcGFyYW0gb2JqIGFuIGFyYml0cmFyeSBvYmplY3QgZnJvbSBhIHZpZXcgb3IgZWRpdG9yCi0JICogQHJldHVybiBhbiBtb2R1bGUgYXJ0aWZhY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMKLQkgKiAgICBhZGFwdGVyIGRvZXMgbm90IHJlY29nbml6ZSBvciBjYW5ub3QgYWRhcHQgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlQXJ0aWZhY3QoT2JqZWN0IG9iaik7Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBmcm9tIGFuIGFyYml0cmFyeSBvYmplY3QgdG8gYW4gbW9kdWxlIGFydGlmYWN0LgotCSAqCi0JICogQHBhcmFtIG9iaiBhbiBhcmJpdHJhcnkgb2JqZWN0IGZyb20gYSB2aWV3IG9yIGVkaXRvcgotCSAqIEByZXR1cm4gYW4gbW9kdWxlIGFydGlmYWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzCi0JICogICAgYWRhcHRlciBkb2VzIG5vdCByZWNvZ25pemUgb3IgY2Fubm90IGFkYXB0IHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZUFydGlmYWN0W10gZ2V0TW9kdWxlQXJ0aWZhY3RzKE9iamVjdCBvYmopIHsKLQkJSU1vZHVsZUFydGlmYWN0IGFydGlmYWN0ID0gZ2V0TW9kdWxlQXJ0aWZhY3Qob2JqKTsKLQkJaWYgKGFydGlmYWN0ICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IElNb2R1bGVBcnRpZmFjdFtdIHsgYXJ0aWZhY3QgfTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL01vZHVsZUFydGlmYWN0RGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL01vZHVsZUFydGlmYWN0RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzYzg1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9Nb2R1bGVBcnRpZmFjdERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0vKioKLSAqIEEgbW9kdWxlIGFydGlmYWN0IGlzIGEgcmVzb3VyY2Ugd2l0aGluIGEgbW9kdWxlLCB3aGljaCBjYW4gYmUgbGF1bmNoZWQKLSAqIG9uIHRoZSBzZXJ2ZXIuIEV4YW1wbGVzIG9mIG1vZHVsZSBhcnRpZmFjdHMgYXJlIHNlcnZsZXRzLCBIVE1MIHBhZ2VzLAotICogb3IgRUpCIGJlYW5zLgotICogPHA+Ci0gKiBPYmplY3RzIHRoYXQgcHJvdmlkZSBhbiBhZGFwdGVyIHRvIHRoaXMgdHlwZSB3aWxsIGJlIGNvbnNpZGVyZWQgYnkgdGhlCi0gKiBjb250ZXh0dWFsIFJ1biBvbiBTZXJ2ZXIgbGF1bmNoIHN1cHBvcnQuICAKLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBzaG91bGQgcHJvdmlkZSBhIGRlZmF1bHQgKG5vLWFyZykgY29uc3RydWN0b3IsIGltcGxlbWVudAotICogdGhlIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBtZXRob2RzLCBhbmQgcHJvdmlkZSBhIHVzZWZ1bCBuYW1lLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSBpbXBsZW1lbnRzIElNb2R1bGVBcnRpZmFjdCB7Ci0JcHJpdmF0ZSBJTW9kdWxlIG1vZHVsZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBtb2R1bGUgYXJ0aWZhY3QuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqLwotCXB1YmxpYyBNb2R1bGVBcnRpZmFjdERlbGVnYXRlKElNb2R1bGUgbW9kdWxlKSB7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBtb2R1bGUgYXJ0aWZhY3QuCi0JICovCi0JcHVibGljIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kdWxlQXJ0aWZhY3QjZ2V0TW9kdWxlKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZSBnZXRNb2R1bGUoKSB7Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHVzZXItcHJlc2VudGFibGUgbmFtZSBmb3IgdGhpcyBhcnRpZmFjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdXNlci1wcmVzZW50YWJsZSBuYW1lCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXJpYWxpemUgdGhpcyBvYmplY3QgaW50byBhIHN0cmluZy4KLQkgKiAgCi0JICogQHJldHVybiBhIHNlcmlhbGl6ZWQgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBzZXJpYWxpemUoKSB7Ci0JCXJldHVybiBtb2R1bGUuZ2V0SWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXNlcmlhbGl6ZSB0aGlzIG9iamVjdCBmcm9tIGEgc2VyaWFsaXplZCBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHMgYSBzZXJpYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShTdHJpbmcgcykgewotCQl0aGlzLm1vZHVsZSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlKHMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9Nb2R1bGVEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzZjdjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9Nb2R1bGVEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0vKioKLSAqIEEgbW9kdWxlIGRlbGVnYXRlIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBkaXNjb3ZlcmluZyBpbmZvcm1hdGlvbgotICogYWJvdXQgaW5kaXZpZHVhbCBtb2R1bGVzLiBNb2R1bGVzIGFyZSByZXR1cm5lZCBmcm9tIG1vZHVsZSBmYWN0b3J5Ci0gKiBkZWxlZ2F0ZXM7IHRoZWlyIGRlbGVnYXRlcyBhcmUgY3JlYXRlZCB3aGVuCi0gKiBNb2R1bGVGYWN0b3J5RGVsZWdhdGUuY3JlYXRlTW9kdWxlKCkgaXMgY2FsbGVkLgotICogPHA+Ci0gKiBXaGVuIHRoZSBtb2R1bGUgbmVlZHMgdG8gYmUgZ2l2ZW4gYSBkZWxlZ2F0ZSwgdGhlIGRlbGVnYXRlIGNsYXNzCi0gKiBzcGVjaWZpZWQgZm9yIHRoZSBtb2R1bGUgaXMgaW5zdGFudGlhdGVkIHdpdGggYSAwLWFyZ3VtZW50Ci0gKiBjb25zdHJ1Y3Rvci4KLSAqIDwvcD4KLSAqIDxwPgotICogTW9kdWxlIGRlbGVnYXRlcyBtYXkga2VlcCBzdGF0ZSBpbiBpbnN0YW5jZSBmaWVsZHMsIGJ1dCB0aGF0IHN0YXRlIGlzCi0gKiB0cmFuc2llbnQgYW5kIHdpbGwgbm90IGJlIHBlcnNpc3RlZCBhY3Jvc3Mgd29ya2JlbmNoIHNlc3Npb25zLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5tb2R1bGVGYWN0b3JpZXM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZQotICogQHNlZSBNb2R1bGVGYWN0b3J5RGVsZWdhdGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZHVsZURlbGVnYXRlIHsKLQlwcml2YXRlIElNb2R1bGUgbW9kdWxlOwotCi0JLyoqCi0JICogRGVsZWdhdGVzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlRGVsZWdhdGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIG1vZHVsZSBkZWxlZ2F0ZSB3aXRoIGl0cyBsaWZlLWxvbmcgbW9kdWxlIGluc3RhbmNlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdNb2R1bGUgdGhlIG1vZHVsZSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGluaXRpYWxpemUoSU1vZHVsZSBuZXdNb2R1bGUpIHsKLQkJdGhpcy5tb2R1bGUgPSBuZXdNb2R1bGU7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIG1vZHVsZSBkZWxlZ2F0ZS4gVGhpcyBtZXRob2QgZ2l2ZXMgZGVsZWdhdGVzIGEgY2hhbmNlCi0JICogdG8gZG8gdGhlaXIgb3duIGluaXRpYWxpemF0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgdGhhdCB0aGlzIG1vZHVsZSBkZWxlZ2F0ZSBjb3JyZXNwb25kcyB0by4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZSBnZXRNb2R1bGUoKSB7Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoaXMgbW9kdWxlIGluc3RhbmNlLiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG92ZXJyaWRlIGFuZCBjYWxsIHN1cGVyLnZhbGlkYXRlKCkgZm9yIGJhc2ljIHZhbGlkYXRpb24uIAotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGlzCi0JICogICBtb2R1bGUgaXMgdmFsaWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzCi0JICogICB3cm9uZyB3aXRoIGl0Ci0JICovCi0JcHVibGljIGFic3RyYWN0IElTdGF0dXMgdmFsaWRhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoaWxkIG1vZHVsZXMgb2YgdGhpcyBtb2R1bGUuCi0JICoKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgY2hpbGQgbW9kdWxlcwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBhcnJheSBvZiBtb2R1bGUgYXJ0aWZhY3RzLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBjb250YWluaW5nIHRoZSBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHRocm93biBpZiB0aGVyZSBpcyBhIHByb2JsZW0gZ2V0dGluZyB0aGUgbWVtYmVycwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9Nb2R1bGVGYWN0b3J5RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwZWE4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9Nb2R1bGVGYWN0b3J5RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZhY3Rvcnk7Ci0vKioKLSAqIEEgbW9kdWxlIGZhY3RvcnkgZGVsZWdhdGUgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGRpc2NvdmVyaW5nCi0gKiBtb2R1bGVzLiBBIG1vZHVsZSBmYWN0b3J5IGRlbGVnYXRlIGlzIHNwZWNpZmllZCBieSB0aGUKLSAqIDxjb2RlPmNsYXNzPC9jb2RlPiBhdHRyaWJ1dGUgb2YgYSA8Y29kZT5tb2R1bGVGYWN0b3JpZXM8L2NvZGU+IGV4dGVuc2lvbi4KLSAqIDxwPgotICogV2hlbiB0aGUgbW9kdWxlIGZhY3RvcnkgbmVlZHMgdG8gYmUgZ2l2ZW4gYSBkZWxlZ2F0ZSwgdGhlIGRlbGVnYXRlIGNsYXNzCi0gKiBzcGVjaWZpZWQgZm9yIHRoZSBtb2R1bGUgZmFjdG9yeSBpcyBpbnN0YW50aWF0ZWQgd2l0aCBhIDAtYXJndW1lbnQKLSAqIGNvbnN0cnVjdG9yLgotICogPC9wPgotICogPHA+Ci0gKiBNb2R1bGUgZmFjdG9yeSBkZWxlZ2F0ZXMgbWF5IGtlZXAgc3RhdGUgaW4gaW5zdGFuY2UgZmllbGRzLCBidXQgdGhhdCBzdGF0ZSBpcwotICogdHJhbnNpZW50IGFuZCB3aWxsIG5vdCBiZSBwZXJzaXN0ZWQgYWNyb3NzIHdvcmtiZW5jaCBzZXNzaW9ucy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+bW9kdWxlRmFjdG9yaWVzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUKLSAqIEBzZWUgTW9kdWxlRGVsZWdhdGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBNb2R1bGVGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBEZWxlZ2F0ZXMgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBNb2R1bGVGYWN0b3J5RGVsZWdhdGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIG1vZHVsZSBmYWN0b3J5IGRlbGVnYXRlIHdpdGggaXRzIGxpZmUtbG9uZyBtb2R1bGUKLQkgKiBmYWN0b3J5IGluc3RhbmNlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdGYWN0b3J5IHRoZSBtb2R1bGUgZmFjdG9yeSBpbnN0YW5jZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKi8KLQlmaW5hbCB2b2lkIGluaXRpYWxpemUoTW9kdWxlRmFjdG9yeSBuZXdGYWN0b3J5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmFjdG9yeSA9IG5ld0ZhY3Rvcnk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIG1vZHVsZSBmYWN0b3J5IGRlbGVnYXRlLiBUaGlzIG1ldGhvZCBnaXZlcyBkZWxlZ2F0ZXMgYSBjaGFuY2UKLQkgKiB0byBkbyB0aGVpciBvd24gaW5pdGlhbGl6YXRpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgZmFjdG9yeS4KLQkgKiBFYWNoIGZhY3RvcnkgaGFzIGEgZGlzdGluY3QgaWQsIGZpeGVkIGZvciBpdHMgbGlmZXRpbWUuIElkcyBhcmUgaW50ZW5kZWQgdG8KLQkgKiBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsgdGhleSBhcmUgbm90IGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IGlkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGZhY3RvcnkuZ2V0SWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGNhY2hlIG9mIG1vZHVsZXMgcmV0dXJuZWQgYnkgZ2V0TW9kdWxlcygpLiBEZWxlZ2F0ZXMgY2FuIGNhbGwgdGhpcwotCSAqIG1ldGhvZCBpZiB0aGV5IGtub3cgdGhhdCB0aGUgcmVzdWx0cyBvZiBnZXRNb2R1bGVzKCkgaXMgaW52YWxpZCBhbmQgc2hvdWxkIGJlCi0JICogcmVmcmVzaGVkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGFuZCBuZXZlciBjYWxsZWQgYnkgdGhlCi0JICogICAgZnJhbWV3b3JrLiBJdCBzaG91bGRuJ3QgYmUgcGFydCBvZiB0aGUgcHVibGljIEFQSSwgYnV0IHN1YmNsYXNzZXMgYXJlIHN0aWxsCi0JICogICAgd2VsY29tZSB0byBwcm92aWRlIHRoZWlyIG93biBtZXRob2QgdG8gY2xlYXIgdGhlIGNhY2hlLgotCSAqIEBzZWUgI2dldE1vZHVsZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyTW9kdWxlQ2FjaGUoKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBtb2R1bGUgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gc3RhdGljIGluZm9ybWF0aW9uLiBUaGlzIG1ldGhvZCBpcyB1c2VkCi0JICogYnkgbW9kdWxlIGZhY3RvcnkgZGVsZWdhdGVzIHRvIGNyZWF0ZSBtb2R1bGUgaW5zdGFuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgbW9kdWxlIGlkCi0JICogQHBhcmFtIG5hbWUgdGhlIG1vZHVsZSBuYW1lCi0JICogQHBhcmFtIHR5cGUgdGhlIG1vZHVsZSB0eXBlIGlkCi0JICogQHBhcmFtIHZlcnNpb24gdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCB0aGUgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbgotCSAqIEByZXR1cm4gYSBtb2R1bGUgaW5zdGFuY2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSU1vZHVsZSBjcmVhdGVNb2R1bGUoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgTW9kdWxlKGZhY3RvcnksIGlkLCBuYW1lLCB0eXBlLCB2ZXJzaW9uLCBwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtb2R1bGUgZGVsZWdhdGUgZm9yIGEgbW9kdWxlIHdpdGggdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgY2xpZW50IG5lZWRzIHRvIGFjY2VzcyB0aGUgbW9kdWxlIGRlbGVnYXRlCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBkZWxlZ2F0ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBNb2R1bGVEZWxlZ2F0ZSBnZXRNb2R1bGVEZWxlZ2F0ZShJTW9kdWxlIG1vZHVsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIG1vZHVsZXMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vcm1hbGx5IGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIChvdGhlciB0aGFuIHRoZSBkZWxlZ2F0ZSkgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBtb2R1bGVzIHtAbGluayBJTW9kdWxlfQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTW9kdWxlW10gZ2V0TW9kdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBtb2R1bGVzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5IHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlCi0JICogZ2l2ZW4gcHJvamVjdC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3QgbmVlZAotCSAqIHRvIGZpbHRlciB0aHJvdWdoIHRoZSBlbnRpcmUgcHJvamVjdCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vcm1hbGx5IGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIChvdGhlciB0aGFuIHRoZSBkZWxlZ2F0ZSkgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBtb2R1bGVzIHtAbGluayBJTW9kdWxlfQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlJTW9kdWxlW10gbW9kdWxlcyA9IGdldE1vZHVsZXMoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBtb2R1bGVzICE9IG51bGwpIHsKLQkJCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4obW9kdWxlcy5sZW5ndGgpOwotCQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHByb2plY3QuZXF1YWxzKG1vZHVsZXNbaV0uZ2V0UHJvamVjdCgpKSkKLQkJCQkJbGlzdC5hZGQobW9kdWxlc1tpXSk7Ci0JCQl9Ci0JCQkKLQkJCUlNb2R1bGVbXSBtID0gbmV3IElNb2R1bGVbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KG0pOwotCQkJcmV0dXJuIG07Ci0JCX0KLQkJCi0JCXJldHVybiBuZXcgSU1vZHVsZVswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkgdGhhdCBoYXMgdGhlIGdpdmVuIGlkLCBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIG1vZHVsZSB3aXRoIHRoZSBnaXZlbiBpZC4gVGhlIGlkIG11c3QKLQkgKiBub3QgYmUgbnVsbC4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCBuZWVkIHRvIHNlYXJjaAotCSAqIHRocm91Z2ggdGhlIGVudGlyZSBwcm9qZWN0IGxpc3QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vcm1hbGx5IGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIChvdGhlciB0aGFuIHRoZSBkZWxlZ2F0ZSkgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpZCBhIG1vZHVsZSBpZAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbW9kdWxlCi0JICogICAgY291bGQgYmUgZm91bmQge0BsaW5rIElNb2R1bGV9Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJTW9kdWxlIGZpbmRNb2R1bGUoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlcyA9IGdldE1vZHVsZXMoKTsKLQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU3RyaW5nIGlkMiA9IG1vZHVsZXNbaV0uZ2V0SWQoKTsKLQkJCQlpbnQgaW5kZXggPSBpZDIuaW5kZXhPZigiOiIpOwotCQkJCWlmIChpbmRleCA+PSAwKQotCQkJCQlpZDIgPSBpZDIuc3Vic3RyaW5nKGluZGV4KzEpOwotCQkJCQotCQkJCWlmIChpZC5lcXVhbHMoaWQyKSkKLQkJCQkJcmV0dXJuIG1vZHVsZXNbaV07Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9QdWJsaXNoT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9QdWJsaXNoT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDVkZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLS8qKgotICogQW4gb3BlcmF0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBkdXJpbmcgcHVibGlzaGluZy4gCi0gKiAKLSAqIFtpc3N1ZTogRVkgSXQgaXMgbm90IGNsZWFyIHRvIG1lIHRoYXQgd2hlbiB0aGlzIHRhc2sgd2lsbCBiZSBydW4uIFdpbGwgdGhlIHBsYWNlIHdoZXJlIHRoZQotICogdGFzayBpcyBiZWluZyBydW4gZGVwZW5kIG9uIHRoZSBzZXJ2ZXIsIGUuZy4gdGhlIFREQyB0YXNrcyBmb3IgdGhlIHY2IHNlcnZlciBzaG91bGQgYmUgcnVuCi0gKiBhZnRlciB0aGUgc2VydmVyIGlzIHN0YXJ0ZWQgdGhlIG1vZHVsZXMgYXJlIGFkZGVkIHRvIHRoZSBzZXJ2ZXI7IGhvd2V2ZXIsIHRoZSBFSkIgZGVwbG95IHRhc2sKLSAqIG1ha2VzIG1vcmUgc2Vuc2UgdG8gYmUgcnVuIGJlZm9yZSBhZGRpbmcgdGhlIHByb2plY3QgdG8gdGhlIHNlcnZlci5dCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFB1Ymxpc2hPcGVyYXRpb24gewotCXByaXZhdGUgVGFza01vZGVsIG1vZGVsOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0gICAvKioKLQkgKiBPcGVyYXRpb24ga2luZCBjb25zdGFudCAodmFsdWUgMCkgaW5kaWNhdGluZyB0aGF0IHRoZSBvcGVyYXRpb24KLQkgKiBkb2VzIG5vdCBuZWVkIGJlIGV4ZWN1dGVkLgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTkFMID0gMDsKLQotCS8qKgotCSAqIE9wZXJhdGlvbiBraW5kIGNvbnN0YW50ICh2YWx1ZSAxKSBpbmRpY2F0aW5nIHRoYXQgdGhlIG9wZXJhdGlvbgotCSAqIHNob3VsZCBiZSBleGVjdXRlZC4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVGRVJSRUQgPSAxOwotCi0JLyoqCi0JICogT3BlcmF0aW9uIGtpbmQgY29uc3RhbnQgKHZhbHVlIDIpIGluZGljYXRpbmcgdGhhdCB0aGUgb3BlcmF0aW9uCi0JICogbXVzdCBiZSBleGVjdXRlZC4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFRCA9IDI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgb3BlcmF0aW9uLiBUaGUgbGFiZWwgYW5kIGRlc2NyaXB0aW9uIG11c3QgYmUgc3VwcGxpZWQKLQkgKiBieSBvdmVycmlkaW5nIHRoZSBnZXRMYWJlbCgpIGFuZCBnZXREZXNjcmlwdGlvbigpIG1ldGhvZHMuCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcGVyYXRpb24oKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgb3BlcmF0aW9uIHdpdGggdGhlIGdpdmVuIGxhYmVsIGFuZCBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwgYSB0cmFuc2xhdGVkIGxhYmVsIGZvciB0aGUgb3BlcmF0aW9uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIHRoZSBvcGVyYXRpb24gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBraW5kIG9mIHRoaXMgb3BlcmF0aW9uLiBPcGVyYXRpb25zIGNhbiBlaXRoZXIgYmUgT1BUSU9OQUwKLQkgKiAoZG8gbm90IGhhdmUgdG8gYmUgZXhlY3V0ZWQpLCBQUkVGRVJSRUQgKHNob3VsZCBiZSBleGVjdXRlZCksIG9yCi0JICogUkVRVUlSRUQgKG11c3QgYmUgZXhlY3V0ZWQpLgotCSAqIAotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBraW5kIGNvbnN0YW50cyAoZS5nLiA8Y29kZT5SRVFVSVJFRDwvY29kZT4pCi0JICogICAgZGVjbGFyZWQgb24ge0BsaW5rIFB1Ymxpc2hPcGVyYXRpb259Ci0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4gT1BUSU9OQUw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3JkZXIgKGluZGV4L3ByaW9yaXR5KSBvZiB0aGUgdGFzayB0aGF0IHdpbGwgYmUgcnVuLiBUaGUgdGFzayB3aXRoCi0JICogYSBzbWFsbGVyIG9yZGVyIHZhbHVlIHdpbGwgYmUgcnVuIGJlZm9yZSB0aGUgdGFzayB3aXRoIGEgYmlnZ2VyIG9yZGVyIHZhbHVlLgotCSAqIEZvciB0YXNrcyB0aGF0IGhhdmUgdGhlIHNhbWUgb3JkZXIgdmFsdWUsIHRoZSBvcmRlciBvZiBydW5uaW5nIHRob3NlIHRhc2sgYXJlIAotCSAqIG5vdCBndWFyYW50ZWVkLiAgCi0JICogCi0JICogQHJldHVybiB0aGUgb3JkZXIgKGluZGV4L3ByaW9yaXR5KSBvZiB0aGUgdGFzayB0aGF0IHdpbGwgYmUgcnVuLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0T3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGlzIG9wZXJhdGlvbi4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBsYWJlbCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhpcyBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgb3BlcmF0aW9uLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGRlc2NyaXB0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhc2sgbW9kZWwuCi0JICogPHA+Ci0JICogQSB0YXNrIG1vZGVsIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdmVyYWxsIHRhc2sgZmxvdyBhbmQgYWxsb3dzCi0JICogdGFza3MgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGRhdGEuIEl0cyB1c2FnZSBhbGxvd3MgbXVsdGlwbGUgdGFza3MgdG8gYmUKLQkgKiBjaGFpbmVkIHRvZ2V0aGVyIGFuZCBzaGFyZSBkYXRhIGZyb20gdGhlIG91dHB1dCBvZiBvbmUgdGFzayB0byB0aGUgaW5wdXQKLQkgKiBvZiBhbm90aGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0YXNrIG1vZGVsCi0JICogQHNlZSAjc2V0VGFza01vZGVsKFRhc2tNb2RlbCkKLQkgKi8KLQlwdWJsaWMgVGFza01vZGVsIGdldFRhc2tNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGFzayBtb2RlbC4KLQkgKiA8cD4KLQkgKiBBIHRhc2sgbW9kZWwgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG92ZXJhbGwgdGFzayBmbG93IGFuZCBhbGxvd3MKLQkgKiB0YXNrcyB0byBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YS4gSXRzIHVzYWdlIGFsbG93cyBtdWx0aXBsZSB0YXNrcyB0byBiZQotCSAqIGNoYWluZWQgdG9nZXRoZXIgYW5kIHNoYXJlIGRhdGEgZnJvbSB0aGUgb3V0cHV0IG9mIG9uZSB0YXNrIHRvIHRoZSBpbnB1dAotCSAqIG9mIGFub3RoZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0YXNrTW9kZWwgdGhlIHRhc2sgbW9kZWwKLQkgKiBAc2VlICNnZXRUYXNrTW9kZWwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSB0YXNrTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSAocGVyZm9ybSkgdGhlIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHBhcmFtIGluZm8gdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUKLQkgKiAgICBjYWxsZXIgaW4gb3JkZXIgdG8gc3VwcGx5IFVJIGluZm9ybWF0aW9uIGZvciBwcm9tcHRpbmcgdGhlCi0JICogICAgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90Ci0JICogICAgPGNvZGU+bnVsbDwvY29kZT4sIGl0IHNob3VsZCBtaW5pbWFsbHkgY29udGFpbiBhbiBhZGFwdGVyCi0JICogICAgZm9yIHRoZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbC5jbGFzcy4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgdGFzawotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1B1Ymxpc2hUYXNrRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1B1Ymxpc2hUYXNrRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1MjczNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9QdWJsaXNoVGFza0RlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIEEgcHVibGlzaCB0YXNrIGRlbGVnYXRlLgotICogCi0gKiA8cD5UaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHB1Ymxpc2hUYXNrIGV4dGVuc2lvbiBwb2ludC48L3A+Ci0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCi0gKiB0byBleHRlbmQgdGhlIDxjb2RlPnB1Ymxpc2hUYXNrPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFB1Ymxpc2hUYXNrRGVsZWdhdGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhc2tzIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBkdXJpbmcgcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kdWxlcyBhIGxpc3QgY29udGFpbmluZyBJTW9kdWxlIGFycmF5cwotCSAqIEByZXR1cm4gdGhlIHRhc2tzIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiB0aGUgc2VydmVyLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uW10gZ2V0VGFza3MoSVNlcnZlciBzZXJ2ZXIsIExpc3QgbW9kdWxlcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXNrcyB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgZHVyaW5nIHB1Ymxpc2hpbmcuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZXMgYSBsaXN0IGNvbnRhaW5pbmcgSU1vZHVsZSBhcnJheXMKLQkgKiBAcGFyYW0ga2luZCBvbmUgb2YgdGhlIElTZXJ2ZXIuUFVCTElTSF9YWCBjb25zdGFudHMuCi0JICogQHBhcmFtIGtpbmRMaXN0IG9uZSBvZiB0aGUgSVNlcnZlciBwdWJsaXNoIGNoYW5nZSBjb25zdGFudHMuCi0JICogQHJldHVybiB0aGUgdGFza3MgdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIHRoZSBzZXJ2ZXIuCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcGVyYXRpb25bXSBnZXRUYXNrcyhJU2VydmVyIHNlcnZlciwgaW50IGtpbmQsIExpc3QgbW9kdWxlcywgTGlzdCBraW5kTGlzdCkgewotCQlyZXR1cm4gZ2V0VGFza3Moc2VydmVyLCBtb2R1bGVzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1B1Ymxpc2hlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Y2MzODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLS8qKgotICogQW4gb3BlcmF0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBkdXJpbmcgcHVibGlzaGluZy4gCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAzLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFB1Ymxpc2hlckRlbGVnYXRlIHsKLQlwcml2YXRlIFRhc2tNb2RlbCBtb2RlbDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBvcGVyYXRpb24uIFRoZSBsYWJlbCBhbmQgZGVzY3JpcHRpb24gbXVzdCBiZSBzdXBwbGllZAotCSAqIGJ5IG92ZXJyaWRpbmcgdGhlIGdldExhYmVsKCkgYW5kIGdldERlc2NyaXB0aW9uKCkgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaGVyRGVsZWdhdGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhc2sgbW9kZWwuCi0JICogPHA+Ci0JICogQSB0YXNrIG1vZGVsIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdmVyYWxsIHRhc2sgZmxvdyBhbmQgYWxsb3dzCi0JICogdGFza3MgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGRhdGEuIEl0cyB1c2FnZSBhbGxvd3MgbXVsdGlwbGUgdGFza3MgdG8gYmUKLQkgKiBjaGFpbmVkIHRvZ2V0aGVyIGFuZCBzaGFyZSBkYXRhIGZyb20gdGhlIG91dHB1dCBvZiBvbmUgdGFzayB0byB0aGUgaW5wdXQKLQkgKiBvZiBhbm90aGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0YXNrIG1vZGVsCi0JICogQHNlZSAjc2V0VGFza01vZGVsKFRhc2tNb2RlbCkKLQkgKi8KLQlwdWJsaWMgVGFza01vZGVsIGdldFRhc2tNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGFzayBtb2RlbC4KLQkgKiA8cD4KLQkgKiBBIHRhc2sgbW9kZWwgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG92ZXJhbGwgdGFzayBmbG93IGFuZCBhbGxvd3MKLQkgKiB0YXNrcyB0byBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YS4gSXRzIHVzYWdlIGFsbG93cyBtdWx0aXBsZSB0YXNrcyB0byBiZQotCSAqIGNoYWluZWQgdG9nZXRoZXIgYW5kIHNoYXJlIGRhdGEgZnJvbSB0aGUgb3V0cHV0IG9mIG9uZSB0YXNrIHRvIHRoZSBpbnB1dAotCSAqIG9mIGFub3RoZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0YXNrTW9kZWwgdGhlIHRhc2sgbW9kZWwKLQkgKiBAc2VlICNnZXRUYXNrTW9kZWwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSB0YXNrTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSAocGVyZm9ybSkgdGhlIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBwdWJsaXNoIGJlaW5nIHJlcXVlc3RlZC4gVmFsaWQgdmFsdWVzIGFyZToKLQkgKiAgICA8dWw+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfRlVMTDwvY29kZT4tIGluZGljYXRlcyBhIGZ1bGwgcHVibGlzaC48L2xpPgotCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0lOQ1JFTUVOVEFMPC9jb2RlPi0gaW5kaWNhdGVzIGEgaW5jcmVtZW50YWwgcHVibGlzaC4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9DTEVBTjwvY29kZT4tIGluZGljYXRlcyBhIGNsZWFuIHJlcXVlc3QuIENsZWFuIHRocm93cwotCSAqICAgICAgb3V0IGFsbCBzdGF0ZSBhbmQgY2xlYW5zIHVwIHRoZSBtb2R1bGUgb24gdGhlIHNlcnZlciBiZWZvcmUgZG9pbmcgYQotCSAqICAgICAgZnVsbCBwdWJsaXNoLgotCSAqICAgIDwvdWw+Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEBwYXJhbSBpbmZvIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlCi0JICogICAgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZQotCSAqICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlcgotCSAqICAgIGZvciB0aGUgU2hlbGwgY2xhc3MuCi0JICogQHJldHVybiBzdGF0dXMgaW5kaWNhdGluZyB3aGF0IChpZiBhbnl0aGluZykgd2VudCB3cm9uZwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSB0YXNrCi0JICovCi0JcHVibGljIGFic3RyYWN0IElTdGF0dXMgZXhlY3V0ZShpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1J1bnRpbWVEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUnVudGltZURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ODBiYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUnVudGltZURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLS8qKgotICogQSBydW50aW1lIGRlbGVnYXRlIHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdmFyaW91cyAKLSAqIGdlbmVyaWMgYW5kIHNlcnZlci10eXBlLXNwZWNpZmljIG9wZXJhdGlvbnMgZm9yIGEgc3BlY2lmaWMgdHlwZSBvZiBydW50aW1lLgotICogQSBydW50aW1lIGRlbGVnYXRlIGlzIHNwZWNpZmllZCBieSB0aGUKLSAqIDxjb2RlPmNsYXNzPC9jb2RlPiBhdHRyaWJ1dGUgb2YgYSA8Y29kZT5ydW50aW1lVHlwZXM8L2NvZGU+IGV4dGVuc2lvbi4KLSAqIDxwPgotICogV2hlbiB0aGUgcnVudGltZSBpbnN0YW5jZSBuZWVkcyB0byBiZSBnaXZlbiBhIGRlbGVnYXRlLCB0aGUgZGVsZWdhdGUgY2xhc3MKLSAqIHNwZWNpZmllZCBmb3IgdGhlIHJ1bnRpbWUgdHlwZSBpcyBpbnN0YW50aWF0ZWQgd2l0aCBhIDAtYXJndW1lbnQgY29uc3RydWN0b3IKLSAqIGFuZCBwcmltZWQgd2l0aCA8Y29kZT5kZWxlZ2F0ZS5pbml0aWFsaXplKHJ1bnRpbWUpPC9jb2RlPiwgCi0gKiB3aGljaCBpdCBpcyBleHBlY3RlZCB0byBoYW5nIG9uIHRvLiBMYXRlciwgd2hlbgotICogPGNvZGU+ZGVsZWdhdGUuZGlzcG9zZSgpPC9jb2RlPiBpcyBjYWxsZWQgYXMgdGhlIHJ1bnRpbWUgaW5zdGFuY2UgaXMKLSAqIGJlaW5nIGRpc2NhcmRlZCwgdGhlIGRlbGVnYXRlIGlzIGV4cGVjdGVkIHRvIGxldCBnbyBvZiB0aGUgcnVudGltZSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqIDxwPgotICogUnVudGltZURlbGVnYXRlIHN1cHBvcnRzIGFuIG9wZW4tZW5kZWQgc2V0IG9mIGF0dHJpYnV0ZS12YWx1ZSBwYWlycy4gQWxsCi0gKiBzdGF0ZSBzdG9yZWQgaW4gdGhpcyBtYW5uZXIgd2lsbCBiZSBzYXZlZCB3aGVuIHRoZSBydW50aW1lIHdvcmtpbmcgY29weSBpcwotICogc2F2ZWQsIGFuZCBwZXJzaXN0ZWQgYWNyb3NzIHdvcmtiZW5jaCBzZXNzaW9ucy4KLSAqIFJ1bnRpbWUgZGVsZWdhdGVzIG1heSBrZWVwIHN0YXRlIGluIGluc3RhbmNlIGZpZWxkcywgYnV0IHRoYXQgc3RhdGUgaXMKLSAqIHRyYW5zaWVudCBhbmQgd2lsbCBub3QgYmUgcGVyc2lzdGVkIGFjcm9zcyB3b3JrYmVuY2ggc2Vzc2lvbnMuIFRvIHNhdmUgc3RhdGUKLSAqIGFjcm9zcyB3b3JrYmVuY2ggc2Vzc2lvbnMsIGl0IG11c3QgYmUgcGVyc2lzdGVkIHVzaW5nIHRoZSBhdHRyaWJ1dGVzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5ydW50aW1lVHlwZXM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBJUnVudGltZQotICogQHNlZSBJUnVudGltZVdvcmtpbmdDb3B5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSdW50aW1lRGVsZWdhdGUgewotCXByaXZhdGUgUnVudGltZSBydW50aW1lOwotCXByaXZhdGUgUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXQzsKLQkKLQkvKioKLQkgKiBEZWxlZ2F0ZXMgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBSdW50aW1lRGVsZWdhdGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHJ1bnRpbWUgZGVsZWdhdGUgd2l0aCBpdHMgbGlmZS1sb25nIHJ1bnRpbWUgaW5zdGFuY2UuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5ld1J1bnRpbWUgdGhlIHJ1bnRpbWUgaW5zdGFuY2UKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICovCi0JZmluYWwgdm9pZCBpbml0aWFsaXplKFJ1bnRpbWUgbmV3UnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJ1bnRpbWUgPSBuZXdSdW50aW1lOwotCQlpZiAocnVudGltZSBpbnN0YW5jZW9mIFJ1bnRpbWVXb3JraW5nQ29weSkKLQkJCXJ1bnRpbWVXQyA9IChSdW50aW1lV29ya2luZ0NvcHkpIHJ1bnRpbWU7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHJ1bnRpbWUgZGVsZWdhdGUuIFRoaXMgbWV0aG9kIGdpdmVzIGRlbGVnYXRlcyBhIGNoYW5jZQotCSAqIHRvIGRvIHRoZWlyIG93biBpbml0aWFsaXphdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSB0aGF0IHRoaXMgcnVudGltZSBkZWxlZ2F0ZSBjb3JyZXNwb25kcyB0by4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lCi0JICovCi0JcHVibGljIGZpbmFsIElSdW50aW1lIGdldFJ1bnRpbWUoKSB7Ci0JCXJldHVybiBydW50aW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgd29ya2luZyBjb3B5IHRoYXQgdGhpcyBydW50aW1lIGRlbGVnYXRlIGNvcnJlc3BvbmRzIHRvLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgZmluYWwgSVJ1bnRpbWVXb3JraW5nQ29weSBnZXRSdW50aW1lV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiBydW50aW1lV0M7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoaXMgcnVudGltZSBpbnN0YW5jZS4gU3ViY2xhc3NlcyBzaG91bGQKLQkgKiBvdmVycmlkZSBhbmQgY2FsbCBzdXBlci52YWxpZGF0ZSgpIGZvciBiYXNpYyB2YWxpZGF0aW9uLiAKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHdlYiBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCi0JICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklSdW50aW1lLnZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IpPC9jb2RlPi4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGlzCi0JICogcnVudGltZSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMKLQkgKiB3cm9uZyB3aXRoIGl0Ci0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKSB7Ci0JCWlmIChydW50aW1lLmdldE5hbWUoKSA9PSBudWxsIHx8IHJ1bnRpbWUuZ2V0TmFtZSgpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclJ1bnRpbWVOYW1lLCBudWxsKTsKLQkJCi0JCWlmIChpc05hbWVJblVzZSgpKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JEdXBsaWNhdGVSdW50aW1lTmFtZSwgbnVsbCk7Ci0JCQotCQlJUGF0aCBwYXRoID0gcnVudGltZS5nZXRMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGguaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3VycmVudCBuYW1lIGlzIGFscmVhZHkgaW4gdXNlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5hbWUgaXMgaW4gdXNlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmFtZUluVXNlKCkgewotCQlJUnVudGltZSBvcmlnID0gcnVudGltZTsKLQkJaWYgKHJ1bnRpbWVXQyAhPSBudWxsKQotCQkJb3JpZyA9IHJ1bnRpbWVXQy5nZXRPcmlnaW5hbCgpOwotCQkKLQkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKLQkJaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAob3JpZyAhPSBydW50aW1lc1tpXSAmJiBydW50aW1lLmdldE5hbWUoKS5lcXVhbHMocnVudGltZXNbaV0uZ2V0TmFtZSgpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgaW50LXZhbHVlZCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICogQHNlZSAjc2V0QXR0cmlidXRlKFN0cmluZywgaW50KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gcnVudGltZS5nZXRBdHRyaWJ1dGUoaWQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBib29sZWFuLXZhbHVlZCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICogQHNlZSAjc2V0QXR0cmlidXRlKFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gcnVudGltZS5nZXRBdHRyaWJ1dGUoaWQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmctdmFsdWVkIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGUoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBydW50aW1lLmdldEF0dHJpYnV0ZShpZCwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIExpc3QtdmFsdWVkIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGUoU3RyaW5nLCBMaXN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0IGdldEF0dHJpYnV0ZShTdHJpbmcgaWQsIExpc3Q8U3RyaW5nPiBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIHJ1bnRpbWUuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgTWFwLXZhbHVlZCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICogQHNlZSAjc2V0QXR0cmlidXRlKFN0cmluZywgTWFwKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBNYXAgZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgTWFwIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gcnVudGltZS5nZXRBdHRyaWJ1dGUoaWQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgcnVudGltZSBkZWxlZ2F0ZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHdlYiBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSW1wbGVtZW50YXRpb25zIGFyZSBleHBlY3RlZCB0byBsZXQgZ28gb2YgdGhlIGRlbGVnYXRlJ3MgcmVmZXJlbmNlCi0JICogdG8gdGhlIHJ1bnRpbWUsIGRlcmVnaXN0ZXIgbGlzdGVuZXJzLCBldGMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHJ1bnRpbWUgd2l0aCBkZWZhdWx0IHZhbHVlcy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4KLQkgKiBhIG5ldyBydW50aW1lIGlzIGNyZWF0ZWQgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aAotCSAqIG1lYW5pbmdmdWwgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgaW50ZWdlci12YWx1ZWQgYXR0cmlidXRlIG9mIHRoaXMKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZShTdHJpbmcsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBpbnQgdmFsdWUpIHsKLQkJcnVudGltZVdDLnNldEF0dHJpYnV0ZShpZCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYm9vbGVhbi12YWx1ZWQgYXR0cmlidXRlIG9mIHRoaXMKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZShTdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlydW50aW1lV0Muc2V0QXR0cmlidXRlKGlkLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmctdmFsdWVkIGF0dHJpYnV0ZSBvZiB0aGlzCi0JICogZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGUoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgU3RyaW5nIHZhbHVlKSB7Ci0JCXJ1bnRpbWVXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGxpc3QtdmFsdWVkIGF0dHJpYnV0ZSBvZiB0aGlzCi0JICogZWxlbWVudC4gVGhlIGxpc3QgbWF5IG9ubHkgY29udGFpbiBTdHJpbmcgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZShTdHJpbmcsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgTGlzdDxTdHJpbmc+IHZhbHVlKSB7Ci0JCXJ1bnRpbWVXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIG1hcC12YWx1ZWQgYXR0cmlidXRlIG9mIHRoaXMKLQkgKiBlbGVtZW50LiBUaGUgbWFwIG1heSBvbmx5IGNvbnRhaW4gU3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGUoU3RyaW5nLCBNYXApCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgTWFwIHZhbHVlKSB7Ci0JCXJ1bnRpbWVXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9SdW50aW1lTG9jYXRvckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9SdW50aW1lTG9jYXRvckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTkwMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUnVudGltZUxvY2F0b3JEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci0vKioKLSAqIEEgcnVudGltZSBsb2NhdG9yIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGxvY2F0ZSBvciBzZWFyY2ggZm9yIGFkZGl0aW9uYWwKLSAqIHJ1bnRpbWVzIG9mIGEgcGFydGljdWxhciB0eXBlLgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5ydW50aW1lTG9jYXRvcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUnVudGltZUxvY2F0b3JEZWxlZ2F0ZSB7Ci0JLyoqCi0JICogQSBjYWxsYmFjayBsaXN0ZW5lciB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJUnVudGltZVNlYXJjaExpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIENhbGxlZCB3aGVuIGEgbmV3IHJ1bnRpbWUgaXMgZm91bmQgYnkgdGhlIGxvY2F0b3IuCi0JCSAqIFRoZSBydW50aW1lIG11c3QgbmV2ZXIgYmUgbnVsbC4KLQkJICogCi0JCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRoYXQgd2FzIGZvdW5kLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVudGltZUZvdW5kKElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSk7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgZm9yIGxvY2FsIHJ1bnRpbWVzLiAKLQkgKiBJdCB1c2VzIHRoZSBjYWxsYmFjayBsaXN0ZW5lciB0byByZXBvcnQgcnVudGltZXMgdGhhdCBhcmUgZm91bmQuCi0JICogVGhlIHBhdGggY29udGFpbnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZvbGRlciB0byBzZWFyY2ggaW4sCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gc2VhcmNoIHRoZSBlbnRpcmUgbWFjaGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBzZWFyY2ggZm9yIHJ1bnRpbWVzIGluCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgbGlzdGVuZXIgdG8gcmVwb3J0IHN0YXR1cyB0bwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZWFyY2hGb3JSdW50aW1lcyhJUGF0aCBwYXRoLCBJUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1J1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1J1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxMzkyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9SdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUYXJnZXRIYW5kbGVyOwotLyoqCi0gKiBBIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXIgaXMgdXNlZCB3aGVuIGFzc29jaWF0aW5nIGEgcnVudGltZSB3aXRoCi0gKiBhIHBhcnRpY3VsYXIgcHJvamVjdC4gSXQgaGFzIHRoZSBhYmlsaXR5IHRvIG1ha2UgYW55IGNoYW5nZXMgaXQgcmVxdWlyZXMKLSAqIG9uIHRoZSBwcm9qZWN0cyAtIGFkZGluZyBvciByZW1vdmluZyBmaWxlcywgc2V0dGluZyB1cCB0aGUgY2xhc3NwYXRoLCBldGMuCi0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCi0gKiB0byBleHRlbmQgdGhlIDxjb2RlPnJ1bnRpbWVUYXJnZXRIYW5kbGVyczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogPHA+Ci0gKiAKLSAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJ1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGUgewotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBydW50aW1lIHRhcmdldCBoYW5kbGVyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdIYW5kbGVyIHRoZSBuZXcgaGFuZGxlcgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGluaXRpYWxpemUoSVJ1bnRpbWVUYXJnZXRIYW5kbGVyIG5ld0hhbmRsZXIpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGRlcHJlY2F0ZWQgY29kZSIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXIgdGhhdCB0aGlzIGRlbGVnYXRlIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lIHRhcmdldCBoYW5kbGVyCi0JICovCi0JcHVibGljIElSdW50aW1lVGFyZ2V0SGFuZGxlciBnZXRSdW50aW1lVGFyZ2V0SGFuZGxlcigpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGRlcHJlY2F0ZWQgY29kZSIpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcnVudGltZSB0YXJnZXQgb24gdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gc2V0IHRoZSBydW50aW1lIG9uCi0JICogQHBhcmFtIHJ1bnRpbWUgdGhlIHRhcmdldCBydW50aW1lCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHNldHRpbmcgdGhlIHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSdW50aW1lVGFyZ2V0KElQcm9qZWN0IHByb2plY3QsIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHJ1bnRpbWUgdGFyZ2V0IGZyb20gdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gcmVtb3ZlIHRoZSBydW50aW1lIGZyb20KLQkgKiBAcGFyYW0gcnVudGltZSB0aGUgdGFyZ2V0IHJ1bnRpbWUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHRocm93biBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVtb3ZpbmcgdGhlIHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVSdW50aW1lVGFyZ2V0KElQcm9qZWN0IHByb2plY3QsIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1NlcnZlckJlaGF2aW91ckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZjQ4YzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC4qOwotLyoqCi0gKiBBIHNlcnZlciBkZWxlZ2F0ZSBwcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHZhcmlvdXMgCi0gKiBnZW5lcmljIGFuZCBzZXJ2ZXItdHlwZS1zcGVjaWZpYyBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIHR5cGUgb2Ygc2VydmVyLgotICogQSBzZXJ2ZXIgZGVsZWdhdGUgaXMgc3BlY2lmaWVkIGJ5IHRoZQotICogPGNvZGU+Y2xhc3M8L2NvZGU+IGF0dHJpYnV0ZSBvZiBhIDxjb2RlPnNlcnZlclR5cGVzPC9jb2RlPiBleHRlbnNpb24uCi0gKiA8cD4KLSAqIFdoZW4gdGhlIHNlcnZlciBpbnN0YW5jZSBuZWVkcyB0byBiZSBnaXZlbiBhIGRlbGVnYXRlLCB0aGUgZGVsZWdhdGUgY2xhc3MKLSAqIHNwZWNpZmllZCBmb3IgdGhlIHNlcnZlciB0eXBlIGlzIGluc3RhbnRpYXRlZCB3aXRoIGEgMC1hcmd1bWVudCBjb25zdHJ1Y3RvcgotICogYW5kIHByaW1lZCB3aXRoIDxjb2RlPmRlbGVnYXRlLmluaXRpYWxpemUoKChJU2VydmVyU3RhdGUpc2VydmVyKTwvY29kZT4sIAotICogd2hpY2ggaXQgaXMgZXhwZWN0ZWQgdG8gaGFuZyBvbiB0by4gTGF0ZXIsIHdoZW4KLSAqIDxjb2RlPmRlbGVnYXRlLmRpc3Bvc2UoKTwvY29kZT4gaXMgY2FsbGVkIGFzIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgaXMKLSAqIGJlaW5nIGRpc2NhcmRlZCwgdGhlIGRlbGVnYXRlIGlzIGV4cGVjdGVkIHRvIGxldCBnbyBvZiB0aGUgc2VydmVyIGluc3RhbmNlLgotICogPC9wPgotICogPHA+Ci0gKiBTZXJ2ZXIgZGVsZWdhdGVzIG1heSBrZWVwIHN0YXRlIGluIGluc3RhbmNlIGZpZWxkcywgYnV0IHRoYXQgc3RhdGUgaXMKLSAqIHRyYW5zaWVudCBhbmQgd2lsbCBub3QgYmUgcGVyc2lzdGVkIGFjcm9zcyB3b3JrYmVuY2ggc2Vzc2lvbnMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCi0gKiB0byBleHRlbmQgdGhlIDxjb2RlPnNlcnZlclR5cGVzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgSVNlcnZlcgotICogQHNlZSBJU2VydmVyV29ya2luZ0NvcHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIHsKLQlwcml2YXRlIFNlcnZlciBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGtpbmQgY29uc3RhbnQgKHZhbHVlIDApIGZvciBubyBjaGFuZ2UuCi0JICogCi0JICogQHNlZSAjcHVibGlzaE1vZHVsZShpbnQsIGludCwgSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0NIQU5HRSA9IDA7Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGtpbmQgY29uc3RhbnQgKHZhbHVlIDEpIGZvciBhZGRlZCByZXNvdXJjZXMuCi0JICogCi0JICogQHNlZSAjcHVibGlzaE1vZHVsZShpbnQsIGludCwgSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEREVEID0gMTsKLQotCS8qKgotCSAqIFB1Ymxpc2gga2luZCBjb25zdGFudCAodmFsdWUgMikgZm9yIGNoYW5nZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBzZWUgI3B1Ymxpc2hNb2R1bGUoaW50LCBpbnQsIElNb2R1bGVbXSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEID0gMjsKLQotCS8qKgotCSAqIFB1Ymxpc2gga2luZCBjb25zdGFudCAodmFsdWUgMykgZm9yIHJlbW92ZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBzZWUgI3B1Ymxpc2hNb2R1bGUoaW50LCBpbnQsIElNb2R1bGVbXSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEID0gMzsKLQotCS8qKgotCSAqIERlbGVnYXRlcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUgd2l0aCBpdHMgbGlmZS1sb25nIHNlcnZlciBpbnN0YW5jZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2VydmVyIHRoZSBzZXJ2ZXIgaW5zdGFuY2UKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICovCi0JZmluYWwgdm9pZCBpbml0aWFsaXplKFNlcnZlciBuZXdTZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzZXJ2ZXIgPSBuZXdTZXJ2ZXI7Ci0JCWluaXRpYWxpemUobW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUuIFRoaXMgbWV0aG9kIGdpdmVzIGRlbGVnYXRlcyBhIGNoYW5jZQotCSAqIHRvIGRvIHRoZWlyIG93biBpbml0aWFsaXphdGlvbi4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgc2VydmVyIHN0YXRlIGlzIGluaXRpYWxseSB1bmtub3duLCB0aGlzIG1ldGhvZCBzaG91bGQgYXR0ZW1wdAotCSAqIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlciBhbmQgdXBkYXRlIHRoZSBzdGF0ZS4gT24gc2VydmVycyB3aGVyZSB0aGUKLQkgKiBzdGF0ZSBtYXkgY2hhbmdlLCB0aGlzIGlzIGFsc28gYW4gZXhjZWxsZW50IHBsYWNlIHRvIGNyZWF0ZSBhIGJhY2tncm91bmQKLQkgKiB0aHJlYWQgdGhhdCB3aWxsIGNvbnN0YW50bHkgcGluZyB0aGUgc2VydmVyIChvciBoYXZlIGEgbGlzdGVuZXIpIHRvCi0JICogdXBkYXRlIHRoZSBzZXJ2ZXIgc3RhdGUgYXMgY2hhbmdlcyBvY2N1ci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgdGhhdCB0aGlzIHNlcnZlciBkZWxlZ2F0ZSBjb3JyZXNwb25kcyB0by4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgSVNlcnZlciBnZXRTZXJ2ZXIoKSB7Ci0JCXJldHVybiBzZXJ2ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIHNlcnZlci4KLQkgKgotCSAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2VydmVyLCBvbmUgb2YgdGhlIHN0YXRlCi0JICogICAgY29uc3RhbnRzIGRlZmluZWQgYnkge0BsaW5rIElTZXJ2ZXJ9Ci0JICogQHNlZSBJU2VydmVyI2dldFNlcnZlclN0YXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRTZXJ2ZXJTdGF0ZShpbnQgc3RhdGUpIHsKLQkJc2VydmVyLnNldFNlcnZlclN0YXRlKHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBJTGF1bmNoTWFuYWdlciBtb2RlIHRoYXQgdGhlIHNlcnZlciBpcyBydW5uaW5nIGluLiBUaGUgc2VydmVyCi0JICogaW1wbGVtZW50YXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGllbnRzCi0JICogd2hlbiB0aGUgc2VydmVyIGlzIHN0b3BwZWQsIHNvIHlvdSBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBtb2RlIHdoZW4KLQkgKiBpdCBjaGFuZ2VzLgotCSAqIAotCSAqIEBwYXJhbSBtb2RlIHRoZSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGlzIHJ1bm5pbmcsIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMKLQkgKiAgICBkZWZpbmVkIGJ5IHtAbGluayBJTGF1bmNoTWFuYWdlcn0KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRNb2RlKFN0cmluZyBtb2RlKSB7Ci0JCXNlcnZlci5zZXRNb2RlKG1vZGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlcnZlciByZXN0YXJ0IHN0YXRlLgotCSAqCi0JICogQHBhcmFtIHN0YXRlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgbmVlZHMgdG8gYmUgcmVzdGFydGVkLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2VydmVyUmVzdGFydFN0YXRlKGJvb2xlYW4gc3RhdGUpIHsKLQkJc2VydmVyLnNldFNlcnZlclJlc3RhcnRTdGF0ZShzdGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VydmVyIHB1Ymxpc2ggc3RhdGUuCi0JICoKLQkgKiBAcGFyYW0gc3RhdGUgdGhlIGN1cnJlbnQgcHVibGlzaCBzdGF0ZSBvZiB0aGUgc2VydmVyLCBvbmUgb2YgdGhlCi0JICogICAgcHVibGlzaCBjb25zdGFudHMgZGVmaW5lZCBieSB7QGxpbmsgSVNlcnZlcn0KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoaW50IHN0YXRlKSB7Ci0JCXNlcnZlci5zZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoc3RhdGUpOwotCX0KLQotCS8qKgotCSAqIEhvb2sgdG8gZmlyZSBhbiBldmVudCB3aGVuIGEgbW9kdWxlIHN0YXRlIGNoYW5nZXMuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHBhcmFtIHN0YXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2R1bGUsIG9uZSBvZiB0aGUgc3RhdGUKLQkgKiAgICBjb25zdGFudHMgZGVmaW5lZCBieSB7QGxpbmsgSVNlcnZlcn0KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRNb2R1bGVTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUpIHsKLQkJc2VydmVyLnNldE1vZHVsZVN0YXRlKG1vZHVsZSwgc3RhdGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZHVsZSBwdWJsaXNoIHN0YXRlLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHBhcmFtIHN0YXRlIHRoZSBjdXJyZW50IHB1Ymxpc2ggc3RhdGUgb2YgdGhlIG1vZHVsZSwgb25lIG9mIHRoZQotCSAqICAgIHB1Ymxpc2ggY29uc3RhbnRzIGRlZmluZWQgYnkge0BsaW5rIElTZXJ2ZXJ9Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TW9kdWxlUHVibGlzaFN0YXRlKElNb2R1bGVbXSBtb2R1bGUsIGludCBzdGF0ZSkgewotCQlzZXJ2ZXIuc2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSwgc3RhdGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZHVsZSByZXN0YXJ0IHN0YXRlLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHBhcmFtIHN0YXRlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2R1bGUgbmVlZHMgdG8gYmUgcmVzdGFydGVkLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TW9kdWxlUmVzdGFydFN0YXRlKElNb2R1bGVbXSBtb2R1bGUsIGJvb2xlYW4gc3RhdGUpIHsKLQkJc2VydmVyLnNldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUsIHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZXJ2ZXIncyBleHRlcm5hbCBtb2R1bGVzLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZXMgdGhlIHJvb3QgZXh0ZXJuYWwgbW9kdWxlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0RXh0ZXJuYWxNb2R1bGVzKElNb2R1bGVbXSBtb2R1bGVzKSB7Ci0JCXNlcnZlci5zZXRFeHRlcm5hbE1vZHVsZXMobW9kdWxlcyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlcm5hbCBtb2R1bGUgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gc3RhdGljIGluZm9ybWF0aW9uLiBBbiBleHRlcm5hbCBtb2R1bGUgaXMgYSB1bml0IG9mICJjb250ZW50IgotCSAqIHRoYXQgaXMgYWxyZWFkeSBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlciwgYW5kIHRoYXQgZG9lc24ndCBleGlzdCBpbiB0aGUgd29ya3NwYWNlCi0JICogIAotCSAqIEBwYXJhbSBpZCB0aGUgbW9kdWxlIGlkCi0JICogQHBhcmFtIG5hbWUgdGhlIG1vZHVsZSBuYW1lCi0JICogQHBhcmFtIHR5cGUgdGhlIG1vZHVsZSB0eXBlIGlkCi0JICogQHBhcmFtIHZlcnNpb24gdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICogQHBhcmFtIG1vZHVsZURlbGVnYXRlIHRoZSBNb2R1bGVEZWxlZ2F0ZSB3aGljaCB3aWxsIGFjdCBhcyBhIGhlbHBlciBvZiB0aGUgbW9kdWxlIAotCSAqIEByZXR1cm4gYSBtb2R1bGUgaW5zdGFuY2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSU1vZHVsZSBjcmVhdGVFeHRlcm5hbE1vZHVsZShTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24sIE1vZHVsZURlbGVnYXRlIG1vZHVsZURlbGVnYXRlKSB7Ci0JCUlNb2R1bGUgbW9kdWxlID0gbmV3IEV4dGVybmFsTW9kdWxlKGlkLCBuYW1lLCB0eXBlLCB2ZXJzaW9uLCBtb2R1bGVEZWxlZ2F0ZSk7Ci0JCXNldE1vZHVsZVB1Ymxpc2hTdGF0ZShuZXcgSU1vZHVsZSBbXSB7bW9kdWxlfSwgSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgc2VydmVyIGRlbGVnYXRlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gbGV0IGdvIG9mIHRoZSBkZWxlZ2F0ZSdzIHJlZmVyZW5jZQotCSAqIHRvIHRoZSBzZXJ2ZXIsIGRlcmVnaXN0ZXIgbGlzdGVuZXJzLCBldGMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2RzIGNhbGxlZCB0byBub3RpZnkgdGhhdCBwdWJsaXNoaW5nIGlzIGFib3V0IHRvIGJlZ2luLgotCSAqIFRoaXMgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gb3BlbiBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlcgotCSAqIG9yIGdldCBhbnkgZ2xvYmFsIGluZm9ybWF0aW9uIHJlYWR5LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLAotCSAqIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byA8Y29kZT5JU2VydmVyLnB1Ymxpc2goKTwvY29kZT4uCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBzdGFydGluZyB0aGUgcHVibGlzaAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hTdGFydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2ggdGhlIHNlcnZlci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yaywKLQkgKiBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gPGNvZGU+SVNlcnZlci5wdWJsaXNoKCk8L2NvZGU+LgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBraW5kIG9uZSBvZiB0aGUgSVNlcnZlci5QVUJMSVNIX1hYIGNvbnN0YW50cy4gVmFsaWQgdmFsdWVzIGFyZQotCSAqICAgIDx1bD4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9GVUxMPC9jb2RlPi0gaW5kaWNhdGVzIGEgZnVsbCBwdWJsaXNoLjwvbGk+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfSU5DUkVNRU5UQUw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBpbmNyZW1lbnRhbCBwdWJsaXNoLgotCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0FVVE88L2NvZGU+LSBpbmRpY2F0ZXMgYW4gYXV0b21hdGljIGluY3JlbWVudGFsIHB1Ymxpc2guPC9saT4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9DTEVBTjwvY29kZT4tIGluZGljYXRlcyBhIGNsZWFuIHJlcXVlc3QuIENsZWFuIHRocm93cwotCSAqICAgICAgb3V0IGFsbCBzdGF0ZSBhbmQgY2xlYW5zIHVwIHRoZSBtb2R1bGUgb24gdGhlIHNlcnZlciBiZWZvcmUgZG9pbmcgYQotCSAqICAgICAgZnVsbCBwdWJsaXNoLgotCSAqICAgIDwvdWw+Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcHVibGlzaGluZyB0aGUgc2VydmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaFNlcnZlcihpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGEgc2luZ2xlIG1vZHVsZSB0byB0aGUgc2VydmVyLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLAotCSAqIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byA8Y29kZT5JU2VydmVyLnB1Ymxpc2goKTwvY29kZT4uCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhlIGRlbHRhS2luZCBpcyBJU2VydmVyLlJFTU9WRUQsIHRoZSBtb2R1bGUgbWF5IGhhdmUgYmVlbiBjb21wbGV0ZWx5Ci0JICogZGVsZXRlZCBhbmQgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4gSW4gdGhpcyBjYXNlLCBhIGR1bW15IG1vZHVsZSAod2l0aCB0aGUKLQkgKiBjb3JyZWN0IGlkKSB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBjbGllbnRzIGltcGxlbWVudGluZyB0aGlzIG1ldGhvZCBiZSByZXNwb25zaWJsZSBmb3IKLQkgKiBzZXR0aW5nIHRoZSBtb2R1bGUgc3RhdGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBraW5kIG9uZSBvZiB0aGUgSVNlcnZlci5QVUJMSVNIX1hYIGNvbnN0YW50cy4gVmFsaWQgdmFsdWVzIGFyZToKLQkgKiAgICA8dWw+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfRlVMTDwvY29kZT4tIGluZGljYXRlcyBhIGZ1bGwgcHVibGlzaC48L2xpPgotCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0lOQ1JFTUVOVEFMPC9jb2RlPi0gaW5kaWNhdGVzIGEgaW5jcmVtZW50YWwgcHVibGlzaC4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9BVVRPPC9jb2RlPi0gaW5kaWNhdGVzIGFuIGF1dG9tYXRpYyBpbmNyZW1lbnRhbCBwdWJsaXNoLjwvbGk+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfQ0xFQU48L2NvZGU+LSBpbmRpY2F0ZXMgYSBjbGVhbiByZXF1ZXN0LiBDbGVhbiB0aHJvd3MKLQkgKiAgICAgIG91dCBhbGwgc3RhdGUgYW5kIGNsZWFucyB1cCB0aGUgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgYmVmb3JlIGRvaW5nIGEKLQkgKiAgICAgIGZ1bGwgcHVibGlzaC4KLQkgKiAgICA8L3VsPgotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byBwdWJsaXNoCi0JICogQHBhcmFtIGRlbHRhS2luZCBvbmUgb2YgdGhlIElTZXJ2ZXIgcHVibGlzaCBjaGFuZ2UgY29uc3RhbnRzLiBWYWxpZCB2YWx1ZXMgYXJlOgotCSAqICAgIDx1bD4KLQkgKiAgICA8bGk+PGNvZGU+QURERUQ8L2NvZGU+LSBpbmRpY2F0ZXMgdGhlIG1vZHVsZSBoYXMganVzdCBiZWVuIGFkZGVkIHRvIHRoZSBzZXJ2ZXIKLQkgKiAgICAgIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCBwdWJsaXNoLgotCSAqICAgIDxsaT48Y29kZT5OT19DSEFOR0U8L2NvZGU+LSBpbmRpY2F0ZXMgdGhhdCBub3RoaW5nIGhhcyBjaGFuZ2VkIGluIHRoZSBtb2R1bGUKLQkgKiAgICAgIHNpbmNlIHRoZSBsYXN0IHB1Ymxpc2guPC9saT4KLQkgKiAgICA8bGk+PGNvZGU+Q0hBTkdFRDwvY29kZT4tIGluZGljYXRlcyB0aGF0IHRoZSBtb2R1bGUgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZQotCSAqICAgICAgdGhlIGxhc3QgcHVibGlzaC4gQ2FsbCA8Y29kZT5nZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKCk8L2NvZGU+IGZvcgotCSAqICAgICAgZGV0YWlscyBvZiB0aGUgY2hhbmdlLgotCSAqICAgIDxsaT48Y29kZT5SRU1PVkVEPC9jb2RlPi0gaW5kaWNhdGVzIHRoZSBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgc2hvdWxkIGJlCi0JICogICAgICByZW1vdmVkL2NsZWFuZWQgdXAgZnJvbSB0aGUgc2VydmVyLgotCSAqICAgIDwvdWw+Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcHVibGlzaGluZyB0aGUgbW9kdWxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaE1vZHVsZShpbnQga2luZCwgaW50IGRlbHRhS2luZCwgSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGJ5IGRlZmF1bHQsIGFzc3VtZSB0aGUgbW9kdWxlIGhhcyBwdWJsaXNoZWQgc3VjY2Vzc2Z1bGx5LgotCQkvLyB0aGlzIHdpbGwgdXBkYXRlIHRoZSBwdWJsaXNoIHN0YXRlIGFuZCBkZWx0YSBjb3JyZWN0bHkKLQkJc2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSwgSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZHMgY2FsbGVkIHRvIG5vdGlmeSB0aGF0IHB1Ymxpc2hpbmcgaGFzIGZpbmlzaGVkLgotCSAqIFRoZSBzZXJ2ZXIgY2FuIGNsb3NlIGFueSBvcGVuIGNvbm5lY3Rpb25zIHRvIHRoZSBzZXJ2ZXIKLQkgKiBhbmQgZG8gYW55IGNsZWFudXAgb3BlcmF0aW9ucy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yaywKLQkgKiBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gPGNvZGU+SVNlcnZlci5wdWJsaXNoKCk8L2NvZGU+LgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc3RvcHBpbmcgdGhlIHB1Ymxpc2gKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ29uZmlndXJlIHRoZSBnaXZlbiBsYXVuY2ggY29uZmlndXJhdGlvbiB0byBzdGFydCB0aGlzIHNlcnZlci4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyCi0JICogdGhlIHNlcnZlciBpcyBzdGFydGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBpcyBhY2N1cmF0ZSBhbmQgdXAgdG8gZGF0ZS4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJsaW5kbHkgdXBkYXRlIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBpbiBjYXNlcyB3aGVyZSB0aGUgdXNlciBoYXMKLQkgKiBhY2Nlc3MgdG8gY2hhbmdlIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBieSBoYW5kLgotCSAqIAotCSAqIEBwYXJhbSB3b3JraW5nQ29weSBhIGxhdW5jaCBjb25maWd1cmF0aW9uIHdvcmtpbmcgY29weQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igc2V0dGluZyB1cCB0aGUgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldHVwTGF1bmNoQ29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJlc3RhcnQgdGhpcyBzZXJ2ZXIgdXNpbmcgYSBtb3JlIG9wdGltaXplZCBiZWhhdmlvciB0aGFuIGEgZnVsbCBzdG9wCi0JICogYW5kIHN0YXJ0LiBUaGUgc2VydmVyIHNob3VsZCB1c2UgdGhlIHNlcnZlciBsaXN0ZW5lciB0byBub3RpZnkgcHJvZ3Jlc3MuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBmaW5kIG91dCBpZiB0aGVyZSBpcyBhbiBvcHRpbWl6ZWQgcGF0aCB0byByZXN0YXJ0Ci0JICogdGhlIHNlcnZlciB0aGF0J3MgYmV0dGVyIHRoYW4gYSBmdWxsIHN0b3AgYW5kIHN0YXJ0IChsYXVuY2gpLiBJZiB0aGlzCi0JICogbWV0aG9kIHRocm93cyBhIENvcmVFeGNlcHRpb24gd2l0aCBhIHN0YXR1cyBjb2RlIG9mIC0xLCBpdCBpcyBhIHNpZ24KLQkgKiB0aGF0IGVpdGhlciB0aGVyZSBpcyBubyBvcHRpbWl6ZWQgcGF0aCwgb3IgdGhhdCB0aGUgcGF0aCBoYXMgZmFpbGVkLAotCSAqIGFuZCBpbiBlaXRoZXIgY2FzZSB0aGUgZnJhbWV3b3JrIHdpbGwgdXNlIHRoZSByZWd1bGFyIHN0b3Avc3RhcnQKLQkgKiBiZWhhdmlvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSB0aGUgbW9kZSB0byByZXN0YXJ0IGluLCBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzCi0JICogICAgZGVmaW5lZCBieSB7QGxpbmsgSUxhdW5jaE1hbmFnZXJ9Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gcmVzdGFydGluZwotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIC0xLCAiUmVzdGFydCBub3Qgc3VwcG9ydGVkIiwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbW9kdWxlIGNhbiBiZSByZXN0YXJ0ZWQuCi0JICogPHA+Ci0JICogVGhpcyBjYWxsIHNob3VsZCBjb21wbGV0ZSByZWFzb25hYmx5IGZhc3QgYW5kIG5vdCByZXF1aXJlIGNvbW11bmljYXRpb24KLQkgKiB3aXRoIHRoZSAocG90ZW50aWFsbHkgcmVtb3RlKSBzZXJ2ZXIuIElmIGNvbW11bmljYXRpb24gaXMgcmVxdWlyZWQgaXQKLQkgKiBzaG91bGQgYmUgZG9uZSBhc3luY2hyb25vdXNseSBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkIGVpdGhlciBmYWlsIHVudGlsCi0JICogdGhhdCBpcyBjb21wbGV0ZSBvciBzdWNjZWVkIGFuZCBoYW5kbGUgZmFpbHVyZSBpbiB0aGUgeHhNb2R1bGUgbWV0aG9kcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbW9kdWxlIGNhbiBiZQotCSAqICAgIHJlc3RhcnRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UgCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ29udHJvbE1vZHVsZShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHN0YXJ0ZWQgaW4gdGhlIGdpdmVuIG1vZGUuCi0JICogPHA+Ci0JICogVGhpcyBjYWxsIHNob3VsZCBjb21wbGV0ZSByZWFzb25hYmx5IGZhc3QgYW5kIG5vdCByZXF1aXJlIGNvbW11bmljYXRpb24KLQkgKiB3aXRoIHRoZSAocG90ZW50aWFsbHkgcmVtb3RlKSBzZXJ2ZXIuIElmIGNvbW11bmljYXRpb24gaXMgcmVxdWlyZWQgaXQKLQkgKiBzaG91bGQgYmUgZG9uZSBhc3luY2hyb25vdXNseSBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkIGVpdGhlciBmYWlsIHVudGlsCi0JICogdGhhdCBpcyBjb21wbGV0ZSBvciBzdWNjZWVkIGFuZCBoYW5kbGUgZmFpbHVyZSBkdXJpbmcgc3RhcnQuCi0JICogPC9wPjxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLAotCSAqIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byA8Y29kZT5JU2VydmVyLmNhblN0YXJ0KCk8L2NvZGU+LgotCSAqIFRoZSBmcmFtZXdvcmsgaGFzIGFscmVhZHkgZmlsdGVyZWQgb3V0IG9idmlvdXNseSBpbnZhbGlkIHNpdHVhdGlvbnMsCi0JICogc3VjaCBhcyBzdGFydGluZyBhIHNlcnZlciB0aGF0IGlzIGFscmVhZHkgcnVubmluZy4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgc2VydmVyIGNhbgotCSAqICAgIGJlIHN0YXJ0ZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aHkgaXQgY2FuJ3QKLSAgICAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5TdGFydChTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHJlc3RhcnRlZCBpbiB0aGUgZ2l2ZW4gbW9kZS4gTm90ZSB0aGF0IG9ubHkgc2VydmVycwotCSAqIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nIGNhbiBiZSByZXN0YXJ0ZWQuCi0JICogPHA+Ci0JICogVGhpcyBjYWxsIHNob3VsZCBjb21wbGV0ZSByZWFzb25hYmx5IGZhc3QgYW5kIG5vdCByZXF1aXJlIGNvbW11bmljYXRpb24KLQkgKiB3aXRoIHRoZSAocG90ZW50aWFsbHkgcmVtb3RlKSBzZXJ2ZXIuIElmIGNvbW11bmljYXRpb24gaXMgcmVxdWlyZWQgaXQKLQkgKiBzaG91bGQgYmUgZG9uZSBhc3luY2hyb25vdXNseSBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkIGVpdGhlciBmYWlsIHVudGlsCi0JICogdGhhdCBpcyBjb21wbGV0ZSBvciBzdWNjZWVkIGFuZCBoYW5kbGUgZmFpbHVyZSBkdXJpbmcgcmVzdGFydC4KLQkgKiA8L3A+PHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCi0JICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIuY2FuUmVzdGFydCgpPC9jb2RlPi4KLQkgKiBUaGUgZnJhbWV3b3JrIGhhcyBhbHJlYWR5IGZpbHRlcmVkIG91dCBvYnZpb3VzbHkgaW52YWxpZCBzaXR1YXRpb25zLAotCSAqIHN1Y2ggYXMgcmVzdGFydGluZyBhIHN0b3BwZWQgc2VydmVyLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlIGEgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBjYW4gYmUgbGF1bmNoZWQsCi0JICogICAgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cyBkZWZpbmVkIGJ5Ci0JICogICAge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9Ci0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgY2FuCi0JICogICAgYmUgcmVzdGFydGVkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2h5IGl0IGNhbid0Ci0gICAgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuUmVzdGFydChTdHJpbmcgbW9kZSkgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHN0b3BwZWQuCi0JICogU2VydmVycyBjYW4gYmUgc3RvcHBlZCBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBzdG9wcGVkIGFuZCBpZgotCSAqIHRoZXkgYmVsb25nIHRvIGEgc3RhdGUtc2V0IHRoYXQgY2FuIGJlIHN0b3BwZWQuCi0JICogPHA+Ci0JICogVGhpcyBjYWxsIHNob3VsZCBjb21wbGV0ZSByZWFzb25hYmx5IGZhc3QgYW5kIG5vdCByZXF1aXJlIGNvbW11bmljYXRpb24KLQkgKiB3aXRoIHRoZSAocG90ZW50aWFsbHkgcmVtb3RlKSBzZXJ2ZXIuIElmIGNvbW11bmljYXRpb24gaXMgcmVxdWlyZWQgaXQKLQkgKiBzaG91bGQgYmUgZG9uZSBhc3luY2hyb25vdXNseSBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkIGVpdGhlciBmYWlsIHVudGlsCi0JICogdGhhdCBpcyBjb21wbGV0ZSBvciBzdWNjZWVkIGFuZCBoYW5kbGUgZmFpbHVyZSBkdXJpbmcgc3RvcC4KLQkgKiA8L3A+PHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCi0JICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIuY2FuU3RvcCgpPC9jb2RlPi4KLQkgKiBUaGUgZnJhbWV3b3JrIGhhcyBhbHJlYWR5IGZpbHRlcmVkIG91dCBvYnZpb3VzbHkgaW52YWxpZCBzaXR1YXRpb25zLAotCSAqIHN1Y2ggYXMgc3RvcHBpbmcgYSBzZXJ2ZXIgdGhhdCBpcyBhbHJlYWR5IHN0b3BwZWQuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgY2FuCi0JICogICBiZSBzdG9wcGVkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2h5IGl0IGNhbid0Ci0gICAgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuU3RvcCgpIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2VydmVyIGlzIGluIGEgc3RhdGUgdGhhdCBpdCBjYW4KLQkgKiBiZSBwdWJsaXNoZWQgdG8uCi0JICogPHA+Ci0JICogVGhpcyBjYWxsIHNob3VsZCBjb21wbGV0ZSByZWFzb25hYmx5IGZhc3QgYW5kIG5vdCByZXF1aXJlIGNvbW11bmljYXRpb24KLQkgKiB3aXRoIHRoZSAocG90ZW50aWFsbHkgcmVtb3RlKSBzZXJ2ZXIuIElmIGNvbW11bmljYXRpb24gaXMgcmVxdWlyZWQgaXQKLQkgKiBzaG91bGQgYmUgZG9uZSBhc3luY2hyb25vdXNseSBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkIGVpdGhlciBmYWlsIHVudGlsCi0JICogdGhhdCBpcyBjb21wbGV0ZSBvciBzdWNjZWVkIGFuZCBoYW5kbGUgZmFpbHVyZSBkdXJpbmcgcHVibGlzaC4KLQkgKiA8L3A+PHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCi0JICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIuY2FuUHVibGlzaCgpPC9jb2RlPi4KLQkgKiBUaGUgZnJhbWV3b3JrIGhhcyBhbHJlYWR5IGZpbHRlcmVkIG91dCBvYnZpb3VzbHkgaW52YWxpZCBzaXR1YXRpb25zLAotCSAqIHN1Y2ggYXMgcHVibGlzaGluZyB0byBhIHNlcnZlciBpbiB0aGUgd3JvbmcgbW9kZS4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIHNlcnZlciBjYW4KLQkgKiAgIGJlIHB1Ymxpc2hlZCB0bywgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3JvbmcKLSAgICAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5QdWJsaXNoKCkgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGdpdmVuIG1vZHVsZSBvbiB0aGUgc2VydmVyLiBTZWUgdGhlIHNwZWNpZmljYXRpb24gb2YgCi0JICoge0BsaW5rIElTZXJ2ZXIjc3RhcnRNb2R1bGUoSU1vZHVsZVtdLCBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcil9Ci0JICogZm9yIGZ1cnRoZXIgZGV0YWlscy4gCi0JICogPHA+Ci0JICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCB1cGRhdGUgdGhlIG1vZHVsZSBzeW5jIHN0YXRlIGFuZCBmaXJlCi0JICogYW4gZXZlbnQgZm9yIHRoZSBtb2R1bGUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtb2R1bGUgZG9lcyBub3QgZXhpc3Qgb24KLQkgKiB0aGUgc2VydmVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cywgaXMgdGhlcmUKLQkgKiBhbnkgbmVlZCBmb3IgdGhlIHByb2dyZXNzIG1vbml0b3I/XQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYmUgc3RhcnRlZAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byByZXN0YXJ0IHRoZSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFN0b3BzIHRoZSBnaXZlbiBtb2R1bGUgb24gdGhlIHNlcnZlci4gU2VlIHRoZSBzcGVjaWZpY2F0aW9uIG9mIAotCSAqIHtAbGluayBJU2VydmVyI3N0b3BNb2R1bGUoSU1vZHVsZVtdLCBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcil9Ci0JICogZm9yIGZ1cnRoZXIgZGV0YWlscy4gCi0JICogPHA+Ci0JICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCB1cGRhdGUgdGhlIG1vZHVsZSBzeW5jIHN0YXRlIGFuZCBmaXJlCi0JICogYW4gZXZlbnQgZm9yIHRoZSBtb2R1bGUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtb2R1bGUgZG9lcyBub3QgZXhpc3Qgb24KLQkgKiB0aGUgc2VydmVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cywgaXMgdGhlcmUKLQkgKiBhbnkgbmVlZCBmb3IgdGhlIHByb2dyZXNzIG1vbml0b3I/XQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYmUgc3RvcHBlZAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byByZXN0YXJ0IHRoZSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wTW9kdWxlKElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmVzdGFydHMgdGhlIGdpdmVuIG1vZHVsZSBvbiB0aGUgc2VydmVyLiBTZWUgdGhlIHNwZWNpZmljYXRpb24gb2YgCi0JICoge0BsaW5rIElTZXJ2ZXIjcmVzdGFydE1vZHVsZShJTW9kdWxlW10sIElTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyKX0KLQkgKiBmb3IgZnVydGhlciBkZXRhaWxzLiAKLQkgKiA8cD4KLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHVwZGF0ZSB0aGUgbW9kdWxlIHN5bmMgc3RhdGUgYW5kIGZpcmUKLQkgKiBhbiBldmVudCBmb3IgdGhlIG1vZHVsZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBleGlzdCBvbgotCSAqIHRoZSBzZXJ2ZXIuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogU2luY2UgdGhpcyBtZXRob2QgaXMgYXN5bmNocm9ub3VzLCBpcyB0aGVyZQotCSAqIGFueSBuZWVkIGZvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcj9dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byBiZSBzdG9wcGVkCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgdHJ5aW5nIHRvIHJlc3RhcnQgdGhlIG1vZHVsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RhcnRNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN0b3BNb2R1bGUobW9kdWxlLCBtb25pdG9yKTsKLQkJc3RhcnRNb2R1bGUobW9kdWxlLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTaHV0cyBkb3duIGFuZCBzdG9wcyB0aGlzIHNlcnZlci4gVGhlIHNlcnZlciBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBtZXRob2QKLQkgKiBxdWlja2x5IGFuZCB1c2UgdGhlIHNlcnZlciBsaXN0ZW5lciB0byBub3RpZnkgc2h1dGRvd24gcHJvZ3Jlc3MuCi0JICogPHA+IAotCSAqIElmIGZvcmNlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXQgd2lsbCBhdHRlbXB0IHRvIHN0b3AgdGhlIHNlcnZlcgotCSAqIG5vcm1hbGx5L2dyYWNlZnVsbHkuIElmIGZvcmNlIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSBzZXJ2ZXIKLQkgKiBwcm9jZXNzIHdpbGwgYmUgdGVybWluYXRlZCBhbnkgd2F5IHRoYXQgaXQgY2FuLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFRoZXJlIGlzIG5vIHdheSB0byBjb21tdW5pY2F0ZSBmYWlsdXJlIHRvIHRoZQotCSAqIGNsaWVudC4gR2l2ZW4gdGhhdCB0aGlzIG9wZXJhdGlvbiBjYW4gZ28gYXdyeSwgdGhlcmUgcHJvYmFibHkKLQkgKiBzaG91bGQgYmUgYSBtZWNoYW5pc20gdGhhdCBhbGxvd3MgZmFpbGluZyBhc3luYyBvcGVyYXRpb25zCi0JICogdG8gYmUgZGlhZ25vc2VkLl0KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGZvcmNlIDxjb2RlPnRydWU8L2NvZGU+IHRvIGtpbGwgdGhlIHNlcnZlciwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgdG8gc3RvcCBub3JtYWxseQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3AoYm9vbGVhbiBmb3JjZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG1vZHVsZSByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBtb2R1bGUncyByZXNvdXJjZXMKLQkgKi8KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gZ2V0UmVzb3VyY2VzKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRSZXNvdXJjZXMobW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHB1Ymxpc2hlZCB0byB0aGUgc2VydmVyLgotCSAqIAotCSAqIDxwPgotCSAqIElmIHRoZSBtb2R1bGUgaGFzIGp1c3QgYmVlbiBhZGRlZCB0byB0aGUgc2VydmVyLCBhbiBlbXB0eSBsaXN0IHdpbGwKLQkgKiBiZSByZXR1cm5lZC4gSWYgdGhlIG1vZHVsZSBoYXMgbmV2ZXIgZXhpc3RlZCBvbiB0aGUgc2VydmVyLCBhIENvcmVFeGNlcHRpb24KLQkgKiB3aWxsIGJlIHRocm93bi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwdWJsaXNoZWQgbW9kdWxlIHJlc291cmNlCi0JICovCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGdldFB1Ymxpc2hlZFJlc291cmNlcyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0UHVibGlzaGVkUmVzb3VyY2VzKG1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVsdGEgb2YgdGhlIGN1cnJlbnQgbW9kdWxlIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbgotCSAqIHB1Ymxpc2hlZCBjb21wYXJlZCB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW9kdWxlLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwdWJsaXNoIHJlc291cmNlIGRlbHRhCi0JICovCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShtb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgdGhlIHJlcXVlc3RlciBjYW4gdXNlCi0JICogdGhyb3VnaG91dCBpdCdzIGxpZmVjeWNsZS4gVGhpcyBpcyBwcmltYXJ5IHRvIGJlIHVzZWQgYnkKLQkgKiBzZXJ2ZXJzIGZvciB3b3JraW5nIGRpcmVjdG9yaWVzLCBzZXJ2ZXIgc3BlY2lmaWMKLQkgKiBmaWxlcywgZXRjLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGRpcmVjdG9yeSB3aWxsIHJldHVybiB0aGUgc2FtZSBkaXJlY3Rvcnkgb24KLQkgKiBlYWNoIHVzZSBvZiB0aGUgd29ya2JlbmNoLiBJZiB0aGUgZGlyZWN0b3J5IGlzIG5vdCByZXF1ZXN0ZWQKLQkgKiBvdmVyIGEgcGVyaW9kIG9mIHRpbWUsIHRoZSBkaXJlY3RvcnkgbWF5IGJlIGRlbGV0ZWQgYW5kIGEKLQkgKiBuZXcgb25lIHdpbGwgYmUgYXNzaWduZWQgb24gdGhlIG5leHQgcmVxdWVzdC4gRm9yIHRoaXMKLQkgKiByZWFzb24sIGEgc2VydmVyIG1heSB3YW50IHRvIHJlcXVlc3QgdGhlIHRlbXAgZGlyZWN0b3J5IG9uCi0JICogc3RhcnR1cCBpZiBpdCB3YW50cyB0byBzdG9yZSBmaWxlcyB0aGVyZS4gSW4gYW55IGNhc2UsIHRoZQotCSAqIHNlcnZlciBzaG91bGQgaGF2ZSBhIGJhY2t1cCBwbGFuIHRvIHJlZmlsbCB0aGUgZGlyZWN0b3J5Ci0JICogaW4gY2FzZSBpdCBoYXMgYmVlbiBkZWxldGVkIHNpbmNlIGxhc3QgdXNlLjwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5Ci0JICovCi0JcHJvdGVjdGVkIElQYXRoIGdldFRlbXBEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0VGVtcERpcmVjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFNldCBhIGdsb2JhbCBzdGF0dXMgb24gdGhlIHNlcnZlci4KLQkgKiAgCi0JICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2VydmVyU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXNlcnZlci5zZXRTZXJ2ZXJTdGF0dXMoc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSBzdGF0dXMgb24gYSBzcGVjaWZpYyBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TW9kdWxlU3RhdHVzKElNb2R1bGVbXSBtb2R1bGUsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCXNlcnZlci5zZXRNb2R1bGVTdGF0dXMobW9kdWxlLCBzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2ggdG8gdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCB0aGUgcHVibGlzaCBraW5kCi0JICogQHBhcmFtIG1vZHVsZXMKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHBhcmFtIGluZm8KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWJsaXNoKGludCBraW5kLCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaW5mbzIgPSBpbmZvOwotCQlJU3RhdHVzIHN0YXR1cyA9IHB1Ymxpc2goa2luZCwgbW9uaXRvcik7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuQ0FOQ0VMKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQl9Ci0KLQlwcml2YXRlIElBZGFwdGFibGUgaW5mbzI7Ci0KLQkvKnB1YmxpYyB2b2lkIHB1Ymxpc2gyKGludCBraW5kLCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLS0+LS0gUHVibGlzaGluZyB0byBzZXJ2ZXI6ICIgKyB0b1N0cmluZygpICsgIiAtLT4tLSIpOwotCQkKLQkJaWYgKGdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKS5oYXNSdW50aW1lKCkgJiYgZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaE5vUnVudGltZSwgbnVsbCkpOwotCQkKLQkJZmluYWwgTGlzdDxJTW9kdWxlW10+IG1vZHVsZUxpc3QgPSBnZXRBbGxNb2R1bGVzKCk7Ci0JCWFkZFJlbW92ZWRNb2R1bGVzKG1vZHVsZUxpc3QsIG51bGwpOwotCQkKLQkJUHVibGlzaE9wZXJhdGlvbltdIHRhc2tzID0gZ2V0VGFza3Moa2luZCwgbW9kdWxlTGlzdCwgbnVsbCk7Ci0JCWludCBzaXplID0gMjAwMCArIDM1MDAgKiBtb2R1bGVMaXN0LnNpemUoKSArIDUwMCAqIHRhc2tzLmxlbmd0aDsKLQkJCi0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGluZywgZ2V0U2VydmVyKCkuZ2V0TmFtZSgpKSwgc2l6ZSk7Ci0JCQotCQlNdWx0aVN0YXR1cyB0ZW1wTXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOwotCQkKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlN0YXJ0aW5nIHB1Ymxpc2giKTsKLQkJCXB1Ymxpc2hTdGFydChQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCS8vIGV4ZWN1dGUgcHVibGlzaGVycwotCQkJZXhlY3V0ZVB1Ymxpc2hlcnMoa2luZCwgbW9kdWxlcywgbW9uaXRvciwgaW5mbyk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCS8vIHB1Ymxpc2ggdGhlIHNlcnZlcgotCQkJcHVibGlzaFNlcnZlcihraW5kLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCS8vIHB1Ymxpc2ggbW9kdWxlcwotCQkJSXNwdWJsaXNoTW9kdWxlcyhraW5kLCBtb2R1bGVMaXN0LCBtb25pdG9yKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCQotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLklORk8sICJDb3JlRXhjZXB0aW9uIHB1Ymxpc2hpbmcgdG8gIiArIHRvU3RyaW5nKCksIGNlKTsKLQkJCXRocm93IGNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcHVibGlzaGluZyAgdG8gIiArIHRvU3RyaW5nKCksIGUpOwotCQkJdGVtcE11bHRpLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaGluZywgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZW5kIHRoZSBwdWJsaXNoaW5nCi0JCQl0cnkgewotCQkJCXB1Ymxpc2hGaW5pc2goUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgNTAwKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuSU5GTywgIkNvcmVFeGNlcHRpb24gcHVibGlzaGluZyB0byAiICsgdG9TdHJpbmcoKSwgY2UpOwotCQkJCXRlbXBNdWx0aS5hZGQoY2UuZ2V0U3RhdHVzKCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzdG9wcGluZyBwdWJsaXNoIHRvICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCQl0ZW1wTXVsdGkuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0tPC0tIERvbmUgcHVibGlzaGluZyAtLTwtLSIpOwotCQkKLQkJaWYgKHRlbXBNdWx0aS5nZXRDaGlsZHJlbigpLmxlbmd0aCA9PSAxKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24odGVtcE11bHRpLmdldENoaWxkcmVuKClbMF0pOwotCQkKLQkJTXVsdGlTdGF0dXMgbXVsdGkgPSBudWxsOwotCQlpZiAodGVtcE11bHRpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSykKLQkJCXJldHVybjsKLQkJZWxzZSBpZiAodGVtcE11bHRpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKQotCQkJbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMucHVibGlzaGluZ1N0YXR1c0luZm8sIG51bGwpOwotCQllbHNlIGlmICh0ZW1wTXVsdGkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JCQltdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5wdWJsaXNoaW5nU3RhdHVzV2FybmluZywgbnVsbCk7Ci0JCWVsc2UgaWYgKHRlbXBNdWx0aS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQltdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5wdWJsaXNoaW5nU3RhdHVzRXJyb3IsIG51bGwpOwotCQkKLQkJaWYgKG11bHRpICE9IG51bGwpCi0JCQltdWx0aS5hZGRBbGwodGVtcE11bHRpKTsKLQl9Ki8KLQotCS8qKgotCSAqIFB1Ymxpc2ggdG8gdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCB0aGUgcHVibGlzaCBraW5kCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gdGhlIHB1Ymxpc2ggc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgcHVibGlzaChpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0tPi0tIFB1Ymxpc2hpbmcgdG8gc2VydmVyOiAiICsgdG9TdHJpbmcoKSArICIgLS0+LS0iKTsKLQkJCi0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJUeXBlKCkuaGFzUnVudGltZSgpICYmIGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoTm9SdW50aW1lLCBudWxsKTsKLQkJCi0JCWZpbmFsIExpc3Q8SU1vZHVsZVtdPiBtb2R1bGVMaXN0ID0gZ2V0QWxsTW9kdWxlcygpOwotCQlmaW5hbCBMaXN0PEludGVnZXI+IGRlbHRhS2luZExpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZUxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSU1vZHVsZVtdIG1vZHVsZSA9IChJTW9kdWxlW10pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChoYXNCZWVuUHVibGlzaGVkKG1vZHVsZSkpIHsKLQkJCQlJTW9kdWxlIG0gPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOwotCQkJCWlmICgobS5nZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiAhbS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJCQl8fCBnZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSkubGVuZ3RoID09IDApCi0JCQkJCWRlbHRhS2luZExpc3QuYWRkKG5ldyBJbnRlZ2VyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLk5PX0NIQU5HRSkpOwotCQkJCWVsc2UKLQkJCQkJZGVsdGFLaW5kTGlzdC5hZGQobmV3IEludGVnZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuQ0hBTkdFRCkpOwotCQkJfSBlbHNlCi0JCQkJZGVsdGFLaW5kTGlzdC5hZGQobmV3IEludGVnZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuQURERUQpKTsKLQkJfQotCQkKLQkJYWRkUmVtb3ZlZE1vZHVsZXMobW9kdWxlTGlzdCwgbnVsbCk7Ci0JCXdoaWxlIChkZWx0YUtpbmRMaXN0LnNpemUoKSA8IG1vZHVsZUxpc3Quc2l6ZSgpKQotCQkJZGVsdGFLaW5kTGlzdC5hZGQobmV3IEludGVnZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuUkVNT1ZFRCkpOwotCQkKLQkJUHVibGlzaE9wZXJhdGlvbltdIHRhc2tzID0gZ2V0VGFza3Moa2luZCwgbW9kdWxlTGlzdCwgZGVsdGFLaW5kTGlzdCk7Ci0JCWludCBzaXplID0gMjAwMCArIDM1MDAgKiBtb2R1bGVMaXN0LnNpemUoKSArIDUwMCAqIHRhc2tzLmxlbmd0aDsKLQkJCi0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGluZywgZ2V0U2VydmVyKCkuZ2V0TmFtZSgpKSwgc2l6ZSk7Ci0JCQotCQlNdWx0aVN0YXR1cyB0ZW1wTXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOwotCQkKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkKLQkJdHJ5IHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlN0YXJ0aW5nIHB1Ymxpc2giKTsKLQkJCXB1Ymxpc2hTdGFydChQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkKLQkJCS8vIGV4ZWN1dGUgdGFza3MKLQkJCU11bHRpU3RhdHVzIHRhc2tTdGF0dXMgPSBwZXJmb3JtVGFza3ModGFza3MsIG1vbml0b3IpOwotCQkJaWYgKHRhc2tTdGF0dXMgIT0gbnVsbCAmJiAhdGFza1N0YXR1cy5pc09LKCkpCi0JCQkJdGVtcE11bHRpLmFkZEFsbCh0YXNrU3RhdHVzKTsKLQkJCQotCQkJZXhlY3V0ZVB1Ymxpc2hlcnMoa2luZCwgbW9kdWxlTGlzdCwgbW9uaXRvciwgaW5mbzIpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCi0JCQkvLyBwdWJsaXNoIHRoZSBzZXJ2ZXIKLQkJCXB1Ymxpc2hTZXJ2ZXIoa2luZCwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCkpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCi0JCQkvLyBwdWJsaXNoIG1vZHVsZXMKLQkJCXB1Ymxpc2hNb2R1bGVzKGtpbmQsIG1vZHVsZUxpc3QsIGRlbHRhS2luZExpc3QsIHRlbXBNdWx0aSwgbW9uaXRvcik7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5JTkZPLCAiQ29yZUV4Y2VwdGlvbiBwdWJsaXNoaW5nIHRvICIgKyB0b1N0cmluZygpLCBjZSk7Ci0JCQlyZXR1cm4gY2UuZ2V0U3RhdHVzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBwdWJsaXNoaW5nICB0byAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQl0ZW1wTXVsdGkuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBlbmQgdGhlIHB1Ymxpc2hpbmcKLQkJCXRyeSB7Ci0JCQkJcHVibGlzaEZpbmlzaChQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCA1MDApKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5JTkZPLCAiQ29yZUV4Y2VwdGlvbiBwdWJsaXNoaW5nIHRvICIgKyB0b1N0cmluZygpLCBjZSk7Ci0JCQkJdGVtcE11bHRpLmFkZChjZS5nZXRTdGF0dXMoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHN0b3BwaW5nIHB1Ymxpc2ggdG8gIiArIHRvU3RyaW5nKCksIGUpOwotCQkJCXRlbXBNdWx0aS5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hpbmcsIGUpKTsKLQkJCX0KLQkJfQotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLS08LS0gRG9uZSBwdWJsaXNoaW5nIC0tPC0tIik7Ci0JCQotCQlpZiAodGVtcE11bHRpLmdldENoaWxkcmVuKCkubGVuZ3RoID09IDEpCi0JCQlyZXR1cm4gdGVtcE11bHRpLmdldENoaWxkcmVuKClbMF07Ci0JCQotCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG51bGw7Ci0JCWlmICh0ZW1wTXVsdGkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCWVsc2UgaWYgKHRlbXBNdWx0aS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykKLQkJCW11bHRpID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnB1Ymxpc2hpbmdTdGF0dXNJbmZvLCBudWxsKTsKLQkJZWxzZSBpZiAodGVtcE11bHRpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCQkJbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMucHVibGlzaGluZ1N0YXR1c1dhcm5pbmcsIG51bGwpOwotCQllbHNlIGlmICh0ZW1wTXVsdGkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMucHVibGlzaGluZ1N0YXR1c0Vycm9yLCBudWxsKTsKLQkJCi0JCWlmIChtdWx0aSAhPSBudWxsKQotCQkJbXVsdGkuYWRkQWxsKHRlbXBNdWx0aSk7Ci0JCQotCQlyZXR1cm4gbXVsdGk7Ci0JfQotCi0JLypwcml2YXRlIHZvaWQgcHJpbnRNb2R1bGUoSU1vZHVsZVJlc291cmNlW10gcmVzLCBTdHJpbmcgaW5kKSB7Ci0JCWludCBzaXplID0gcmVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChyZXNbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7Ci0JCQkJSU1vZHVsZUZvbGRlciBmID0gKElNb2R1bGVGb2xkZXIpIHJlc1tpXTsKLQkJCQlwcmludE1vZHVsZShmLm1lbWJlcnMoKSwgaW5kICsgIiAgIik7Ci0JCQl9IGVsc2UgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLklORk8sIGluZCArIHJlc1tpXS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JfSovCi0KLQkvKioKLQkgKiBQdWJsaXNoIGEgc2luZ2xlIG1vZHVsZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCBhIHB1Ymxpc2gga2luZAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcGFyYW0gZGVsdGFLaW5kIHRoZSBkZWx0YSBraW5kCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gdGhlIHN0YXR1cwotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHB1Ymxpc2hNb2R1bGUoaW50IGtpbmQsIElNb2R1bGVbXSBtb2R1bGUsIGludCBkZWx0YUtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQdWJsaXNoaW5nIG1vZHVsZTogIiArIG1vZHVsZSk7Ci0JCQotCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7Ci0JCUlNb2R1bGUgbSA9IG1vZHVsZVtzaXplIC0gMV07Ci0JCW1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLnB1Ymxpc2hpbmdNb2R1bGUsIG0uZ2V0TmFtZSgpKSwgMTAwMCk7Ci0JCQotCQl0cnkgewotCQkJcHVibGlzaE1vZHVsZShraW5kLCBkZWx0YUtpbmQsIG1vZHVsZSwgbW9uaXRvcik7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJcmV0dXJuIGNlLmdldFN0YXR1cygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiRG9uZSBwdWJsaXNoaW5nOiAiICsgbW9kdWxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1vZHVsZSBoYXMgYmVlbiBwdWJsaXNoZWQsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1vZHVsZSBoYXMgYmVlbiBwdWJsaXNoZWQsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNCZWVuUHVibGlzaGVkKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLmhhc01vZHVsZVB1Ymxpc2hJbmZvKG1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyByZW1vdmVkIG1vZHVsZXMuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZUxpc3QgYSBsaXN0IG9mIG1vZHVsZXMKLQkgKiBAcGFyYW0ga2luZExpc3QgZGVwcmVjYXRlZCwgc2hvdWxkIGJlIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZW1vdmVkTW9kdWxlcyhMaXN0PElNb2R1bGVbXT4gbW9kdWxlTGlzdCwgTGlzdDxJbnRlZ2VyPiBraW5kTGlzdCkgewotCQlzZXJ2ZXIuZ2V0U2VydmVyUHVibGlzaEluZm8oKS5hZGRSZW1vdmVkTW9kdWxlcyhtb2R1bGVMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHN0b3JlZCBwdWJsaXNoIGluZm8gZm9yIHRoZSBnaXZlbiBtb2R1bGUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgc2hvdWxkIG5ldmVyIG5lZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LiBXaWxsIGJlIHJlbW92ZWQKLQkgKiAgICBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFdUUAotCSAqIEBwYXJhbSBkZWx0YUtpbmQgYSBwdWJsaXNoIGRlbHRhIGtpbmQKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHVibGlzaEluZm8oaW50IGRlbHRhS2luZCwgSU1vZHVsZVtdIG1vZHVsZSkgewotCQkvLyBUT0RPIHJlbW92ZQotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2hlcyB0aGUgZ2l2ZW4gbW9kdWxlcy4gUmV0dXJucyB0cnVlIGlmIHRoZSBwdWJsaXNoaW5nCi0JICogc2hvdWxkIGNvbnRpbnVlLCBvciBmYWxzZSBpZiBwdWJsaXNoaW5nIGhhcyBmYWlsZWQgb3IgaXMgY2FuY2VsZWQuCi0JICogCi0JICogVXNlcyA1MDAgdGlja3MgcGx1cyAzNTAwIHRpY2tzIHBlciBtb2R1bGUKLQkgKiAKLQkgKiBAcGFyYW0ga2luZCB0aGUgcHVibGlzaCBraW5kCi0JICogQHBhcmFtIG1vZHVsZXMgYSBsaXN0IG9mIG1vZHVsZXMKLQkgKiBAcGFyYW0gZGVsdGFLaW5kMiBhIGxpc3Qgb2YgZGVsdGEga2luZHMKLQkgKiBAcGFyYW0gbXVsdGkgYSBtdWx0aXN0YXR1cyB0byBhZGQgdGhlIHN0YXR1cyB0bwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoTW9kdWxlcyhpbnQga2luZCwgTGlzdCBtb2R1bGVzLCBMaXN0IGRlbHRhS2luZDIsIE11bHRpU3RhdHVzIG11bHRpLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWludCBzaXplID0gbW9kdWxlcy5zaXplKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBwdWJsaXNoIG1vZHVsZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCS8vIHNraXAgY2xvc2VkIHByb2plY3RzCi0JCQlJTW9kdWxlW10gbW9kdWxlID0gKElNb2R1bGVbXSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlJTW9kdWxlIG0gPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOwotCQkJaWYgKG0uZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgIW0uZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQlpbnQga2luZDIgPSBraW5kOwotCQkJaWYgKGdldFNlcnZlcigpLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUpID09IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9VTktOT1dOKQotCQkJCWtpbmQyID0gSVNlcnZlci5QVUJMSVNIX0ZVTEw7Ci0JCQkKLQkJCS8qaW50IGRlbHRhS2luZCA9IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLkFEREVEOwotCQkJaWYgKGhhc0JlZW5QdWJsaXNoZWQobW9kdWxlKSkgewotCQkJCWlmIChnZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSkubGVuZ3RoID09IDApCi0JCQkJCWRlbHRhS2luZCA9IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLk5PX0NIQU5HRTsKLQkJCQllbHNlCi0JCQkJCWRlbHRhS2luZCA9IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLkNIQU5HRUQ7Ci0JCQl9IC8vIFRPRE8gUkVNT1ZFRCovCi0JCQkKLQkJCUlTdGF0dXMgc3RhdHVzID0gcHVibGlzaE1vZHVsZShraW5kMiwgbW9kdWxlLCAoKEludGVnZXIpZGVsdGFLaW5kMi5nZXQoaSkpLmludFZhbHVlKCksIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDMwMDApKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCQltdWx0aS5hZGQoc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2ggdGFza3MgdGhhdCBoYXZlIGJlZW4gdGFyZ2V0ZWQgdG8gdGhpcyBzZXJ2ZXIuCi0JICogVGhlc2UgdGFza3Mgc2hvdWxkIGJlIHJ1biBkdXJpbmcgcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCBvbmUgb2YgdGhlIElTZXJ2ZXIuUFVCTElTSF9YWCBjb25zdGFudHMKLQkgKiBAcGFyYW0gbW9kdWxlTGlzdCBhIGxpc3Qgb2YgbW9kdWxlcwotCSAqIEBwYXJhbSBraW5kTGlzdCBsaXN0IG9mIG9uZSBvZiB0aGUgSVNlcnZlciBwdWJsaXNoIGNoYW5nZSBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgSU9wdGlvbmFsVGFza3MKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKGludCBraW5kLCBMaXN0IG1vZHVsZUxpc3QsIExpc3Qga2luZExpc3QpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRUYXNrcyhraW5kLCBtb2R1bGVMaXN0LCBraW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSBwdWJsaXNoZXJzLgotCSAqIAotCSAqIEBwYXJhbSBraW5kIHRoZSBwdWJsaXNoIGtpbmQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHBhcmFtIGluZm8gdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUKLQkgKiAgICBjYWxsZXIgaW4gb3JkZXIgdG8gc3VwcGx5IFVJIGluZm9ybWF0aW9uIGZvciBwcm9tcHRpbmcgdGhlCi0JICogICAgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LAotCSAqICAgIGl0IHNob3VsZCBtaW5pbWFsbHkgY29udGFpbiBhbiBhZGFwdGVyIGZvciB0aGUKLQkgKiAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbC5jbGFzcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVQdWJsaXNoZXJzKGludCBraW5kLCBMaXN0PElNb2R1bGVbXT4gbW9kdWxlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUHVibGlzaGVyW10gcHVibGlzaGVycyA9ICgoU2VydmVyKWdldFNlcnZlcigpKS5nZXRFbmFibGVkUHVibGlzaGVycygpOwotCQlpbnQgc2l6ZSA9IHB1Ymxpc2hlcnMubGVuZ3RoOwotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJFeGVjdXRpbmcgcHVibGlzaGVyczogIiArIHNpemUpOwotCQkKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybjsKLQkJCi0JCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCBnZXRTZXJ2ZXIoKSk7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfTU9EVUxFUywgbW9kdWxlcyk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJUHVibGlzaGVyIHB1YiA9IHB1Ymxpc2hlcnNbaV07Ci0JCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMudGFza1BlcmZvcm1pbmcsIHB1Yi5nZXROYW1lKCkpKTsKLQkJCXRyeSB7Ci0JCQkJcHViLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwotCQkJCXB1Yi5leGVjdXRlKGtpbmQsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDUwMCksIGluZm8pOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIlB1Ymxpc2hlciBmYWlsZWQiLCBjZSk7Ci0JCQkJdGhyb3cgY2U7Ci0JCQl9Ci0JCQkKLQkJCS8vIHJldHVybiBlYXJseSBpZiB0aGUgbW9uaXRvciBoYXMgYmVlbiBjYW5jZWxlZAotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBtb2R1bGVzIHRoYXQgYXJlIG9uIHRoZSBzZXJ2ZXIsIGluY2x1ZGluZyByb290Ci0JICogbW9kdWxlcyBhbmQgYWxsIHRoZWlyIGNoaWxkcmVuLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIElNb2R1bGVbXXMKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxJTW9kdWxlW10+IGdldEFsbE1vZHVsZXMoKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0QWxsTW9kdWxlcygpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gKGV4ZWN1dGUpIGFsbCB0aGUgZ2l2ZW4gdGFza3MuCi0JICogCi0JICogQHBhcmFtIHRhc2tzIGFuIGFycmF5IG9mIHRhc2tzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gdGhlIHN0YXR1cwotCSAqLwotCXByb3RlY3RlZCBNdWx0aVN0YXR1cyBwZXJmb3JtVGFza3MoUHVibGlzaE9wZXJhdGlvbltdIHRhc2tzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaW50IHNpemUgPSB0YXNrcy5sZW5ndGg7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBlcmZvcm1pbmcgdGFza3M6ICIgKyBzaXplKTsKLQkJCi0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnRhc2tQZXJmb3JtaW5nLCBudWxsKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlQdWJsaXNoT3BlcmF0aW9uIHRhc2sgPSB0YXNrc1tpXTsKLQkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy50YXNrUGVyZm9ybWluZywgdGFzay50b1N0cmluZygpKSk7Ci0JCQl0cnkgewotCQkJCXRhc2suZXhlY3V0ZShQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCA1MDApLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJUYXNrIGZhaWxlZCIsIGNlKTsKLQkJCQltdWx0aS5hZGQoY2UuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQkJCi0JCQkvLyByZXR1cm4gZWFybHkgaWYgdGhlIG1vbml0b3IgaGFzIGJlZW4gY2FuY2VsZWQKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gbXVsdGk7Ci0JCX0KLQkJCi0JCXJldHVybiBtdWx0aTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiByZXNvdXJjZXMgY2hhbmdlIHdpdGhpbiB0aGUgd29ya3NwYWNlLgotCSAqIFRoaXMgZ2l2ZXMgdGhlIHNlcnZlciBhbiBvcHBvcnR1bml0eSB0byB1cGRhdGUgdGhlIHNlcnZlciBvciBtb2R1bGUKLQkgKiByZXN0YXJ0IHN0YXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZVJlc291cmNlQ2hhbmdlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1NlcnZlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9TZXJ2ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDExZjIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1NlcnZlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKLS8qKgotICogQSBzZXJ2ZXIgZGVsZWdhdGUgcHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB2YXJpb3VzIAotICogZ2VuZXJpYyBhbmQgc2VydmVyLXR5cGUtc3BlY2lmaWMgb3BlcmF0aW9ucyBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHNlcnZlci4KLSAqIEEgc2VydmVyIGRlbGVnYXRlIGlzIHNwZWNpZmllZCBieSB0aGUKLSAqIDxjb2RlPmNsYXNzPC9jb2RlPiBhdHRyaWJ1dGUgb2YgYSA8Y29kZT5zZXJ2ZXJUeXBlczwvY29kZT4gZXh0ZW5zaW9uLgotICogPHA+Ci0gKiBXaGVuIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgbmVlZHMgdG8gYmUgZ2l2ZW4gYSBkZWxlZ2F0ZSwgdGhlIGRlbGVnYXRlIGNsYXNzCi0gKiBzcGVjaWZpZWQgZm9yIHRoZSBzZXJ2ZXIgdHlwZSBpcyBpbnN0YW50aWF0ZWQgd2l0aCBhIDAtYXJndW1lbnQgY29uc3RydWN0b3IKLSAqIGFuZCBwcmltZWQgd2l0aCA8Y29kZT5kZWxlZ2F0ZS5pbml0aWFsaXplKCgoSVNlcnZlclN0YXRlKXNlcnZlcik8L2NvZGU+LCAKLSAqIHdoaWNoIGl0IGlzIGV4cGVjdGVkIHRvIGhhbmcgb24gdG8uIExhdGVyLCB3aGVuCi0gKiA8Y29kZT5kZWxlZ2F0ZS5kaXNwb3NlKCk8L2NvZGU+IGlzIGNhbGxlZCBhcyB0aGUgc2VydmVyIGluc3RhbmNlIGlzCi0gKiBiZWluZyBkaXNjYXJkZWQsIHRoZSBkZWxlZ2F0ZSBpcyBleHBlY3RlZCB0byBsZXQgZ28gb2YgdGhlIHNlcnZlciBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqIDxwPgotICogU2VydmVyRGVsZWdhdGUgc3VwcG9ydHMgYW4gb3Blbi1lbmRlZCBzZXQgb2YgYXR0cmlidXRlLXZhbHVlIHBhaXJzLiBBbGwKLSAqIHN0YXRlIHN0b3JlZCBpbiB0aGlzIG1hbm5lciB3aWxsIGJlIHNhdmVkIHdoZW4gdGhlIHNlcnZlciB3b3JraW5nIGNvcHkgaXMKLSAqIHNhdmVkLCBhbmQgcGVyc2lzdGVkIGFjcm9zcyB3b3JrYmVuY2ggc2Vzc2lvbnMuCi0gKiBTZXJ2ZXIgZGVsZWdhdGVzIG1heSBrZWVwIHN0YXRlIGluIGluc3RhbmNlIGZpZWxkcywgYnV0IHRoYXQgc3RhdGUgaXMKLSAqIHRyYW5zaWVudCBhbmQgd2lsbCBub3QgYmUgcGVyc2lzdGVkIGFjcm9zcyB3b3JrYmVuY2ggc2Vzc2lvbnMuIFRvIHNhdmUKLSAqIHN0YXRlIGFjcm9zcyB3b3JrYmVuY2ggc2Vzc2lvbnMsIGl0IG11c3QgYmUgcGVyc2lzdGVkIHVzaW5nIHRoZQotICogYXR0cmlidXRlcy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+c2VydmVyVHlwZXM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBJU2VydmVyCi0gKiBAc2VlIElTZXJ2ZXJXb3JraW5nQ29weQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyRGVsZWdhdGUgewotCXByaXZhdGUgU2VydmVyIHNlcnZlcjsKLQlwcml2YXRlIFNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldDOwotCi0JLyoqCi0JICogRGVsZWdhdGVzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgU2VydmVyRGVsZWdhdGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHNlcnZlciBkZWxlZ2F0ZSB3aXRoIGl0cyBsaWZlLWxvbmcgc2VydmVyIGluc3RhbmNlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdTZXJ2ZXIgdGhlIHNlcnZlciBpbnN0YW5jZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKi8KLQlmaW5hbCB2b2lkIGluaXRpYWxpemUoU2VydmVyIG5ld1NlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNlcnZlciA9IG5ld1NlcnZlcjsKLQkJaWYgKG5ld1NlcnZlciBpbnN0YW5jZW9mIFNlcnZlcldvcmtpbmdDb3B5KQotCQkJc2VydmVyV0MgPSAoU2VydmVyV29ya2luZ0NvcHkpIG5ld1NlcnZlcjsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgc2VydmVyIGRlbGVnYXRlLiBUaGlzIG1ldGhvZCBnaXZlcyBkZWxlZ2F0ZXMgYSBjaGFuY2UKLQkgKiB0byBkbyB0aGVpciBvd24gaW5pdGlhbGl6YXRpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB0aGF0IHRoaXMgc2VydmVyIGRlbGVnYXRlIGNvcnJlc3BvbmRzIHRvLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBJU2VydmVyIGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgd29ya2luZyBjb3B5IHRoYXQgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUgY29ycmVzcG9uZHMgdG8uCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIGZpbmFsIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXJXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIHNlcnZlcldDOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgaW50LXZhbHVlZCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICogQHNlZSAjc2V0QXR0cmlidXRlKFN0cmluZywgaW50KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gc2VydmVyLmdldEF0dHJpYnV0ZShpZCwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGJvb2xlYW4tdmFsdWVkIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGUoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGdldEF0dHJpYnV0ZShTdHJpbmcgaWQsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nLXZhbHVlZCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICogQHNlZSAjc2V0QXR0cmlidXRlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gc2VydmVyLmdldEF0dHJpYnV0ZShpZCwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIExpc3QtdmFsdWVkIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGUoU3RyaW5nLCBMaXN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0IGdldEF0dHJpYnV0ZShTdHJpbmcgaWQsIExpc3Q8U3RyaW5nPiBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRBdHRyaWJ1dGUoaWQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBNYXAtdmFsdWVkIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGUoU3RyaW5nLCBNYXApCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE1hcCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBNYXAgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgc2VydmVyIGRlbGVnYXRlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGxldCBnbyBvZiB0aGUgZGVsZWdhdGUncyByZWZlcmVuY2UKLQkgKiB0byB0aGUgc2VydmVyLCBkZXJlZ2lzdGVyIGxpc3RlbmVycywgZXRjLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbW9kdWxlIG1vZGlmaWNhdGlvbnMgY291bGQgYmUgbWFkZSB0byB0aGlzCi0JICogc2VydmVyIGF0IHRoaXMgdGltZS4gU2VlIHRoZSBzcGVjaWZpY2F0aW9uIG9mCi0JICoge0BsaW5rIElTZXJ2ZXJBdHRyaWJ1dGVzI2Nhbk1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdLCBJTW9kdWxlW10sIElQcm9ncmVzc01vbml0b3IpfQotCSAqIGZvciBmdXJ0aGVyIGRldGFpbHMuIAotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yayBpbiByZXNwb25zZSB0bwotCSAqIGEgY2FsbCB0byA8Y29kZT5JU2VydmVyLmNhbk1vZGlmeU1vZHVsZXM8L2NvZGU+LiBJdCBzaG91bGQgcmV0dXJuIHF1aWNrbHkKLQkgKiB3aXRob3V0IGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlci4gQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWRkIGEgcG9zc2libHktZW1wdHkgbGlzdCBvZiBtb2R1bGVzIHRvIGFkZAotCSAqIEBwYXJhbSByZW1vdmUgYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIG1vZHVsZXMgdG8gcmVtb3ZlCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBtb2R1bGVzCi0JICogICBjYW4gYmUgbW9kaWZpZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aHkgdGhleSBjYW4ndAotCSAqIEBzZWUgSVNlcnZlckF0dHJpYnV0ZXMjY2FuTW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10sIElNb2R1bGVbXSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSVN0YXR1cyBjYW5Nb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlKHMpIG9mIHRoaXMgbW9kdWxlLiBJZiB0aGlzIG1vZHVsZSBjb250YWlucyBvdGhlcgotCSAqIG1vZHVsZXMsIGl0IHNob3VsZCBsaXN0IHRob3NlIG1vZHVsZXMuIElmIG5vdCwgaXQgc2hvdWxkIHJldHVybiBhbiBlbXB0eQotCSAqIGxpc3QuCi0JICogCi0JICogPHA+VGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgcmV0dXJuIHRoZSBkaXJlY3QgY2hpbGRyZW4uIFRvIG9idGFpbiB0aGUgZnVsbAotCSAqIHRyZWUgb2YgbW9kdWxlcyBpZiB0aGV5IGFyZSBtdWx0aXBsZSBsZXZlbHMgZGVlcCwgdGhpcyBtZXRob2QgbWF5IGJlCi0JICogcmVjdXJzaXZlbHkgY2FsbGVkIG9uIHRoZSBjaGlsZHJlbi48L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gdGhlIGNoaWxkIG1vZHVsZXMKLQkgKiBAc2VlIElTZXJ2ZXJBdHRyaWJ1dGVzI2dldENoaWxkTW9kdWxlcyhJTW9kdWxlW10sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIGFic3RyYWN0IElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgbW9kdWxlKHMpIG9mIHRoaXMgbW9kdWxlLiBXaGVuIGRldGVybWluaW5nIGlmIGEgZ2l2ZW4KLQkgKiBwcm9qZWN0IGNhbiBydW4gb24gYSBzZXJ2ZXIsIHRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZSBhY3R1YWwKLQkgKiBtb2R1bGUocykgdGhhdCBtYXkgYmUgcnVuIG9uIHRoZSBzZXJ2ZXIuIEZvciBpbnN0YW5jZSwgYSBXZWIgbW9kdWxlIG1heQotCSAqIHJldHVybiBhIGxpc3Qgb2YgRUFSIG1vZHVsZXMgdGhhdCBpdCBpcyBjb250YWluZWQgaW4gaWYgdGhlIHNlcnZlciBvbmx5Ci0JICogc3VwcG9ydHMgY29uZmlndXJpbmcgRUFSIG1vZHVsZXMuIElmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgcnVubmluZyBhIG1vZHVsZQotCSAqIGRpcmVjdGx5LCB0aGUgcmV0dXJuZWQgYXJyYXkgc2hvdWxkIGNvbnRhaW4gdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiA8cD5JZiB0aGUgbW9kdWxlIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBvcgotCSAqIGFuIGVtcHR5IGFycmF5LiBJZiB0aGUgdHlwZSBpcyBub3JtYWxseSBzdXBwb3J0ZWQgYnV0IHRoZXJlIGlzIGEKLQkgKiBjb25maWd1cmF0aW9uIHByb2JsZW0gb3IgbWlzc2luZyBwYXJlbnQsIGV0Yy4sIHRoaXMgbWV0aG9kIHdpbGwgZmlyZSBhCi0JICogQ29yZUV4Y2VwdGlvbiB0aGF0IG1heSB0aGVuIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci48L3A+Ci0JICogCi0JICogPHA+SWYgaXQgZG9lcyByZXR1cm4gdmFsaWQgcGFyZW50KHMpLCB0aGlzIG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4KLQkgKiB0aGUgdG9wbW9zdCBwYXJlbnQgbW9kdWxlKHMpLCBldmVuIGlmIHRoZXJlIGFyZSBhIGZldyBsZXZlbHMKLQkgKiAoYSBoZWlyYXJjaHkpIG9mIG1vZHVsZXMuPC9wPgotCSAqIAotCSAqIFtpc3N1ZTogc2hvdWxkIHRoZSBwYXJhbWV0ZXIgYmUgSU1vZHVsZVtdP10KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBwb3NzaWJsZSByb290IG1vZHVsZXMKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgd2VudCB3cm9uZwotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJBdHRyaWJ1dGVzI2dldFJvb3RNb2R1bGVzKElNb2R1bGUsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIGFic3RyYWN0IElNb2R1bGVbXSBnZXRSb290TW9kdWxlcyhJTW9kdWxlIG1vZHVsZSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFNlcnZlclBvcnRzIHRoYXQgdGhpcyBzZXJ2ZXIgaGFzLgotCSAqCi0JICogQHJldHVybiB0aGUgc2VydmVyJ3MgcG9ydHMKLQkgKi8KLQlwdWJsaWMgU2VydmVyUG9ydFtdIGdldFNlcnZlclBvcnRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHNlcnZlciB3aXRoIGRlZmF1bHQgdmFsdWVzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbgotCSAqIGEgbmV3IHNlcnZlciBpcyBjcmVhdGVkIHNvIHRoYXQgdGhlIHNlcnZlciBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aAotCSAqIG1lYW5pbmdmdWwgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXItdmFsdWVkIGF0dHJpYnV0ZSBvZiB0aGlzCi0JICogZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGUoU3RyaW5nLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgaW50IHZhbHVlKSB7Ci0JCXNlcnZlcldDLnNldEF0dHJpYnV0ZShpZCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYm9vbGVhbi12YWx1ZWQgYXR0cmlidXRlIG9mIHRoaXMKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZShTdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlzZXJ2ZXJXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy12YWx1ZWQgYXR0cmlidXRlIG9mIHRoaXMKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKLQkJc2VydmVyV0Muc2V0QXR0cmlidXRlKGlkLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBsaXN0LXZhbHVlZCBhdHRyaWJ1dGUgb2YgdGhpcwotCSAqIGVsZW1lbnQuIFRoZSBsaXN0IG1heSBvbmx5IGNvbnRhaW4gU3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGUoU3RyaW5nLCBMaXN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgaWQsIExpc3Q8U3RyaW5nPiB2YWx1ZSkgewotCQlzZXJ2ZXJXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIG1hcC12YWx1ZWQgYXR0cmlidXRlIG9mIHRoaXMKLQkgKiBlbGVtZW50LiBUaGUgbWFwIG1heSBvbmx5IGNvbnRhaW4gU3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGUoU3RyaW5nLCBNYXApCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgTWFwIHZhbHVlKSB7Ci0JCXNlcnZlcldDLnNldEF0dHJpYnV0ZShpZCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIE1vZGlmaWVzIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2ZXIuCi0JICogU2VlIHRoZSBzcGVjaWZpY2F0aW9uIG9mCi0JICoge0BsaW5rIElTZXJ2ZXJXb3JraW5nQ29weSNtb2RpZnlNb2R1bGVzKElNb2R1bGVbXSwgSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiBmb3IgZnVydGhlciBkZXRhaWxzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yaywKLQkgKiBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gPGNvZGU+SVNlcnZlcldvcmtpbmdDb3B5Lm1vZGlmeU1vZHVsZXM8L2NvZGU+LgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byB1cGRhdGUgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIChpZiBhbnkpCi0JICogb3IgdXBkYXRlIHRoZSBkZWxlZ2F0ZXMgaW50ZXJuYWwgc3RhdGUuIE5vdGUgdGhhdCB0aGUgYWN0dWFsIGxpc3QKLQkgKiBvZiBtb2R1bGVzIGlzIHN0b3JlZCBvbiB0aGUgc2VydmVyIGFuZCBjYW4gYmUgYWNjZXNzZWQgYXQgYW55IHRpbWUKLQkgKiB1c2luZyBzZXJ2ZXIuZ2V0TW9kdWxlcygpLiBnZXRNb2R1bGVzKCkgd2lsbCBub3QgYmUgdXBkYXRlZCB1bnRpbAotCSAqIGFmdGVyIHRoaXMgbWV0aG9kIHN1Y2Nlc3NmdWxseSByZXR1cm5zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzZXJ2ZXIuIEFmdGVyIHNhdmluZywKLQkgKiBwdWJsaXNoKCkgY2FuIGJlIHVzZWQgdG8gc3luYyB1cCB3aXRoIHRoZSBzZXJ2ZXIuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGFkZCBhIHBvc3NpYmx5LWVtcHR5IGxpc3Qgb2YgbW9kdWxlcyB0byBhZGQKLQkgKiBAcGFyYW0gcmVtb3ZlIGEgcG9zc2libHktZW1wdHkgbGlzdCBvZiBtb2R1bGVzIHRvIHJlbW92ZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIGNoYW5nZXMgYXJlIG5vdCBhbGxvd2VkIG9yIGNvdWxkIG5vdAotCSAqICAgIGJlIHByb2Nlc3NlZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBpbXBvcnQgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZyb20gdGhlIGdpdmVuCi0JICogcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHNlcnZlciBydW50aW1lCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEBkZXByZWNhdGVkIHNob3VsZCB1c2UgaW1wb3J0UnVudGltZUNvbmZpZ3VyYXRpb24gKHdoaWNoIGNhbiB0aHJvdyBhCi0JICogICAgQ29yZUV4Y2VwdGlvbikgaW5zdGVhZAotCSAqLwotCXB1YmxpYyB2b2lkIGltcG9ydENvbmZpZ3VyYXRpb24oSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlpbXBvcnRSdW50aW1lQ29uZmlndXJhdGlvbihydW50aW1lLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gaW1wb3J0IHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBnaXZlbgotCSAqIHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBzZXJ2ZXIgcnVudGltZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW55IHByb2JsZW0gaW1wb3J0aW5nIHRoZSBjb25maWd1cmF0aW9uCi0JICogICAgZnJvbSB0aGUgcnVudGltZQotCSAqLwotCXB1YmxpYyB2b2lkIGltcG9ydFJ1bnRpbWVDb25maWd1cmF0aW9uKElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHNhdmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVDb25maWd1cmF0aW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmb2xkZXIgaGFzIGNoYW5nZWQuCi0JICogSXQgZ2l2ZXMgdGhlIHNlcnZlciBhIGNoYW5jZSB0byB0aHJvdyBvdXQgYW55IG9sZCBkYXRhIGFuZCBiZSByZWFkeSB0bwotCSAqIHJlbG9hZCB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gd2hlbiBpdCBpcyBuZWVkZWQgbmV4dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uQ2hhbmdlZCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZmU0MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5TUEkgc3VwcG9ydCBmb3IgdGhlIHNlcnZlciB0b29scyBmcmFtZXdvcmsuPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VGhlIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIHdvdWxkIHR5cGljYWxseSBiZSBleHRlbmRlZCBvciB1c2VkIGJ5Ci1TUEkgY2xpZW50cyBvZiB0aGUgc2VydmVyIHRvb2xzIGZyYW1ld29yayB3aG8gYXJlIHByb3ZpZGluZyBhIG5ldyBzZXJ2ZXIKLXR5cGUsIHJ1bnRpbWUgdHlwZSwgb3Igb3RoZXIgZXh0ZW5zaW9uLiBUaGVzZSBkZWxlZ2F0ZXMgYXJlIG5ldmVyIHZpc2libGUKLXRvIHJlZ3VsYXIgQVBJIGNsaWVudHMgdW5sZXNzIGV4cGxpY2l0bHkgZXhwb3NlZCBieSB0aGUgcHJvdmlkZXIuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VGhlIG1ham9yaXR5IG9mIHRoZXNlIGNsYXNzZXMgYXJlIGRlbGVnYXRlcyB0byBpbXBsZW1lbnQgb25lIG9mIHRoZQotZXh0ZW5zaW9uIHBvaW50cy4gVmlldyB0aGUgZXh0ZW5zaW9uIHBvaW50IGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIKLWRldGFpbHMuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzMTIwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLTxoZWFkPgotCTwhLS0gIEVzY2FwZSB0byB0aGUgcm9vdCBvZiB5b3VyIHNvdXJjZSBmb2xkZXIgIC0tPgotCTxtZXRhCi0JCW5hbWU9InJvb3QiCi0JCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLQk8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08YWJzdHJhY3Q+U1BJIHN1cHBvcnQgZm9yIHRoZSBzZXJ2ZXIgdG9vbHMgZnJhbWV3b3JrLjwvYWJzdHJhY3Q+Ci0KLTxwPlRoZSBjbGFzc2VzIGluIHRoaXMgcGFja2FnZSB3b3VsZCB0eXBpY2FsbHkgYmUgZXh0ZW5kZWQgb3IgdXNlZCBieQotU1BJIGNsaWVudHMgb2YgdGhlIHNlcnZlciB0b29scyBmcmFtZXdvcmsgd2hvIGFyZSBwcm92aWRpbmcgYSBuZXcgc2VydmVyCi10eXBlLCBydW50aW1lIHR5cGUsIG9yIG90aGVyIGV4dGVuc2lvbi4gVGhlc2UgZGVsZWdhdGVzIGFyZSBuZXZlciB2aXNpYmxlCi10byByZWd1bGFyIEFQSSBjbGllbnRzIHVubGVzcyBleHBsaWNpdGx5IGV4cG9zZWQgYnkgdGhlIHByb3ZpZGVyLjwvcD4KLQotPHA+VGhlIG1ham9yaXR5IG9mIHRoZXNlIGNsYXNzZXMgYXJlIGRlbGVnYXRlcyB0byBpbXBsZW1lbnQgb25lIG9mIHRoZQotZXh0ZW5zaW9uIHBvaW50cy4gVmlldyB0aGUgZXh0ZW5zaW9uIHBvaW50IGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIKLWRldGFpbHMuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzZjZGI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+VGhlIG1haW4gc2VydmVyIHRvb2xzIGZyYW1ld29yayBjbGllbnQgQVBJLjwvcD4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPlNlcnZlckNvcmUgaXMgdGhlIG1haW4gZW50cnktcG9pbnQgYW5kIHByb3ZpZGVzIGFjY2VzcyB0byBtb3N0IG9mIHRoZQotcmVtYWluaW5nIEFQSS4gRnJvbSBoZXJlLCB5b3UgY2FuIGdldCB0aGUgZXhpc3Rpbmcgc2VydmVyIHJ1bnRpbWVzIGFuZAotc2VydmVycywgZ2V0IHRoZSBhdmFpbGFibGUgc2VydmVyIHR5cGVzLCBhbmQgYWNjZXNzIGludGVyZmFjZXMgZm9yIGFsbAotZXh0ZW5zaW9uIHBvaW50cy48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5TZXJ2ZXJVdGlsIHByb3ZpZGVzIHV0aWxpdHkgYW5kIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGRlYWxpbmcgd2l0aAotc2VydmVyIHRvb2xzLiBJdCBwcm92aWRlcyBlYXN5IGFjY2VzcyB0byBtb2R1bGVzLCBzZXJ2ZXIgcnVudGltZXMsIGFuZAotd2hhdCBjb21iaW5hdGlvbnMgYXJlIHN1cHBvcnRlZCAoZS5nLiB3aGljaCBydW50aW1lcyBjYW4gYmUgdXNlZCB0bwotdGFyZ2V0IGEgcGFydGljdWxhciBwcm9qZWN0KS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5JUnVudGltZSBhbmQgSVNlcnZlciBhcmUgdGhlIHR3byBtYWluIEFQSSBvYmplY3RzLiBJUnVudGltZSBpcyB1c2VkCi10byB0YXJnZXQgcHJvamVjdHMgdG8gYSBwYXJ0aWN1bGFyIHNlcnZlciBpbnN0YWxsYXRpb24gYW5kIGNvbXBpbGUvYnVpbGQKLWFnYWluc3QgdGhlbS4gV2hlbiBhIHJ1bnRpbWUgaXMgdGFyZ2V0dGVkIHRvIGEgcGFydGljdWxhciBydW50aW1lLAotYWxsIG9mIHRoZSBhcHBsaWNhYmxlIElSdW50aW1lVGFyZ2V0SGFuZGxlciBleHRlbnNpb25zIGFyZSBjYWxsZWQgdG8KLXNldCB0aGUgY2xhc3NwYXRoIG9yIG1vZGlmeSBvdGhlciBwcm9qZWN0IHNldHRpbmdzIGZvciB0aGUgcnVudGltZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5JU2VydmVyIGlzIHRoZSBtYWluIHNlcnZlciBjbGFzcyB0aGF0IGNsaWVudHMgY2FuIHVzZSB0byBzdGFydC9zdG9wCi1hbmQgcHVibGlzaCB0byBzZXJ2ZXJzLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPklNb2R1bGVzIHByb3ZpZGUgdGhlICJjb250ZW50IiB0aGF0IGNhbiBiZSBwdWJsaXNoZWQgdG8gc2VydmVycy4KLVNlZSB0aGUgc2VydmVyIHRvb2xzIEFQSSBvdmVydmlldyBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTI1NGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotPGhlYWQ+Ci0JPCEtLSAgRXNjYXBlIHRvIHRoZSByb290IG9mIHlvdXIgc291cmNlIGZvbGRlciAgLS0+Ci0JPG1ldGEKLQkJbmFtZT0icm9vdCIKLQkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotCTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxhYnN0cmFjdD5UaGUgbWFpbiBzZXJ2ZXIgdG9vbHMgZnJhbWV3b3JrIGNsaWVudCBBUEkuPC9hYnN0cmFjdD4KLQotPHA+U2VydmVyQ29yZSBpcyB0aGUgbWFpbiBlbnRyeS1wb2ludCBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIG1vc3Qgb2YgdGhlCi1yZW1haW5pbmcgQVBJLiBGcm9tIGhlcmUsIHlvdSBjYW4gZ2V0IHRoZSBleGlzdGluZyBzZXJ2ZXIgcnVudGltZXMgYW5kCi1zZXJ2ZXJzLCBnZXQgdGhlIGF2YWlsYWJsZSBzZXJ2ZXIgdHlwZXMsIGFuZCBhY2Nlc3MgaW50ZXJmYWNlcyBmb3IgYWxsCi1leHRlbnNpb24gcG9pbnRzLjwvcD4KLQotPHA+U2VydmVyVXRpbCBwcm92aWRlcyB1dGlsaXR5IGFuZCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGgKLXNlcnZlciB0b29scy4gSXQgcHJvdmlkZXMgZWFzeSBhY2Nlc3MgdG8gbW9kdWxlcywgc2VydmVyIHJ1bnRpbWVzLCBhbmQKLXdoYXQgY29tYmluYXRpb25zIGFyZSBzdXBwb3J0ZWQgKGUuZy4gd2hpY2ggcnVudGltZXMgY2FuIGJlIHVzZWQgdG8KLXRhcmdldCBhIHBhcnRpY3VsYXIgcHJvamVjdCkuPC9wPgotCi08cD5JUnVudGltZSBhbmQgSVNlcnZlciBhcmUgdGhlIHR3byBtYWluIEFQSSBvYmplY3RzLiBJUnVudGltZSBpcyB1c2VkCi10byB0YXJnZXQgcHJvamVjdHMgdG8gYSBwYXJ0aWN1bGFyIHNlcnZlciBpbnN0YWxsYXRpb24gYW5kIGNvbXBpbGUvYnVpbGQKLWFnYWluc3QgdGhlbS4gV2hlbiBhIHJ1bnRpbWUgaXMgdGFyZ2V0dGVkIHRvIGEgcGFydGljdWxhciBydW50aW1lLAotYWxsIG9mIHRoZSBhcHBsaWNhYmxlIElSdW50aW1lVGFyZ2V0SGFuZGxlciBleHRlbnNpb25zIGFyZSBjYWxsZWQgdG8KLXNldCB0aGUgY2xhc3NwYXRoIG9yIG1vZGlmeSBvdGhlciBwcm9qZWN0IHNldHRpbmdzIGZvciB0aGUgcnVudGltZS48L3A+Ci0KLTxwPklTZXJ2ZXIgaXMgdGhlIG1haW4gc2VydmVyIGNsYXNzIHRoYXQgY2xpZW50cyBjYW4gdXNlIHRvIHN0YXJ0L3N0b3AKLWFuZCBwdWJsaXNoIHRvIHNlcnZlcnMuPC9wPgotCi08cD5JTW9kdWxlcyBwcm92aWRlIHRoZSAiY29udGVudCIgdGhhdCBjYW4gYmUgcHVibGlzaGVkIHRvIHNlcnZlcnMuCi1TZWUgdGhlIHNlcnZlciB0b29scyBBUEkgb3ZlcnZpZXcgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9IdHRwTGF1bmNoYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9IdHRwTGF1bmNoYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Y2NTMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvSHR0cExhdW5jaGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0vKioKLSAqIEFuIEhUVFAgbGF1bmNoYWJsZSBvYmplY3QuIEVuY2Fwc3VsYXRlcyBhIGxhdW5jaCBvZiBhIFVSTCBmb3IgdGhlIFJ1biBvbiBTZXJ2ZXIKLSAqIHN1cHBvcnQuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEh0dHBMYXVuY2hhYmxlIHsKLQlwcml2YXRlIFVSTCB1cmw7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSByZWZlcmVuY2UgdG8gc29tZXRoaW5nIGFjY2Vzc2libGUgdmlhIEhUVFAuCi0JICogCi0JICogQHBhcmFtIHVybCB0aGUgVVJMIHRvIHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSHR0cExhdW5jaGFibGUoVVJMIHVybCkgewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFVSTCB0byB0aGUgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVSTCB0byB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSHR0cExhdW5jaGFibGVbdXJsPSIgKyB1cmwgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvSVN0YXRpY1dlYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9JU3RhdGljV2ViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NDcxYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9JU3RhdGljV2ViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwotLyoqCi0gKiBBIHN0YXRpYyBXZWIgbW9kdWxlIHRoYXQgY291bGQgYmUgZGVwbG95ZWQgdG8gQXBhY2hlIG9yIGFub3RoZXIKLSAqIEhUVFAgc2VydmVyLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YXRpY1dlYiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGV4dCByb290IG9mIHRoZSBXZWIuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZXh0Um9vdCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvTW9kdWxlRmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Nb2R1bGVGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMjlmYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Nb2R1bGVGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRmlsZTsKLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNb2R1bGVGaWxlfSBmb3IgcGh5c2ljYWwgZmlsZXMgb24gZGlzayBvciBpbiB0aGUKLSAqIHdvcmtzcGFjZS4KLSAqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVGaWxlIGltcGxlbWVudHMgSU1vZHVsZUZpbGUgewotCXByaXZhdGUgSUZpbGUgZmlsZTsKLQlwcml2YXRlIEZpbGUgZmlsZTI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIElQYXRoIHBhdGg7Ci0JcHJpdmF0ZSBsb25nIHN0YW1wID0gLTE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd29ya3NwYWNlIG1vZHVsZSBmaWxlIHdpdGggdGhlIGN1cnJlbnQgbW9kaWZpY2F0aW9uIHN0YW1wLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIGEgZmlsZSBpbiB0aGUgd29ya3NwYWNlCi0JICogQHBhcmFtIG5hbWUgYSBuYW1lCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIGZpbGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZShJRmlsZSBmaWxlLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJc3RhbXAgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgKyBmaWxlLmdldExvY2FsVGltZVN0YW1wKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlcm5hbCBtb2R1bGUgZmlsZSB3aXRoIHRoZSBjdXJyZW50IG1vZGlmaWNhdGlvbiBzdGFtcC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZShGaWxlIGZpbGUsIFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMuZmlsZTIgPSBmaWxlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCQlpZiAoZmlsZTIgIT0gbnVsbCkKLQkJCXN0YW1wID0gZmlsZTIubGFzdE1vZGlmaWVkKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG1vZHVsZSBmaWxlIHdpdGggYSBzcGVjaWZpYyBtb2RpZmljYXRpb24gc3RhbXAgYW5kIG5vCi0JICogZmlsZSByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBzdGFtcAotCSAqLwotCXB1YmxpYyBNb2R1bGVGaWxlKFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoLCBsb25nIHN0YW1wKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JCXRoaXMuc3RhbXAgPSBzdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd29ya3NwYWNlIG1vZHVsZSBmaWxlIHdpdGggYSBzcGVjaWZpYyBtb2RpZmljYXRpb24gc3RhbXAuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIHN0YW1wCi0JICogQGRlcHJlY2F0ZWQgdXNlIG9uZSBvZiB0aGUgdG9wIHR3byBjb25zdHJ1Y3RvcnMgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBNb2R1bGVGaWxlKElGaWxlIGZpbGUsIFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoLCBsb25nIHN0YW1wKSB7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JCXRoaXMuc3RhbXAgPSBzdGFtcDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZpbGUjZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQlyZXR1cm4gc3RhbXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZSNnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2UjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmICghKG9iaiBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUlNb2R1bGVGaWxlIG1mID0gKElNb2R1bGVGaWxlKSBvYmo7Ci0JCWlmICghbmFtZS5lcXVhbHMobWYuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFwYXRoLmVxdWFscyhtZi5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBuYW1lLmhhc2hDb2RlKCkgKiAzNyArIHBhdGguaGFzaENvZGUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgY2wpIHsKLQkJaWYgKElGaWxlLmNsYXNzLmVxdWFscyhjbCkpCi0JCQlyZXR1cm4gZmlsZTsKLQkJaWYgKEZpbGUuY2xhc3MuZXF1YWxzKGNsKSkKLQkJCXJldHVybiBmaWxlMjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVGaWxlIFsiICsgbmFtZSArICIsICIgKyBwYXRoICsgIiwgIiArIHN0YW1wICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL01vZHVsZUZvbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Nb2R1bGVGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5MTQ3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL01vZHVsZUZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNb2R1bGVGb2xkZXJ9IGZvciBwaHlzaWNhbCBmb2xkZXJzIG9uIGRpc2sgb3IgaW4gdGhlCi0gKiB3b3Jrc3BhY2UuCi0gKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlRm9sZGVyIGltcGxlbWVudHMgSU1vZHVsZUZvbGRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU1vZHVsZVJlc291cmNlW10gRU1QVFlfUkVTT1VSQ0VfQVJSQVkgPSBuZXcgSU1vZHVsZVJlc291cmNlWzBdOwotCi0JcHJpdmF0ZSBJQ29udGFpbmVyIGNvbnRhaW5lcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgSVBhdGggcGF0aDsKLQlwcml2YXRlIElNb2R1bGVSZXNvdXJjZVtdIG1lbWJlcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbW9kdWxlIGZvbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBjb250YWluZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciB1bmtub3duIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBuYW1lIGEgbmFtZQotCSAqIEBwYXJhbSBwYXRoIHRoZSBtb2R1bGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZm9sZGVyCi0JICovCi0JcHVibGljIE1vZHVsZUZvbGRlcihJQ29udGFpbmVyIGNvbnRhaW5lciwgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWVtYmVycyAoY29udGVudHMpIG9mIHRoaXMgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBtZW1iZXJzIHRoZSBtZW1iZXJzCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVtYmVycyhJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKSB7Ci0JCXRoaXMubWVtYmVycyA9IG1lbWJlcnM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZSNnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2UjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZvbGRlciNtZW1iZXJzKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gbWVtYmVycygpIHsKLQkJaWYgKG1lbWJlcnMgPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWV9SRVNPVVJDRV9BUlJBWTsKLQkJcmV0dXJuIG1lbWJlcnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSB0aGlzKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBNb2R1bGVGb2xkZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJTW9kdWxlRm9sZGVyIG1mID0gKE1vZHVsZUZvbGRlcikgb2JqOwotCQlpZiAoIW5hbWUuZXF1YWxzKG1mLm5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIXBhdGguZXF1YWxzKG1mLnBhdGgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gbmFtZS5oYXNoQ29kZSgpICogMzcgKyBwYXRoLmhhc2hDb2RlKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGNsKSB7Ci0JCWlmIChJQ29udGFpbmVyLmNsYXNzLmVxdWFscyhjbCkgfHwgSUZvbGRlci5jbGFzcy5lcXVhbHMoY2wpKQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVGb2xkZXIgWyIgKyBuYW1lICsgIiwgIiArIHBhdGggKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvTnVsbE1vZHVsZUFydGlmYWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL051bGxNb2R1bGVBcnRpZmFjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTgyMDhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvTnVsbE1vZHVsZUFydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0RGVsZWdhdGU7Ci0vKioKLSAqIEEgZHVtbXkgbW9kdWxlIGFydGlmYWN0LgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsTW9kdWxlQXJ0aWZhY3QgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdERlbGVnYXRlIHsKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcmVmZXJlbmNlIHRvIGEgbW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqLwotCXB1YmxpYyBOdWxsTW9kdWxlQXJ0aWZhY3QoSU1vZHVsZSBtb2R1bGUpIHsKLQkJc3VwZXIobW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZW1wdHkgcmVmZXJlbmNlIHRvIGEgbW9kdWxlLgotCSAqLwotCXB1YmxpYyBOdWxsTW9kdWxlQXJ0aWZhY3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTnVsbE1vZHVsZUFydGlmYWN0IFttb2R1bGU9IiArIGdldE1vZHVsZSgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1Byb2plY3RNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHJvamVjdE1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDY3NjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHJvamVjdE1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZURlbGVnYXRlOwotLyoqCi0gKiBBIHNpbXBsZSBJTW9kdWxlUHJvamVjdCB0aGF0IG1hcHMgYSBmb2xkZXIgd2l0aGluIGEgcHJvamVjdAotICogKG9yIHRoZSByb290IG9mIHRoZSBwcm9qZWN0IGl0c2VsZikgdG8gdGhlIG1vZHVsZS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdE1vZHVsZSBleHRlbmRzIE1vZHVsZURlbGVnYXRlIHsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcHJvamVjdCBtb2R1bGUuCi0JICovCi0JcHVibGljIFByb2plY3RNb2R1bGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcHJvamVjdCBtb2R1bGUgaW4gdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgbW9kdWxlCi0JICovCi0JcHVibGljIFByb2plY3RNb2R1bGUoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2plY3QgdGhhdCB0aGUgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IHRoYXQgdGhlIG1vZHVsZSBpcyBjb250YWluZWQgaW4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCAtIHJldHVybnMgdGhlIG1vZHVsZSdzIGlkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQkvL3JldHVybiBnZXRNb2R1bGUoKS5nZXRJZCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW9kdWxlRGVsZWdhdGUjdmFsaWRhdGUoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIC0gcmV0dXJucyB0aGUgbW9kdWxlJ3MgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCS8vcmV0dXJuIGdldE1vZHVsZSgpLmdldE5hbWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbW9kdWxlIGN1cnJlbnRseSBleGlzdHMsIGFuZCBmYWxzZSBpZiBpdCBoYXMKLQkgKiBiZWVuIGRlbGV0ZWQgb3IgbW92ZWQgYW5kIGlzIG5vIGxvbmdlciByZXByZXNlbnRlZCBieSB0aGlzIG1vZHVsZS4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIChnZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRQcm9qZWN0KCkuZXhpc3RzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIFByb2plY3RNb2R1bGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJUHJvamVjdE1vZHVsZSBkcCA9IChQcm9qZWN0TW9kdWxlKSBvYmo7Ci0JCS8vaWYgKGdldEZhY3RvcnlJZCgpICE9IG51bGwgJiYgIWdldEZhY3RvcnlJZCgpLmVxdWFscyhkcC5nZXRGYWN0b3J5SWQoKSkpCi0JCS8vCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiAhcHJvamVjdC5lcXVhbHMoZHAuZ2V0UHJvamVjdCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChnZXRJZCgpICE9IG51bGwgJiYgIWdldElkKCkuZXF1YWxzKGRwLmdldElkKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlcyBvZiB0aGlzIG1vZHVsZS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2hpbGQgbW9kdWxlcwotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbW9kdWxlIGhhcyBhIHNpbXBsZSBzdHJ1Y3R1cmUgYmFzZWQgb24gYQotCSAqIHNpbmdsZSByb290IGZvbGRlciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogPHA+Ci0JICogSW4gYSBzaW5nbGUgcm9vdCBzdHJ1Y3R1cmUsIGFsbCBmaWxlcyB0aGF0IGFyZSBjb250YWluZWQgd2l0aGluIHRoZSByb290IGZvbGRlcgotCSAqIGFyZSBwYXJ0IG9mIHRoZSBtb2R1bGUsIGFuZCBhcmUgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBtb2R1bGUgc3RydWN0dXJlLiBObwotCSAqIG1vZHVsZSByZXNvdXJjZXMgZXhpc3Qgb3V0c2lkZSBvZiB0aGlzIHNpbmdsZSBmb2xkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBtb2R1bGUgaGFzIGEgc2luZ2xlIHJvb3Qgc3RydWN0dXJlLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaW5nbGVSb290U3RydWN0dXJlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQmFzaWMgaW1wbGVtZW50YXRpb24gb2YgbWVtYmVycygpIG1ldGhvZC4gQXNzdW1lcyB0aGF0IHRoZSBlbnRpcmUgcHJvamVjdCBzaG91bGQKLQkgKiBiZSBwdWJsaXNoZWQgdG8gYSBzZXJ2ZXIuCi0JICogCi0JICogQHNlZSBNb2R1bGVEZWxlZ2F0ZSNtZW1iZXJzKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gbWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldE1vZHVsZVJlc291cmNlcyhQYXRoLkVNUFRZLCBnZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbW9kdWxlIHJlc291cmNlcyBmb3IgYSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqIEBwYXJhbSBjb250YWluZXIgYSBjb250YWluZXIKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1vZHVsZSByZXNvdXJjZXMKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gZ2V0TW9kdWxlUmVzb3VyY2VzKElQYXRoIHBhdGgsIElDb250YWluZXIgY29udGFpbmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCWlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSByZXNvdXJjZXMubGVuZ3RoOwotCQkJTGlzdDxJTW9kdWxlUmVzb3VyY2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGVSZXNvdXJjZT4oc2l6ZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkgewotCQkJCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQkJSUNvbnRhaW5lciBjb250YWluZXIyID0gKElDb250YWluZXIpIHJlc291cmNlOwotCQkJCQkJTW9kdWxlRm9sZGVyIG1mID0gbmV3IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Nb2R1bGVGb2xkZXIoY29udGFpbmVyMiwgbmFtZSwgcGF0aCk7Ci0JCQkJCQltZi5zZXRNZW1iZXJzKGdldE1vZHVsZVJlc291cmNlcyhwYXRoLmFwcGVuZChuYW1lKSwgY29udGFpbmVyMikpOwotCQkJCQkJbGlzdC5hZGQobWYpOwotCQkJCQl9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCWxpc3QuYWRkKG5ldyBNb2R1bGVGaWxlKChJRmlsZSkgcmVzb3VyY2UsIG5hbWUsIHBhdGgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1vZHVsZVJlc291cmNlcyA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KG1vZHVsZVJlc291cmNlcyk7Ci0JCQlyZXR1cm4gbW9kdWxlUmVzb3VyY2VzOwotCQl9Ci0JCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlWzBdOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Qcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZTFiYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Qcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUZhY3RvcnlEZWxlZ2F0ZTsKLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIGRlZmluaW5nIGEgbW9kdWxlIGZhY3RvcnkgdGhhdCBwcm92aWRlcyBtb2R1bGVzCi0gKiBiYXNlZCBvbiBwcm9qZWN0cy4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSBleHRlbmRzIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBNYXA8SVByb2plY3QsIElNb2R1bGVbXT4gbW9kdWxlcyA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBJTW9kdWxlW10+KCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS4KLQkgKi8KLQlwdWJsaWMgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWNoZSBtb2R1bGVzIHRoYXQgZXhpc3QgaW4gdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0IHRvIGNhY2hlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByaXZhdGUgZmluYWwgSU1vZHVsZVtdIGNhY2hlTW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlNb2R1bGVbXSBtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW0gPSBtb2R1bGVzLmdldChwcm9qZWN0KTsKLQkJCWlmIChtICE9IG51bGwpCi0JCQkJcmV0dXJuIG07Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCW0gPSBjcmVhdGVNb2R1bGVzKHByb2plY3QpOwotCQkJaWYgKG0gIT0gbnVsbCkgewotCQkJCW1vZHVsZXMucHV0KHByb2plY3QsIG0pOwotCQkJCXJldHVybiBtOwotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgbW9kdWxlIiwgdCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCX0KLQotCS8qKgotCSAqIENhY2hlIGFsbCBleGlzdGluZyBtb2R1bGVzLgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBjYWNoZU1vZHVsZXMoKSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQlpbnQgc2l6ZSA9IHByb2plY3RzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCWJvb2xlYW4gY2FjaGUgPSB0cnVlOwotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IG8gPSBtb2R1bGVzLmdldChwcm9qZWN0c1tpXSk7Ci0JCQkJCQlpZiAobyAhPSBudWxsKQotCQkJCQkJCWNhY2hlID0gZmFsc2U7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKGNhY2hlKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IGNyZWF0ZU1vZHVsZXMocHJvamVjdHNbaV0pOwotCQkJCQkJCWlmIChtb2R1bGVzMiAhPSBudWxsKQotCQkJCQkJCQltb2R1bGVzLnB1dChwcm9qZWN0c1tpXSwgbW9kdWxlczIpOwotCQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjcmVhdGluZyBtb2R1bGUgZm9yICIgKyBwcm9qZWN0c1tpXS5nZXROYW1lKCksIHQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FjaGluZyBtb2R1bGVzIiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2Ugcm9vdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB3b3Jrc3BhY2Ugcm9vdAotCSAqLwotCXByaXZhdGUgc3RhdGljIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVGYWN0b3J5RGVsZWdhdGUjZ2V0TW9kdWxlcygpCi0JICovCi0JcHVibGljIGZpbmFsIElNb2R1bGVbXSBnZXRNb2R1bGVzKCkgewotCQljYWNoZU1vZHVsZXMoKTsKLQkJCi0JCUxpc3Q8SU1vZHVsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oKTsKLQkJSXRlcmF0b3IgaXRlciA9IG1vZHVsZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJTW9kdWxlW10gbSA9IChJTW9kdWxlW10pIGl0ZXIubmV4dCgpOwotCQkJaWYgKG0gIT0gbnVsbCkKLQkJCQlsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KG0pKTsKLQkJfQotCQkKLQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gbmV3IElNb2R1bGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkobW9kdWxlczIpOwotCQlyZXR1cm4gbW9kdWxlczI7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGNoYW5nZXMgdG8gYSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqIEBwYXJhbSBkZWx0YSBhIHJlc291cmNlIGRlbHRhCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyB2b2lkIGhhbmRsZUdsb2JhbFByb2plY3RDaGFuZ2UoSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJTW9kdWxlRmFjdG9yeVtdIGZhY3RvcmllcyA9IFNlcnZlclBsdWdpbi5nZXRNb2R1bGVGYWN0b3JpZXMoKTsKLQkJaW50IHNpemUgPSBmYWN0b3JpZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGZhY3Rvcmllc1tpXS5kZWxlZ2F0ZSAhPSBudWxsICYmIGZhY3Rvcmllc1tpXS5kZWxlZ2F0ZSBpbnN0YW5jZW9mIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUpIHsKLQkJCQlQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIHBtZmQgPSAoUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSkgZmFjdG9yaWVzW2ldLmRlbGVnYXRlOwotCQkJCWlmIChwbWZkLmRlbHRhQWZmZWN0c01vZHVsZXMoZGVsdGEpKSB7Ci0JCQkJCXBtZmQuY2xlYXJDYWNoZShwcm9qZWN0KTsKLQkJCQkJcG1mZC5jbGVhckNhY2hlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGVsdGEgbWF5IGhhdmUgY2hhbmdlZCBtb2R1bGVzLAotCSAqIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YSBhIHJlc291cmNlIGRlbHRhCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGVsdGEgbWF5IGhhdmUgY2hhbmdlZCBtb2R1bGVzLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRlbHRhQWZmZWN0c01vZHVsZXMoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJZmluYWwgYm9vbGVhbltdIGIgPSBuZXcgYm9vbGVhblsxXTsKLQkJCi0JCWZpbmFsIElQYXRoW10gbGlzdGVuZXJQYXRocyA9IGdldExpc3RlbmVyUGF0aHMoKTsKLQkJaWYgKGxpc3RlbmVyUGF0aHMgPT0gbnVsbCB8fCBsaXN0ZW5lclBhdGhzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmaW5hbCBpbnQgc2l6ZSA9IGxpc3RlbmVyUGF0aHMubGVuZ3RoOwotCQkKLQkJdHJ5IHsKLQkJCWRlbHRhLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhMikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlpZiAoYlswXSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJLy9UcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsIGRlbHRhMi5nZXRSZXNvdXJjZSgpICsgIiAgIiArIGRlbHRhMi5nZXRLaW5kKCkgKyAiICIgKyBkZWx0YTIuZ2V0RmxhZ3MoKSk7Ci0JCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQkJSVBhdGggcGF0aCA9IGRlbHRhMi5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlpZiAobGlzdGVuZXJQYXRoc1tpXS5lcXVhbHMocGF0aCkpIHsKLQkJCQkJCQliWzBdID0gdHJ1ZTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9IGVsc2UgaWYgKHBhdGguaXNQcmVmaXhPZihsaXN0ZW5lclBhdGhzW2ldKSkgewotCQkJCQkJCW9rID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gb2s7Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkRlbHRhIGNvbnRhaW5zIGNoYW5nZTogIiArIHQuYik7Ci0JCXJldHVybiBiWzBdOwotCX0KLQotCS8qKgotCSAqIENsZWFyIGNhY2hlZCBtZXRhZGF0YS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNjbGVhckNhY2hlKElQcm9qZWN0KX0gaW5zdGVhZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCS8qKgotCSAqIENsZWFyIGNhY2hlZCBtZXRhZGF0YS4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJDYWNoZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCW1vZHVsZXMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgSU1vZHVsZVtdPigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1vZHVsZSBmb3IgYSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdCB0byBjcmVhdGUgbW9kdWxlcyBmb3IKLQkgKiBAcmV0dXJuIGEgbW9kdWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSB3YXMgbm8gbW9kdWxlIGluIHRoZSBwcm9qZWN0Ci0JICogQHNlZSAjY3JlYXRlTW9kdWxlcyhJUHJvamVjdCkKLQkgKiBAZGVwcmVjYXRlZCBVc2UgY3JlYXRlTW9kdWxlcyhJUHJvamVjdCkgaW5zdGVhZCwgd2hpY2ggc3VwcG9ydHMgbXVsdGlwbGUgbW9kdWxlcwotCSAqICAgIHBlciBwcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIElNb2R1bGUgY3JlYXRlTW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbW9kdWxlcyB0aGF0IGFyZSBjb250YWluZWQgd2l0aGluIGEgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QgdG8gY3JlYXRlIG1vZHVsZXMgZm9yCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIG1vZHVsZXMKLQkgKi8KLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIGNyZWF0ZU1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlJTW9kdWxlIG1vZHVsZSA9IGNyZWF0ZU1vZHVsZShwcm9qZWN0KTsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCQkKLQkJcmV0dXJuIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJlc291cmNlcyB0aGF0IHRoZSBtb2R1bGUgc2hvdWxkIGxpc3RlbiB0bwotCSAqIGZvciBzdGF0ZSBjaGFuZ2VzLiBUaGUgcGF0aHMgc2hvdWxkIGJlIHByb2plY3QgcmVsYXRpdmUgcGF0aHMuCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGUgcGF0aHMuCi0JICoKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgcGF0aHMKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGhbXSBnZXRMaXN0ZW5lclBhdGhzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlRmFjdG9yeURlbGVnYXRlI2dldE1vZHVsZXMoSVByb2plY3QpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBjYWNoZU1vZHVsZXMocHJvamVjdCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSNmaW5kTW9kdWxlKFN0cmluZykKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIElNb2R1bGUgZmluZE1vZHVsZShTdHJpbmcgaWQpIHsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IGFzc3VtZSB0aGF0IHRoZSBpZCBpcyBhIHByb2plY3QgbmFtZQotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGlkKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlJTW9kdWxlW10gbSA9IGNhY2hlTW9kdWxlcyhwcm9qZWN0KTsKLQkJCQlpZiAobSAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplID0gbS5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgaWQyID0gbVtpXS5nZXRJZCgpOwotCQkJCQkJaW50IGluZGV4ID0gaWQyLmluZGV4T2YoIjoiKTsKLQkJCQkJCWlmIChpbmRleCA+PSAwKQotCQkJCQkJCWlkMiA9IGlkMi5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChpZC5lcXVhbHMoaWQyKSkKLQkJCQkJCQlyZXR1cm4gbVtpXTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiQ291bGQgbm90IGZpbmQgIiArIGlkICsgIi4gUmV2ZXJ0aW5nIHRvIGRlZmF1bHQgYmVoYXZpb3VyIik7Ci0JCX0KLQkJCi0JCS8vIG90aGVyd2lzZSBkZWZhdWx0IHRvIHNlYXJjaGluZyBhbGwgbW9kdWxlcwotCQlyZXR1cm4gc3VwZXIuZmluZE1vZHVsZShpZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHVibGlzaEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHVibGlzaEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2NDY3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1B1Ymxpc2hBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklQdWJsaXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSBJUHVibGlzaExpc3RlbmVyIGludGVyZmFjZQotICogd2l0aCBlbXB0eSBtZXRob2RzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUHVibGlzaExpc3RlbmVyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQWRhcHRlciBpbXBsZW1lbnRzIElQdWJsaXNoTGlzdGVuZXIgewotCS8qKgotCSAqIEBzZWUgSVB1Ymxpc2hMaXN0ZW5lciNwdWJsaXNoU3RhcnRlZChJU2VydmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1Ymxpc2hTdGFydGVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElQdWJsaXNoTGlzdGVuZXIjcHVibGlzaEZpbmlzaGVkKElTZXJ2ZXIsIElTdGF0dXMpCi0JICovCi0JcHVibGljIHZvaWQgcHVibGlzaEZpbmlzaGVkKElTZXJ2ZXIgc2VydmVyLCBJU3RhdHVzIHN0YXR1cykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHVibGlzaEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9QdWJsaXNoSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOGQ5NzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9QdWJsaXNoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlByb2dyZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2VEZWx0YTsKLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIGFuIGFzc29ydG1lbnQgb2YgdXNlZnVsIHB1Ymxpc2hpbmcgZmlsZSBtZXRob2RzLgotICoKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFB1Ymxpc2hIZWxwZXIgewotCS8vIHNpemUgb2YgdGhlIGJ1ZmZlcgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVIgPSA2NTUzNjsKLQotCS8vIHRoZSBidWZmZXIKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYnVmID0gbmV3IGJ5dGVbQlVGRkVSXTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTdGF0dXNbXSBFTVBUWV9TVEFUVVMgPSBuZXcgSVN0YXR1c1swXTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgZGVmYXVsdFRlbXBEaXIgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9GaWxlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUEZJTEVfUFJFRklYID0gInRtcCI7Ci0KLQlwcml2YXRlIEZpbGUgdGVtcERpcjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBQdWJsaXNoSGVscGVyLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wRGlyZWN0b3J5IGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZHVyaW5nIHB1Ymxpc2hpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgdG8gdXNlIHRoZSBkZWZhdWx0LiBJZiBpdCBkb2VzIG5vdCBleGlzdCwgdGhlIGZvbGRlciB3aWxsIGJlIGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgUHVibGlzaEhlbHBlcihGaWxlIHRlbXBEaXJlY3RvcnkpIHsKLQkJdGhpcy50ZW1wRGlyID0gdGVtcERpcmVjdG9yeTsKLQkJaWYgKHRlbXBEaXIgPT0gbnVsbCkKLQkJCXRlbXBEaXIgPSBkZWZhdWx0VGVtcERpcjsKLQkJZWxzZSBpZiAoIXRlbXBEaXIuZXhpc3RzKCkpCi0JCQl0ZW1wRGlyLm1rZGlycygpOwotCX0KLQotCS8qKgotCSAqIENvcHkgYSBmaWxlIGZyb20gYSB0byBiLiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbSBhZnRlciB1c2UuCi0JICogCi0JICogQHBhcmFtIGluIGFuIGlucHV0IHN0cmVhbQotCSAqIEBwYXJhbSB0byBhIHBhdGggdG8gY29weSB0by4gdGhlIGRpcmVjdG9yeSBtdXN0IGFscmVhZHkgZXhpc3QKLQkgKiBAcGFyYW0gdHMgdGltZXN0YW1wCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29weUZpbGUoSW5wdXRTdHJlYW0gaW4sIElQYXRoIHRvLCBsb25nIHRzLCBJTW9kdWxlRmlsZSBtZikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJCi0JCUZpbGUgdGVtcEZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gdG8udG9GaWxlKCk7Ci0JCQl0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoVEVNUEZJTEVfUFJFRklYLCAiLiIgKyB0by5nZXRGaWxlRXh0ZW5zaW9uKCksIHRlbXBEaXIpOwotCQkJCi0JCQlvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7Ci0JCQkKLQkJCWludCBhdmFpbCA9IGluLnJlYWQoYnVmKTsKLQkJCXdoaWxlIChhdmFpbCA+IDApIHsKLQkJCQlvdXQud3JpdGUoYnVmLCAwLCBhdmFpbCk7Ci0JCQkJYXZhaWwgPSBpbi5yZWFkKGJ1Zik7Ci0JCQl9Ci0JCQkKLQkJCW91dC5jbG9zZSgpOwotCQkJb3V0ID0gbnVsbDsKLQkJCQotCQkJbW92ZVRlbXBGaWxlKHRlbXBGaWxlLCBmaWxlKTsKLQkJCQotCQkJaWYgKHRzICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QICYmIHRzICE9IDApCi0JCQkJZmlsZS5zZXRMYXN0TW9kaWZpZWQodHMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJUGF0aCBwYXRoID0gbWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuYXBwZW5kKG1mLmdldE5hbWUoKSk7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjb3B5aW5nIGZpbGU6ICIgKyBwYXRoLnRvT1NTdHJpbmcoKSArICIgdG8gIiArIHRvLnRvT1NTdHJpbmcoKSwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ29weWluZ0ZpbGUsIHBhdGgudG9PU1N0cmluZygpLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksIG51bGwpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0ZW1wRmlsZSAhPSBudWxsICYmIHRlbXBGaWxlLmV4aXN0cygpKQotCQkJCXRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOwotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byByZWN1cnNpdmVseSBkZWxldGUgYSBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gZGlyIGEgZGlyZWN0b3J5Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoIWRpci5leGlzdHMoKSB8fCAhZGlyLmlzRGlyZWN0b3J5KCkpCi0JCQlyZXR1cm4gbmV3IElTdGF0dXNbXSB7IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JOb3RBRGlyZWN0b3J5LCBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpLCBudWxsKSB9OwotCQkKLQkJTGlzdDxJU3RhdHVzPiBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KDIpOwotCQkKLQkJdHJ5IHsKLQkJCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLQkJCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRpbmdUYXNrLCBuZXcgU3RyaW5nW10geyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgfSksIHNpemUgKiAxMCk7Ci0JCQkKLQkJCS8vIGN5Y2xlIHRocm91Z2ggZmlsZXMKLQkJCWJvb2xlYW4gZGVsZXRlQ3VycmVudCA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUZpbGUgY3VycmVudCA9IGZpbGVzW2ldOwotCQkJCWlmIChjdXJyZW50LmlzRmlsZSgpKSB7Ci0JCQkJCWlmICghY3VycmVudC5kZWxldGUoKSkgewotCQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRpbmcsIGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCkpOwotCQkJCQkJZGVsZXRlQ3VycmVudCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEwKTsKLQkJCQl9IGVsc2UgaWYgKGN1cnJlbnQuaXNEaXJlY3RvcnkoKSkgewotCQkJCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRpbmdUYXNrLCBuZXcgU3RyaW5nW10ge2N1cnJlbnQuZ2V0QWJzb2x1dGVQYXRoKCl9KSk7Ci0JCQkJCUlTdGF0dXNbXSBzdGF0ID0gZGVsZXRlRGlyZWN0b3J5KGN1cnJlbnQsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwKSk7Ci0JCQkJCWlmIChzdGF0ICE9IG51bGwgJiYgc3RhdC5sZW5ndGggPiAwKSB7Ci0JCQkJCQlkZWxldGVDdXJyZW50ID0gZmFsc2U7Ci0JCQkJCQlhZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRlbGV0ZUN1cnJlbnQgJiYgIWRpci5kZWxldGUoKSkKLQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JEZWxldGluZywgZGlyLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCkpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBkZWxldGluZyBkaXJlY3RvcnkgIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSwgZSk7Ci0JCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpKTsKLQkJfQotCQkKLQkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKLQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7Ci0JCXJldHVybiBzdGF0OwotCX0KLQotCS8qKgotCSAqIFNtYXJ0IGNvcHkgdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGggYW4gZXh0ZXJuYWwgcGF0aCB0byBjb3B5IHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMgCi0JICovCi0JcHVibGljIElTdGF0dXNbXSBwdWJsaXNoU21hcnQoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIHB1Ymxpc2hTbWFydChyZXNvdXJjZXMsIHBhdGgsIG51bGwsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFNtYXJ0IGNvcHkgdGhlIGdpdmVuIG1vZHVsZSByZXNvdXJjZXMgdG8gdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcyBhbiBhcnJheSBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIHBhdGggYW4gZXh0ZXJuYWwgcGF0aCB0byBjb3B5IHRvCi0JICogQHBhcmFtIGlnbm9yZSBhbiBhcnJheSBvZiBwYXRocyByZWxhdGl2ZSB0byBwYXRoIHRvIGlnbm9yZSwgaS5lLiBub3QgZGVsZXRlIG9yIGNvcHkgb3ZlcgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzIAotCSAqLwotCXB1YmxpYyBJU3RhdHVzW10gcHVibGlzaFNtYXJ0KElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVBhdGhbXSBpZ25vcmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFlfU1RBVFVTOwotCQkKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkKLQkJTGlzdDxJU3RhdHVzPiBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KDIpOwotCQlGaWxlIHRvRGlyID0gcGF0aC50b0ZpbGUoKTsKLQkJaW50IGZyb21TaXplID0gcmVzb3VyY2VzLmxlbmd0aDsKLQkJU3RyaW5nW10gZnJvbUZpbGVOYW1lcyA9IG5ldyBTdHJpbmdbZnJvbVNpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZyb21TaXplOyBpKyspCi0JCQlmcm9tRmlsZU5hbWVzW2ldID0gcmVzb3VyY2VzW2ldLmdldE5hbWUoKTsKLQkJTGlzdDxTdHJpbmc+IGlnbm9yZUZpbGVOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZiAoaWdub3JlICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaWdub3JlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGlnbm9yZVtpXS5zZWdtZW50Q291bnQoKSA9PSAxKSB7Ci0JCQkJCWlnbm9yZUZpbGVOYW1lcy5hZGQoaWdub3JlW2ldLnRvT1NTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLwljYWNoZSBmaWxlcyBhbmQgZmlsZSBuYW1lcyBmb3IgcGVyZm9ybWFuY2UKLQkJRmlsZVtdIHRvRmlsZXMgPSBudWxsOwotCQlTdHJpbmdbXSB0b0ZpbGVOYW1lcyA9IG51bGw7Ci0JCQotCQlib29sZWFuIGZvdW5kRXhpc3RpbmdEaXIgPSBmYWxzZTsKLQkJaWYgKHRvRGlyLmV4aXN0cygpKSB7Ci0JCQlpZiAodG9EaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCWZvdW5kRXhpc3RpbmdEaXIgPSB0cnVlOwotCQkJCXRvRmlsZXMgPSB0b0Rpci5saXN0RmlsZXMoKTsKLQkJCQlpbnQgdG9TaXplID0gdG9GaWxlcy5sZW5ndGg7Ci0JCQkJdG9GaWxlTmFtZXMgPSBuZXcgU3RyaW5nW3RvU2l6ZV07Ci0JCQkJCi0JCQkJLy8gY2hlY2sgaWYgdGhpcyBleGFjdCBmaWxlIGV4aXN0cyBpbiB0aGUgbmV3IGRpcmVjdG9yeQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9TaXplOyBpKyspIHsKLQkJCQkJdG9GaWxlTmFtZXNbaV0gPSB0b0ZpbGVzW2ldLmdldE5hbWUoKTsKLQkJCQkJYm9vbGVhbiBpc0RpciA9IHRvRmlsZXNbaV0uaXNEaXJlY3RvcnkoKTsKLQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZyb21TaXplOyBqKyspIHsKLQkJCQkJCWlmICh0b0ZpbGVOYW1lc1tpXS5lcXVhbHMoZnJvbUZpbGVOYW1lc1tqXSkgJiYgaXNEaXIgPT0gcmVzb3VyY2VzW2pdIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gZGVsZXRlIGZpbGUgaWYgaXQgY2FuJ3QgYmUgZm91bmQgb3IgaXNuJ3QgdGhlIGNvcnJlY3QgdHlwZQotCQkJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJCQlib29sZWFuIGRlbGV0ZSA9IHRydWU7Ci0JCQkJCQkvLyBpZiBzaG91bGQgYmUgcHJlc2VydmVkLCBkb24ndCBkZWxldGUgYW5kIGRvbid0IHRyeSB0byBjb3B5Ci0JCQkJCQlmb3IgKFN0cmluZyBwcmVzZXJ2ZUZpbGVOYW1lIDogaWdub3JlRmlsZU5hbWVzKSB7Ci0JCQkJCQkJaWYgKHRvRmlsZU5hbWVzW2ldLmVxdWFscyhwcmVzZXJ2ZUZpbGVOYW1lKSkgewotCQkJCQkJCQlkZWxldGUgPSBmYWxzZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGRlbGV0ZSkgewotCQkJCQkJCWlmIChpc0RpcikgewotCQkJCQkJCQlJU3RhdHVzW10gc3RhdCA9IGRlbGV0ZURpcmVjdG9yeSh0b0ZpbGVzW2ldLCBudWxsKTsKLQkJCQkJCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoIXRvRmlsZXNbaV0uZGVsZXRlKCkpCi0JCQkJCQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JEZWxldGluZywgdG9GaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl0b0ZpbGVzW2ldID0gbnVsbDsKLQkJCQkJCXRvRmlsZU5hbWVzW2ldID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7IC8vaWYgKHRvRGlyLmlzRmlsZSgpKQotCQkJCWlmICghdG9EaXIuZGVsZXRlKCkpIHsKLQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRpbmcsIHRvRGlyLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCkpOwotCQkJCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOwotCQkJCQlzdGF0dXMudG9BcnJheShzdGF0KTsKLQkJCQkJcmV0dXJuIHN0YXQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghZm91bmRFeGlzdGluZ0RpciAmJiAhdG9EaXIubWtkaXJzKCkpIHsKLQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvck1rZGlyLCB0b0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpKTsKLQkJCUlTdGF0dXNbXSBzdGF0ID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07Ci0JCQlzdGF0dXMudG9BcnJheShzdGF0KTsKLQkJCXJldHVybiBzdGF0OwotCQl9Ci0JCQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm4gbmV3IElTdGF0dXNbXSB7IFN0YXR1cy5DQU5DRUxfU1RBVFVTIH07Ci0JCQotCQltb25pdG9yLndvcmtlZCg1MCk7Ci0JCQotCQkvLyBjeWNsZSB0aHJvdWdoIGZpbGVzIGFuZCBvbmx5IGNvcHkgd2hlbiBpdCBkb2Vzbid0IGV4aXN0Ci0JCS8vIG9yIGlzIG5ld2VyCi0JCWlmICh0b0ZpbGVzID09IG51bGwpIHsKLQkJCXRvRmlsZXMgPSB0b0Rpci5saXN0RmlsZXMoKTsKLQkJCWlmICh0b0ZpbGVzID09IG51bGwpCi0JCQkJdG9GaWxlcyA9IG5ldyBGaWxlWzBdOwotCQl9Ci0JCWludCB0b1NpemUgPSB0b0ZpbGVzLmxlbmd0aDsKLQkJCi0JCWludCBkdyA9IDA7Ci0JCWlmICh0b1NpemUgPiAwKQotCQkJZHcgPSA1MDAgLyB0b1NpemU7Ci0JCQotCQkvLyBjYWNoZSBmaWxlIG5hbWVzIGFuZCBsYXN0IG1vZGlmaWVkIGRhdGVzIGZvciBwZXJmb3JtYW5jZQotCQlpZiAodG9GaWxlTmFtZXMgPT0gbnVsbCkKLQkJCXRvRmlsZU5hbWVzID0gbmV3IFN0cmluZ1t0b1NpemVdOwotCQlsb25nW10gdG9GaWxlTW9kID0gbmV3IGxvbmdbdG9TaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b1NpemU7IGkrKykgewotCQkJaWYgKHRvRmlsZXNbaV0gIT0gbnVsbCkgewotCQkJCWlmICh0b0ZpbGVOYW1lc1tpXSAhPSBudWxsKQotCQkJCQl0b0ZpbGVOYW1lc1tpXSA9IHRvRmlsZXNbaV0uZ2V0TmFtZSgpOwotCQkJCXRvRmlsZU1vZFtpXSA9IHRvRmlsZXNbaV0ubGFzdE1vZGlmaWVkKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJvbVNpemU7IGkrKykgewotCQkJSU1vZHVsZVJlc291cmNlIGN1cnJlbnQgPSByZXNvdXJjZXNbaV07Ci0JCQlTdHJpbmcgbmFtZSA9IGZyb21GaWxlTmFtZXNbaV07Ci0JCQlib29sZWFuIGN1cnJlbnRJc0RpciA9IGN1cnJlbnQgaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyOwotCQkJCi0JCQlpZiAoIWN1cnJlbnRJc0RpcikgewotCQkJCS8vIGNoZWNrIGlmIHRoaXMgaXMgYSBuZXcgb3IgbmV3ZXIgZmlsZQotCQkJCWJvb2xlYW4gY29weSA9IHRydWU7Ci0JCQkJSU1vZHVsZUZpbGUgbWYgPSAoSU1vZHVsZUZpbGUpIGN1cnJlbnQ7Ci0JCQkJCi0JCQkJbG9uZyBtb2QgPSAtMTsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBtZi5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCW1vZCA9IGZpbGUuZ2V0TG9jYWxUaW1lU3RhbXAoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlGaWxlIGZpbGUyID0gKEZpbGUpIG1mLmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7Ci0JCQkJCW1vZCA9IGZpbGUyLmxhc3RNb2RpZmllZCgpOwotCQkJCX0KLQkJCQkKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRvU2l6ZTsgaisrKSB7Ci0JCQkJCWlmIChuYW1lLmVxdWFscyh0b0ZpbGVOYW1lc1tqXSkgJiYgbW9kID09IHRvRmlsZU1vZFtqXSkgewotCQkJCQkJY29weSA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGNvcHkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvcHlGaWxlKG1mLCBwYXRoLmFwcGVuZChuYW1lKSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCXN0YXR1cy5hZGQoY2UuZ2V0U3RhdHVzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW1vbml0b3Iud29ya2VkKGR3KTsKLQkJCX0gZWxzZSB7IC8vaWYgKGN1cnJlbnRJc0RpcikgewotCQkJCUlNb2R1bGVGb2xkZXIgZm9sZGVyID0gKElNb2R1bGVGb2xkZXIpIGN1cnJlbnQ7Ci0JCQkJSU1vZHVsZVJlc291cmNlW10gY2hpbGRyZW4gPSBmb2xkZXIubWVtYmVycygpOwotCi0JCQkJLy8gYnVpbGQgYXJyYXkgb2YgaWdub3JlZCBQYXRocyB0aGF0IGFwcGx5IHRvIHRoaXMgZm9sZGVyCi0JCQkJSVBhdGhbXSBpZ25vcmVDaGlsZHJlbiA9IG51bGw7Ci0JCQkJaWYgKGlnbm9yZSAhPSBudWxsKSB7Ci0JCQkJCUxpc3Q8SVBhdGg+IGlnbm9yZUNoaWxkUGF0aHMgPSBuZXcgQXJyYXlMaXN0PElQYXRoPigpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGlnbm9yZS5sZW5ndGg7IGorKykgewotCQkJCQkJSVBhdGggcHJlc2VydmVQYXRoID0gaWdub3JlW2pdOwotCQkJCQkJaWYgKHByZXNlcnZlUGF0aC5zZWdtZW50KDApLmVxdWFscyhuYW1lKSkgewotCQkJCQkJCWlnbm9yZUNoaWxkUGF0aHMuYWRkKHByZXNlcnZlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoaWdub3JlQ2hpbGRQYXRocy5zaXplKCkgPiAwKQotCQkJCQkJaWdub3JlQ2hpbGRyZW4gPSBpZ25vcmVDaGlsZFBhdGhzLnRvQXJyYXkobmV3IFBhdGhbaWdub3JlQ2hpbGRQYXRocy5zaXplKCldKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmNvcHlpbmdUYXNrLCBuZXcgU3RyaW5nW10ge25hbWUsIG5hbWV9KSk7Ci0JCQkJSVN0YXR1c1tdIHN0YXQgPSBwdWJsaXNoU21hcnQoY2hpbGRyZW4sIHBhdGguYXBwZW5kKG5hbWUpLCBpZ25vcmVDaGlsZHJlbiwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgZHcpKTsKLQkJCQlhZGRBcnJheVRvTGlzdChzdGF0dXMsIHN0YXQpOwotCQkJfQotCQl9Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybiBuZXcgSVN0YXR1c1tdIHsgU3RhdHVzLkNBTkNFTF9TVEFUVVMgfTsKLQkJCi0JCW1vbml0b3Iud29ya2VkKDUwMCAtIGR3ICogdG9TaXplKTsKLQkJbW9uaXRvci5kb25lKCk7Ci0JCQotCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOwotCQlzdGF0dXMudG9BcnJheShzdGF0KTsKLQkJcmV0dXJuIHN0YXQ7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGEgZGVsdGEgcHVibGlzaC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgYSBtb2R1bGUgcmVzb3VyY2UgZGVsdGEKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBwdWJsaXNoIHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c1tdIHB1Ymxpc2hEZWx0YShJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGRlbHRhLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFlfU1RBVFVTOwotCQkKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkKLQkJTGlzdDxJU3RhdHVzPiBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KDIpOwotCQlpbnQgc2l6ZTIgPSBkZWx0YS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykgewotCQkJSVN0YXR1c1tdIHN0YXQgPSBwdWJsaXNoRGVsdGEoZGVsdGFbaV0sIHBhdGgsIG1vbml0b3IpOwotCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJfQotCQkKLQkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKLQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7Ci0JCXJldHVybiBzdGF0OwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhIGRlbHRhIHB1Ymxpc2guCi0JICogCi0JICogQHBhcmFtIGRlbHRhIGEgbW9kdWxlIHJlc291cmNlIGRlbHRhCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gcHVibGlzaCB0bwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXNbXSBwdWJsaXNoRGVsdGEoSU1vZHVsZVJlc291cmNlRGVsdGEgZGVsdGEsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0PElTdGF0dXM+IHN0YXR1cyA9IG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oMik7Ci0JCQotCQlJTW9kdWxlUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRNb2R1bGVSZXNvdXJjZSgpOwotCQlpbnQga2luZDIgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgewotCQkJSU1vZHVsZUZpbGUgZmlsZSA9IChJTW9kdWxlRmlsZSkgcmVzb3VyY2U7Ci0JCQl0cnkgewotCQkJCWlmIChraW5kMiA9PSBJTW9kdWxlUmVzb3VyY2VEZWx0YS5SRU1PVkVEKQotCQkJCQlkZWxldGVGaWxlKHBhdGgsIGZpbGUpOwotCQkJCWVsc2UgewotCQkJCQlJUGF0aCBwYXRoMiA9IHBhdGguYXBwZW5kKGZpbGUuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpLmFwcGVuZChmaWxlLmdldE5hbWUoKSk7Ci0JCQkJCUZpbGUgZiA9IHBhdGgyLnRvRmlsZSgpLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJaWYgKCFmLmV4aXN0cygpKQotCQkJCQkJZi5ta2RpcnMoKTsKLQkJCQkJCi0JCQkJCWNvcHlGaWxlKGZpbGUsIHBhdGgyKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJc3RhdHVzLmFkZChjZS5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOwotCQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7Ci0JCQlyZXR1cm4gc3RhdDsKLQkJfQotCQkKLQkJaWYgKGtpbmQyID09IElNb2R1bGVSZXNvdXJjZURlbHRhLkFEREVEKSB7Ci0JCQlJUGF0aCBwYXRoMiA9IHBhdGguYXBwZW5kKHJlc291cmNlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKS5hcHBlbmQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCUZpbGUgZmlsZSA9IHBhdGgyLnRvRmlsZSgpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpICYmICFmaWxlLm1rZGlycygpKSB7Ci0JCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTWtkaXIsIHBhdGgyKSwgbnVsbCkpOwotCQkJCUlTdGF0dXNbXSBzdGF0ID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07Ci0JCQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7Ci0JCQkJcmV0dXJuIHN0YXQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlNb2R1bGVSZXNvdXJjZURlbHRhW10gY2hpbGREZWx0YXMgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCWludCBzaXplID0gY2hpbGREZWx0YXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVN0YXR1c1tdIHN0YXQgPSBwdWJsaXNoRGVsdGEoY2hpbGREZWx0YXNbaV0sIHBhdGgsIG1vbml0b3IpOwotCQkJYWRkQXJyYXlUb0xpc3Qoc3RhdHVzLCBzdGF0KTsKLQkJfQotCQkKLQkJaWYgKGtpbmQyID09IElNb2R1bGVSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCUlQYXRoIHBhdGgyID0gcGF0aC5hcHBlbmQocmVzb3VyY2UuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpLmFwcGVuZChyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJRmlsZSBmaWxlID0gcGF0aDIudG9GaWxlKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSAmJiAhZmlsZS5kZWxldGUoKSkgewotCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckRlbGV0aW5nLCBwYXRoMiksIG51bGwpKTsKLQkJCX0KLQkJfQotCQkKLQkJSVN0YXR1c1tdIHN0YXQgPSBuZXcgSVN0YXR1c1tzdGF0dXMuc2l6ZSgpXTsKLQkJc3RhdHVzLnRvQXJyYXkoc3RhdCk7Ci0JCXJldHVybiBzdGF0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZGVsZXRlRmlsZShJUGF0aCBwYXRoLCBJTW9kdWxlRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBVQkxJU0hJTkcsICJEZWxldGluZzogIiArIGZpbGUuZ2V0TmFtZSgpICsgIiBmcm9tICIgKyBwYXRoLnRvU3RyaW5nKCkpOwotCQlJUGF0aCBwYXRoMiA9IHBhdGguYXBwZW5kKGZpbGUuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpLmFwcGVuZChmaWxlLmdldE5hbWUoKSk7Ci0JCWlmIChwYXRoMi50b0ZpbGUoKS5leGlzdHMoKSAmJiAhcGF0aDIudG9GaWxlKCkuZGVsZXRlKCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRpbmcsIHBhdGgyKSwgbnVsbCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5RmlsZShJTW9kdWxlRmlsZSBtZiwgSVBhdGggcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5QVUJMSVNISU5HLCAiQ29weWluZzogIiArIG1mLmdldE5hbWUoKSArICIgdG8gIiArIHBhdGgudG9TdHJpbmcoKSk7Ci0JCQotCQlJRmlsZSBmaWxlID0gKElGaWxlKSBtZi5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCWNvcHlGaWxlKGZpbGUuZ2V0Q29udGVudHMoKSwgcGF0aCwgZmlsZS5nZXRMb2NhbFRpbWVTdGFtcCgpLCBtZik7Ci0JCWVsc2UgewotCQkJRmlsZSBmaWxlMiA9IChGaWxlKSBtZi5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JSZWFkaW5nLCBmaWxlMi5nZXRBYnNvbHV0ZVBhdGgoKSksIGUpKTsKLQkJCX0KLQkJCWNvcHlGaWxlKGluLCBwYXRoLCBmaWxlMi5sYXN0TW9kaWZpZWQoKSwgbWYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHVibGlzaCB0aGUgZ2l2ZW4gbW9kdWxlIHJlc291cmNlcyB0byB0aGUgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzIGFuIGFycmF5IG9mIG1vZHVsZSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGggdG8gcHVibGlzaCB0bwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXNbXSBwdWJsaXNoRnVsbChJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFlfU1RBVFVTOwotCQkKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkKLQkJTGlzdDxJU3RhdHVzPiBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KDIpOwotCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJU3RhdHVzW10gc3RhdCA9IGNvcHkocmVzb3VyY2VzW2ldLCBwYXRoLCBtb25pdG9yKTsKLQkJCWFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7Ci0JCX0KLQkJCi0JCUlTdGF0dXNbXSBzdGF0ID0gbmV3IElTdGF0dXNbc3RhdHVzLnNpemUoKV07Ci0JCXN0YXR1cy50b0FycmF5KHN0YXQpOwotCQlyZXR1cm4gc3RhdDsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXNbXSBjb3B5KElNb2R1bGVSZXNvdXJjZSByZXNvdXJjZSwgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQlUcmFjZS50cmFjZShUcmFjZS5QVUJMSVNISU5HLCAiQ29weWluZzogIiArIG5hbWUgKyAiIHRvICIgKyBwYXRoLnRvU3RyaW5nKCkpOwotCQlMaXN0PElTdGF0dXM+IHN0YXR1cyA9IG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oMik7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKLQkJCUlNb2R1bGVGb2xkZXIgZm9sZGVyID0gKElNb2R1bGVGb2xkZXIpIHJlc291cmNlOwotCQkJSVN0YXR1c1tdIHN0YXQgPSBwdWJsaXNoRnVsbChmb2xkZXIubWVtYmVycygpLCBwYXRoLCBtb25pdG9yKTsKLQkJCWFkZEFycmF5VG9MaXN0KHN0YXR1cywgc3RhdCk7Ci0JCX0gZWxzZSB7Ci0JCQlJTW9kdWxlRmlsZSBtZiA9IChJTW9kdWxlRmlsZSkgcmVzb3VyY2U7Ci0JCQlwYXRoID0gcGF0aC5hcHBlbmQobWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpLmFwcGVuZChuYW1lKTsKLQkJCUZpbGUgZiA9IHBhdGgudG9GaWxlKCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKCFmLmV4aXN0cygpKQotCQkJCWYubWtkaXJzKCk7Ci0JCQl0cnkgewotCQkJCWNvcHlGaWxlKG1mLCBwYXRoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlzdGF0dXMuYWRkKGNlLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfQotCQlJU3RhdHVzW10gc3RhdCA9IG5ldyBJU3RhdHVzW3N0YXR1cy5zaXplKCldOwotCQlzdGF0dXMudG9BcnJheShzdGF0KTsKLQkJcmV0dXJuIHN0YXQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB6aXAgZmlsZSBjb250YWluaW5nIHRoZSBnaXZlbiBtb2R1bGUgcmVzb3VyY2VzLiBEZWxldGVzIHRoZSBleGlzdGluZyBmaWxlCi0JICogKGFuZCBkb2Vzbid0IGNyZWF0ZSBhIG5ldyBvbmUpIGlmIHJlc291cmNlcyBpcyBudWxsIG9yIGVtcHR5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgbW9kdWxlIHJlc291cmNlcwotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHdoZXJlIHRoZSB6aXAgZmlsZSBzaG91bGQgYmUgY3JlYXRlZCAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzW10gcHVibGlzaFppcChJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBzaG91bGQgYWxzbyBjaGVjayBpZiByZXNvdXJjZXMgY29uc2lzdHMgb2YgYWxsIGVtcHR5IGRpcmVjdG9yaWVzCi0JCQlGaWxlIGZpbGUgPSBwYXRoLnRvRmlsZSgpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJZmlsZS5kZWxldGUoKTsKLQkJCXJldHVybiBFTVBUWV9TVEFUVVM7Ci0JCX0KLQkJCi0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCi0JCUZpbGUgdGVtcEZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gcGF0aC50b0ZpbGUoKTsKLQkJCXRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShURU1QRklMRV9QUkVGSVgsICIuIiArIHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpLCB0ZW1wRGlyKTsKLQkJCQotCQkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSkpOwotCQkJWmlwT3V0cHV0U3RyZWFtIHpvdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKGJvdXQpOwotCQkJYWRkWmlwRW50cmllcyh6b3V0LCByZXNvdXJjZXMpOwotCQkJem91dC5jbG9zZSgpOwotCQkJCi0JCQltb3ZlVGVtcEZpbGUodGVtcEZpbGUsIGZpbGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgSVN0YXR1c1tdIHsgZS5nZXRTdGF0dXMoKSB9OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgemlwcGluZyIsIGUpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXNbXSB7IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDcmVhdGluZ1ppcEZpbGUsIHBhdGgubGFzdFNlZ21lbnQoKSwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBlKSB9OwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRlbXBGaWxlICE9IG51bGwgJiYgdGVtcEZpbGUuZXhpc3RzKCkpCi0JCQkJdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFppcEVudHJpZXMoWmlwT3V0cHV0U3RyZWFtIHpvdXQsIElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWludCBzaXplID0gcmVzb3VyY2VzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChyZXNvdXJjZXNbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7Ci0JCQkJSU1vZHVsZUZvbGRlciBtZiA9IChJTW9kdWxlRm9sZGVyKSByZXNvdXJjZXNbaV07Ci0JCQkJSU1vZHVsZVJlc291cmNlW10gcmVzID0gbWYubWVtYmVycygpOwotCQkJCQotCQkJCUlQYXRoIHBhdGggPSBtZi5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5hcHBlbmQobWYuZ2V0TmFtZSgpKTsKLQkJCQlTdHJpbmcgZW50cnlQYXRoID0gcGF0aC50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCQkJaWYgKCFlbnRyeVBhdGguZW5kc1dpdGgoIi8iKSkKLQkJCQkJZW50cnlQYXRoICs9ICcvJzsKLQkJCQkKLQkJCQlaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeShlbnRyeVBhdGgpOwotCQkJCQotCQkJCWxvbmcgdHMgPSAwOwotCQkJCUlDb250YWluZXIgZm9sZGVyID0gKElDb250YWluZXIpIG1mLmdldEFkYXB0ZXIoSUNvbnRhaW5lci5jbGFzcyk7Ci0JCQkJaWYgKGZvbGRlciAhPSBudWxsKQotCQkJCQl0cyA9IGZvbGRlci5nZXRMb2NhbFRpbWVTdGFtcCgpOwotCQkJCQotCQkJCWlmICh0cyAhPSBJUmVzb3VyY2UuTlVMTF9TVEFNUCAmJiB0cyAhPSAwKQotCQkJCQl6ZS5zZXRUaW1lKHRzKTsKLQkJCQkKLQkJCQl6b3V0LnB1dE5leHRFbnRyeSh6ZSk7Ci0JCQkJem91dC5jbG9zZUVudHJ5KCk7Ci0JCQkJCi0JCQkJYWRkWmlwRW50cmllcyh6b3V0LCByZXMpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlJTW9kdWxlRmlsZSBtZiA9IChJTW9kdWxlRmlsZSkgcmVzb3VyY2VzW2ldOwotCQkJSVBhdGggcGF0aCA9IG1mLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLmFwcGVuZChtZi5nZXROYW1lKCkpOwotCQkJCi0JCQlaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeShwYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQkKLQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCWxvbmcgdHMgPSAwOwotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgbWYuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJdHMgPSBmaWxlLmdldExvY2FsVGltZVN0YW1wKCk7Ci0JCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGUgZmlsZTIgPSAoRmlsZSkgbWYuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKLQkJCQl0cyA9IGZpbGUyLmxhc3RNb2RpZmllZCgpOwotCQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlMik7Ci0JCQl9Ci0JCQkKLQkJCWlmICh0cyAhPSBJUmVzb3VyY2UuTlVMTF9TVEFNUCAmJiB0cyAhPSAwKQotCQkJCXplLnNldFRpbWUodHMpOwotCQkJCi0JCQl6b3V0LnB1dE5leHRFbnRyeSh6ZSk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJaW50IG4gPSAwOwotCQkJCXdoaWxlIChuID4gLTEpIHsKLQkJCQkJbiA9IGluLnJlYWQoYnVmKTsKLQkJCQkJaWYgKG4gPiAwKQotCQkJCQkJem91dC53cml0ZShidWYsIDAsIG4pOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0KLQkJCQotCQkJem91dC5jbG9zZUVudHJ5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBtb3ZlIGEgdGVtcCBmaWxlIGludG8gcG9zaXRpb24gYnkgZGVsZXRpbmcgdGhlIG9yaWdpbmFsIGFuZAotCSAqIHN3YXBwaW5nIGluIGEgbmV3IGNvcHkuCi0JICogIAotCSAqIEBwYXJhbSB0ZW1wRmlsZQotCSAqIEBwYXJhbSBmaWxlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vdmVUZW1wRmlsZShGaWxlIHRlbXBGaWxlLCBGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCWlmICghc2FmZURlbGV0ZShmaWxlLCAyKSkgewotCQkJCS8vIGF0dGVtcHQgdG8gcmV3cml0ZSBhbiBleGlzdGluZyBmaWxlIHdpdGggdGhlIHRlbXBGaWxlIGNvbnRlbnRzIGlmCi0JCQkJLy8gdGhlIGV4aXN0aW5nIGZpbGUgY2FuJ3QgYmUgZGVsZXRlZCB0byBwZXJtaXQgdGhlIG1vdmUKLQkJCQl0cnkgewotCQkJCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGVtcEZpbGUpOwotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNvcHlGaWxlKGluLCBmaWxlLmdldFBhdGgoKSk7Ci0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJTXVsdGlTdGF0dXMgc3RhdHVzMiA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckRlbGV0aW5nLCBmaWxlLnRvU3RyaW5nKCkpLCBudWxsKTsKLQkJCQkJCXN0YXR1czIuYWRkKHN0YXR1cyk7Ci0JCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMyKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gc2hvdWxkbid0IG9jY3VyCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdGVtcEZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCQkJCS8qaWYgKCFzYWZlRGVsZXRlKGZpbGUsIDgpKSB7Ci0JCQkJCXRlbXBGaWxlLmRlbGV0ZSgpOwotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRpbmcsIGZpbGUudG9TdHJpbmcoKSksIG51bGwpKTsKLQkJCQl9Ki8KLQkJCX0KLQkJfQotCQlpZiAoIXNhZmVSZW5hbWUodGVtcEZpbGUsIGZpbGUsIDEwKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JSZW5hbWUsIHRlbXBGaWxlLnRvU3RyaW5nKCkpLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQ29weSBhIGZpbGUgZnJvbSBhIHRvIGIuIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtIGFmdGVyIHVzZS4KLQkgKgotCSAqIEBwYXJhbSBpbiBhbiBJbnB1dFN0cmVhbQotCSAqIEBwYXJhbSB0byB0aGUgZmlsZSB0byBjb3B5IHRvCi0JICogQHJldHVybiBhIHN0YXR1cwotCSAqLwotCXByaXZhdGUgSVN0YXR1cyBjb3B5RmlsZShJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIHRvKSB7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQkKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRvKTsKLQkJCQotCQkJaW50IGF2YWlsID0gaW4ucmVhZChidWYpOwotCQkJd2hpbGUgKGF2YWlsID4gMCkgewotCQkJCW91dC53cml0ZShidWYsIDAsIGF2YWlsKTsKLQkJCQlhdmFpbCA9IGluLnJlYWQoYnVmKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY29weWluZyBmaWxlIiwgZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvcHlpbmdGaWxlLCBuZXcgU3RyaW5nW10ge3RvLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2FmZSBkZWxldGUuIFRyaWVzIHRvIGRlbGV0ZSBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgZ2l2aW5nIHVwLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBzdWNjZWVkcywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2FmZURlbGV0ZShGaWxlIGYsIGludCByZXRyeXMpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJd2hpbGUgKGNvdW50IDwgcmV0cnlzKSB7Ci0JCQlpZiAoIWYuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJCWYuZGVsZXRlKCk7Ci0JCQkKLQkJCWlmICghZi5leGlzdHMoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJY291bnQrKzsKLQkJCS8vIGRlbGF5IGlmIHdlIGFyZSBnb2luZyB0byB0cnkgYWdhaW4KLQkJCWlmIChjb3VudCA8IHJldHJ5cykgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2FmZSByZW5hbWUuIFdpbGwgdHJ5IG11bHRpcGxlIHRpbWVzIGJlZm9yZSBnaXZpbmcgdXAuCi0JICogCi0JICogQHBhcmFtIGZyb20KLQkgKiBAcGFyYW0gdG8KLQkgKiBAcGFyYW0gcmV0cnlzIG51bWJlciBvZiB0aW1lcyB0byByZXRyeQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgc3VjY2VlZHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhZmVSZW5hbWUoRmlsZSBmcm9tLCBGaWxlIHRvLCBpbnQgcmV0cnlzKSB7Ci0JCS8vIG1ha2Ugc3VyZSBwYXJlbnQgZGlyIGV4aXN0cwotCQlGaWxlIGRpciA9IHRvLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKGRpciAhPSBudWxsICYmICFkaXIuZXhpc3RzKCkpCi0JCQlkaXIubWtkaXJzKCk7Ci0JCQotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoY291bnQgPCByZXRyeXMpIHsKLQkJCWlmIChmcm9tLnJlbmFtZVRvKHRvKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJY291bnQrKzsKLQkJCS8vIGRlbGF5IGlmIHdlIGFyZSBnb2luZyB0byB0cnkgYWdhaW4KLQkJCWlmIChjb3VudCA8IHJldHJ5cykgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRBcnJheVRvTGlzdChMaXN0PElTdGF0dXM+IGxpc3QsIElTdGF0dXNbXSBhKSB7Ci0JCWlmIChsaXN0ID09IG51bGwgfHwgYSA9PSBudWxsIHx8IGEubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgc2l6ZSA9IGEubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCWxpc3QuYWRkKGFbaV0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1B1Ymxpc2hVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1B1Ymxpc2hVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZTAyNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9QdWJsaXNoVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2VEZWx0YTsKLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIGFuIGFzc29ydG1lbnQgb2YgdXNlZnVsIGZpbGUgbWV0aG9kcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBzdGF0aWMgbWVtYmVycy4KLSAqIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9yIGluc3RhbnRpYXRlZC4KLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFB1Ymxpc2hVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBQdWJsaXNoSGVscGVyIHB1Ymxpc2hIZWxwZXIgPSBuZXcgUHVibGlzaEhlbHBlcihudWxsKTsKLQotCS8qKgotCSAqIFB1Ymxpc2hVdGlsIGNhbm5vdCBiZSBjcmVhdGVkLiBVc2Ugc3RhdGljIG1ldGhvZHMuCi0JICovCi0JcHJpdmF0ZSBQdWJsaXNoVXRpbCgpIHsKLQkJLy8gY2FuJ3QgY3JlYXRlCi0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gcmVjdXJzaXZlbHkgZGVsZXRlIGEgZGlyZWN0b3J5LgotCSAqCi0JICogQHBhcmFtIGRpciBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzW10gZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIFB1Ymxpc2hIZWxwZXIuZGVsZXRlRGlyZWN0b3J5KGRpciwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogU21hcnQgY29weSB0aGUgZ2l2ZW4gbW9kdWxlIHJlc291cmNlcyB0byB0aGUgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzIGFuIGFycmF5IG9mIG1vZHVsZSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gcGF0aCBhbiBleHRlcm5hbCBwYXRoIHRvIGNvcHkgdG8KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cyAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoU21hcnQoSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIHB1Ymxpc2hIZWxwZXIucHVibGlzaFNtYXJ0KHJlc291cmNlcywgcGF0aCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogU21hcnQgY29weSB0aGUgZ2l2ZW4gbW9kdWxlIHJlc291cmNlcyB0byB0aGUgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzIGFuIGFycmF5IG9mIG1vZHVsZSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gcGF0aCBhbiBleHRlcm5hbCBwYXRoIHRvIGNvcHkgdG8KLQkgKiBAcGFyYW0gaWdub3JlIGFuIGFycmF5IG9mIHBhdGhzIHJlbGF0aXZlIHRvIHBhdGggdG8gaWdub3JlLCBpLmUuIG5vdCBkZWxldGUgb3IgY29weSBvdmVyCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMgCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzW10gcHVibGlzaFNtYXJ0KElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVBhdGhbXSBpZ25vcmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gcHVibGlzaEhlbHBlci5wdWJsaXNoU21hcnQocmVzb3VyY2VzLCBwYXRoLCBpZ25vcmUsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhIGRlbHRhIHB1Ymxpc2guCi0JICogCi0JICogQHBhcmFtIGRlbHRhIGEgbW9kdWxlIHJlc291cmNlIGRlbHRhCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gcHVibGlzaCB0bwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzW10gcHVibGlzaERlbHRhKElNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gcHVibGlzaEhlbHBlci5wdWJsaXNoRGVsdGEoZGVsdGEsIHBhdGgsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhIGRlbHRhIHB1Ymxpc2guCi0JICogCi0JICogQHBhcmFtIGRlbHRhIGEgbW9kdWxlIHJlc291cmNlIGRlbHRhCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gcHVibGlzaCB0bwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzW10gcHVibGlzaERlbHRhKElNb2R1bGVSZXNvdXJjZURlbHRhIGRlbHRhLCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIHB1Ymxpc2hIZWxwZXIucHVibGlzaERlbHRhKGRlbHRhLCBwYXRoLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoIHRoZSBnaXZlbiBtb2R1bGUgcmVzb3VyY2VzIHRvIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgbW9kdWxlIHJlc291cmNlcwotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aCB0byBwdWJsaXNoIHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoRnVsbChJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gcHVibGlzaEhlbHBlci5wdWJsaXNoRnVsbChyZXNvdXJjZXMsIHBhdGgsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgemlwIGZpbGUgY29udGFpbmluZyB0aGUgZ2l2ZW4gbW9kdWxlIHJlc291cmNlcy4gRGVsZXRlcyB0aGUgZXhpc3RpbmcgZmlsZQotCSAqIChhbmQgZG9lc24ndCBjcmVhdGUgYSBuZXcgb25lKSBpZiByZXNvdXJjZXMgaXMgbnVsbCBvciBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzIGFuIGFycmF5IG9mIG1vZHVsZSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB3aGVyZSB0aGUgemlwIGZpbGUgc2hvdWxkIGJlIGNyZWF0ZWQgCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXNbXSBwdWJsaXNoWmlwKElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBwdWJsaXNoSGVscGVyLnB1Ymxpc2haaXAocmVzb3VyY2VzLCBwYXRoLCBtb25pdG9yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9SdW50aW1lTGlmZWN5Y2xlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9SdW50aW1lTGlmZWN5Y2xlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZjZjhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUnVudGltZUxpZmVjeWNsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIGludGVyZmFjZQotICogd2l0aCBlbXB0eSBtZXRob2RzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lTGlmZWN5Y2xlQWRhcHRlciBpbXBsZW1lbnRzIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgewotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciNydW50aW1lQWRkZWQoSVJ1bnRpbWUpCi0JICovCi0JcHVibGljIHZvaWQgcnVudGltZUFkZGVkKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciNydW50aW1lQ2hhbmdlZChJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW50aW1lQ2hhbmdlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIjcnVudGltZVJlbW92ZWQoSVJ1bnRpbWUpCi0JICovCi0JcHVibGljIHZvaWQgcnVudGltZVJlbW92ZWQoSVJ1bnRpbWUgcnVudGltZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvU2VydmVyTGlmZWN5Y2xlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9TZXJ2ZXJMaWZlY3ljbGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTI3OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9TZXJ2ZXJMaWZlY3ljbGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcjsKLS8qKgotICogSGVscGVyIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciBpbnRlcmZhY2UKLSAqIHdpdGggZW1wdHkgbWV0aG9kcy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJMaWZlY3ljbGVBZGFwdGVyIGltcGxlbWVudHMgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIHsKLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciNzZXJ2ZXJBZGRlZChJU2VydmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlcnZlckFkZGVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciNzZXJ2ZXJDaGFuZ2VkKElTZXJ2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIHNlcnZlcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIjc2VydmVyUmVtb3ZlZChJU2VydmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlcnZlclJlbW92ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1NvY2tldFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvU29ja2V0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzY4MGRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvU29ja2V0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIEEgdXRpbGl0eSBjbGFzcyBmb3Igc29ja2V0LXJlbGF0ZWQgZnVuY3Rpb24uIEl0J3MgbWFpbiBwdXJwb3NlcyBhcmUgdG8gZmluZAotICogdW51c2VkIHBvcnRzLCBjaGVjayB3aGV0aGVyIGEgcG9ydCBpcyBpbiB1c2UsIGFuZCBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4KLSAqIGFkZHJlc3MgaXMgYSBsb2NhbChob3N0KSBhZGRyZXNzLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTb2NrZXRVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKLQotCXByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IGxvY2FsSG9zdENhY2hlOwotCXByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IG5vdExvY2FsSG9zdENhY2hlID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIENhY2hlVGhyZWFkPiB0aHJlYWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENhY2hlVGhyZWFkPigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU2V0PEluZXRBZGRyZXNzPiBhZGRyZXNzQ2FjaGU7Ci0KLQlzdGF0aWMgY2xhc3MgQ2FjaGVUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCQlwcml2YXRlIFNldDxJbmV0QWRkcmVzcz4gY3VycmVudEFkZHJlc3NlczsKLQkJcHJpdmF0ZSBTZXQ8U3RyaW5nPiBhZGRyZXNzTGlzdDsKLQkJcHJpdmF0ZSBTdHJpbmcgaG9zdDsKLQkJcHJpdmF0ZSBTZXQ8U3RyaW5nPiBub25BZGRyZXNzTGlzdDsKLQkJcHJpdmF0ZSBNYXAgdGhyZWFkTWFwMjsKLQotCQlwdWJsaWMgQ2FjaGVUaHJlYWQoU3RyaW5nIGhvc3QsIFNldDxJbmV0QWRkcmVzcz4gY3VycmVudEFkZHJlc3NlcywgU2V0PFN0cmluZz4gYWRkcmVzc0xpc3QsIFNldDxTdHJpbmc+IG5vbkFkZHJlc3NMaXN0LCBNYXAgdGhyZWFkTWFwMikgewotCQkJc3VwZXIoIkNhY2hpbmcgbG9jYWxob3N0IGluZm9ybWF0aW9uIik7Ci0JCQl0aGlzLmhvc3QgPSBob3N0OwotCQkJdGhpcy5jdXJyZW50QWRkcmVzc2VzID0gY3VycmVudEFkZHJlc3NlczsKLQkJCXRoaXMuYWRkcmVzc0xpc3QgPSBhZGRyZXNzTGlzdDsKLQkJCXRoaXMubm9uQWRkcmVzc0xpc3QgPSBub25BZGRyZXNzTGlzdDsKLQkJCXRoaXMudGhyZWFkTWFwMiA9IHRocmVhZE1hcDI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoY3VycmVudEFkZHJlc3NlcyAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcjIgPSBjdXJyZW50QWRkcmVzc2VzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIyLmhhc05leHQoKSkgewotCQkJCQlJbmV0QWRkcmVzcyBhZGRyID0gKEluZXRBZGRyZXNzKSBpdGVyMi5uZXh0KCk7Ci0JCQkJCVN0cmluZyBob3N0bmFtZSA9IGFkZHIuZ2V0SG9zdE5hbWUoKTsKLQkJCQkJU3RyaW5nIGhvc3RuYW1lMiA9IGFkZHIuZ2V0Q2Fub25pY2FsSG9zdE5hbWUoKTsKLQkJCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJCQlpZiAoaG9zdG5hbWUgIT0gbnVsbCAmJiAhYWRkcmVzc0xpc3QuY29udGFpbnMoaG9zdG5hbWUpKQotCQkJCQkJCWFkZHJlc3NMaXN0LmFkZChob3N0bmFtZSk7Ci0JCQkJCQlpZiAoaG9zdG5hbWUyICE9IG51bGwgJiYgIWFkZHJlc3NMaXN0LmNvbnRhaW5zKGhvc3RuYW1lMikpCi0JCQkJCQkJYWRkcmVzc0xpc3QuYWRkKGhvc3RuYW1lMik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJSW5ldEFkZHJlc3NbXSBhZGRycyA9IEluZXRBZGRyZXNzLmdldEFsbEJ5TmFtZShob3N0KTsKLQkJCQlpbnQgbGVuZ3RoID0gYWRkcnMubGVuZ3RoOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKLQkJCQkJSW5ldEFkZHJlc3MgYWRkciA9IGFkZHJzWzBdOwotCQkJCQlTdHJpbmcgaG9zdG5hbWUgPSBhZGRyLmdldEhvc3ROYW1lKCk7Ci0JCQkJCVN0cmluZyBob3N0bmFtZTIgPSBhZGRyLmdldENhbm9uaWNhbEhvc3ROYW1lKCk7Ci0JCQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCQkJaWYgKGFkZHIuaXNMb29wYmFja0FkZHJlc3MoKSkgewotCQkJCQkJCWlmIChob3N0bmFtZSAhPSBudWxsICYmICFhZGRyZXNzTGlzdC5jb250YWlucyhob3N0bmFtZSkpCi0JCQkJCQkJCWFkZHJlc3NMaXN0LmFkZChob3N0bmFtZSk7Ci0JCQkJCQkJaWYgKGhvc3RuYW1lMiAhPSBudWxsICYmICFhZGRyZXNzTGlzdC5jb250YWlucyhob3N0bmFtZTIpKQotCQkJCQkJCQlhZGRyZXNzTGlzdC5hZGQoaG9zdG5hbWUyKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKGhvc3RuYW1lICE9IG51bGwgJiYgIW5vbkFkZHJlc3NMaXN0LmNvbnRhaW5zKGhvc3RuYW1lKSkKLQkJCQkJCQkJbm9uQWRkcmVzc0xpc3QuYWRkKGhvc3RuYW1lKTsKLQkJCQkJCQlpZiAoaG9zdG5hbWUyICE9IG51bGwgJiYgIW5vbkFkZHJlc3NMaXN0LmNvbnRhaW5zKGhvc3RuYW1lMikpCi0JCQkJCQkJCW5vbkFkZHJlc3NMaXN0LmFkZChob3N0bmFtZTIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotCQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCQlpZiAoaG9zdCAhPSBudWxsICYmICFub25BZGRyZXNzTGlzdC5jb250YWlucyhob3N0KSkKLQkJCQkJCW5vbkFkZHJlc3NMaXN0LmFkZChob3N0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQl0aHJlYWRNYXAyLnJlbW92ZShob3N0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXRpYyB1dGlsaXR5IGNsYXNzIC0gY2Fubm90IGNyZWF0ZSBhbiBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFNvY2tldFV0aWwoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhbiB1bnVzZWQgcG9ydCBiZXR3ZWVuIHRoZSBnaXZlbiBmcm9tIGFuZCB0byB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIGxvdyBsb3dlc3QgcG9zc2libGUgcG9ydCBudW1iZXIKLQkgKiBAcGFyYW0gaGlnaCBoaWdoZXN0IHBvc3NpYmxlIHBvcnQgbnVtYmVyCi0JICogQHJldHVybiBhbiB1bnVzZWQgcG9ydCBudW1iZXIsIG9yIDxjb2RlPi0xPC9jb2RlPiBpZiBubyB1c2VkIHBvcnRzIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZmluZFVudXNlZFBvcnQoaW50IGxvdywgaW50IGhpZ2gpIHsKLQkJaWYgKGhpZ2ggPCBsb3cpCi0JCQlyZXR1cm4gLTE7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCWludCBwb3J0ID0gZ2V0UmFuZG9tUG9ydChsb3csIGhpZ2gpOwotCQkJaWYgKCFpc1BvcnRJblVzZShwb3J0KSkKLQkJCQlyZXR1cm4gcG9ydDsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgcmFuZG9tIHBvcnQgbnVtYmVyIGluIHRoZSBnaXZlbiByYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gbG93IGxvd2VzdCBwb3NzaWJsZSBwb3J0IG51bWJlcgotCSAqIEBwYXJhbSBoaWdoIGhpZ2hlc3QgcG9zc2libGUgcG9ydCBudW1iZXIKLQkgKiBAcmV0dXJuIGEgcmFuZG9tIHBvcnQgbnVtYmVyIGluIHRoZSBnaXZlbiByYW5nZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRSYW5kb21Qb3J0KGludCBsb3csIGludCBoaWdoKSB7Ci0JCXJldHVybiByYW5kLm5leHRJbnQoaGlnaCAtIGxvdykgKyBsb3c7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gcG9ydCBudW1iZXIgaXMgYmVpbmcgdXNlZC4gCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcG9ydCBpcyBpbiB1c2UsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UuIFJldHJpZXMgZXZlcnkgNTAwbXMgZm9yICJjb3VudCIgdHJpZXMuCi0JICoKLQkgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCBudW1iZXIgdG8gY2hlY2sKLQkgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0byByZXRyeQotCSAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcG9ydCBpcyBpbiB1c2UsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQb3J0SW5Vc2UoaW50IHBvcnQsIGludCBjb3VudCkgewotCQlib29sZWFuIGluVXNlID0gaXNQb3J0SW5Vc2UocG9ydCk7Ci0JCXdoaWxlIChpblVzZSAmJiBjb3VudCA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJaW5Vc2UgPSBpc1BvcnRJblVzZShwb3J0KTsKLQkJCWNvdW50IC0tOwotCQl9Ci0JCi0JCXJldHVybiBpblVzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBwb3J0IG51bWJlciBpcyBiZWluZyB1c2VkLgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBvcnQgaXMgaW4gdXNlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlLgotCSAqCi0JICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwb3J0IGlzIGluIHVzZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BvcnRJblVzZShpbnQgcG9ydCkgewotCQlTZXJ2ZXJTb2NrZXQgcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzID0gbmV3IFNlcnZlclNvY2tldChwb3J0KTsKLQkJfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBob3N0IChuYW1lLCBmdWxseSBxdWFsaWZpZWQgbmFtZSwgb3IgSVAgYWRkcmVzcykgaXMKLQkgKiByZWZlcnJpbmcgdG8gdGhlIGxvY2FsIG1hY2hpbmUuCi0JICogPHA+Ci0JICogVGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkIChvciB0aGUgZmlyc3QgY2FsbCBhZnRlciBlYWNoIHRpbWUKLQkgKiB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkLCBlLmcuIGJ5IHRoZSB1c2VyIHN3aXRjaGluZyBmcm9tIGEKLQkgKiB3aXJlZCBjb25uZWN0aW9uIHRvIHdpcmVsZXNzKSBhIGJhY2tncm91bmQgcHJvY2VzcyBpcyB1c2VkIHRvIGNhY2hlIHRoZQotCSAqIG5ldHdvcmsgaW5mb3JtYXRpb24uIE9uIG1vc3QgbWFjaGluZXMgdGhlIG5ldHdvcmsgaW5mb3JtYXRpb24gd2lsbCBiZSBmb3VuZAotCSAqIHF1aWNrbHkgYW5kIHRoZSByZXN1bHRzIG9mIHRoaXMgY2FsbCB3aWxsIGJlIHJldHVybmVkIGltbWVkaWF0ZWx5LgotCSAqIDwvcD48cD4KLQkgKiBPbiBtYWNoaW5lcyB3aGVyZSB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uIG9mIHRoZSBtYWNoaW5lIGlzIGJhZCBvciB0aGUKLQkgKiBuZXR3b3JrIGhhcyBwcm9ibGVtcywgdGhpcyBmaXJzdCBtZXRob2QgY2FsbCB3aWxsIHRha2UgYXQgbW9zdCAyNTBtcywgYnV0Ci0JICogdGhlIHJlc3VsdHMgbWF5IGJlIGluY29ycmVjdCAoaW5jb21wbGV0ZSkuCi0JICogPC9wPjxwPgotCSAqIEFsbCBzdWJzZXF1ZW50IGNhbGxzICh1bnRpbCB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uIGNoYW5nZXMpIHdpbGwKLQkgKiByZXR1cm4gdmVyeSBxdWlja2x5LiBJZiB0aGUgYmFja2dyb3VuZCBwcm9jZXNzIGlzIHN0aWxsIHJ1bm5pbmcgaXQgd2lsbAotCSAqIGNvbnRpbnVlIHRvIGZpbGwgdGhlIGNhY2hlIGFuZCBlYWNoIHN1YnNlcXVlbnQgY2FsbCB0byB0aGlzIG1ldGhvZCBtYXkgYmUKLQkgKiBtb3JlIGNvcnJlY3QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBob3N0IGEgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGhvc3QgaXMgbG9jYWxob3N0LCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG9jYWxob3N0KGZpbmFsIFN0cmluZyBob3N0KSB7Ci0JCWlmIChob3N0ID09IG51bGwgfHwgaG9zdC5lcXVhbHMoIiIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKCJsb2NhbGhvc3QiLmVxdWFscyhob3N0KSB8fCAiMTI3LjAuMC4xIi5lcXVhbHMoaG9zdCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCS8vIGNoZWNrIHNpbXBsZSBjYXNlcwotCQl0cnkgewotCQkJSW5ldEFkZHJlc3MgbG9jYWxIb3N0YWRkciA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOwotCQkJaWYgKGxvY2FsSG9zdGFkZHIuZ2V0SG9zdE5hbWUoKS5lcXVhbHMoaG9zdCkKLQkJCQkJfHwgaG9zdC5lcXVhbHMobG9jYWxIb3N0YWRkci5nZXRDYW5vbmljYWxIb3N0TmFtZSgpKQotCQkJCQl8fCBsb2NhbEhvc3RhZGRyLmdldEhvc3RBZGRyZXNzKCkuZXF1YWxzKGhvc3QpKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkxvY2FsaG9zdCBjYWNoaW5nIGZhaWx1cmUiLCBlKTsKLQkJfQotCQkKLQkJLy8gY2hlY2sgZm9yIGN1cnJlbnQgdGhyZWFkIGFuZCB3YWl0IGlmIG5lY2Vzc2FyeQotCQlib29sZWFuIGN1cnJlbnRUaHJlYWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVRocmVhZCB0ID0gbnVsbDsKLQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCXQgPSB0aHJlYWRNYXAuZ2V0KGhvc3QpOwotCQkJfQotCQkJaWYgKHQgIT0gbnVsbCAmJiB0LmlzQWxpdmUoKSkgewotCQkJCWN1cnJlbnRUaHJlYWQgPSB0cnVlOwotCQkJCXQuam9pbigzMCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiTG9jYWxob3N0IGNhY2hpbmcgZmFpbHVyZSIsIGUpOwotCQl9Ci0JCQotCQkvLyBjaGVjayBpZiBjYWNoZSBpcyBzdGlsbCBvawotCQlib29sZWFuIHJlZnJlc2hlZENhY2hlID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQgbmV0d29yayBpbnRlcmZhY2VzCi0JCQlmaW5hbCBTZXQ8SW5ldEFkZHJlc3M+IGN1cnJlbnRBZGRyZXNzZXMgPSBuZXcgSGFzaFNldDxJbmV0QWRkcmVzcz4oKTsKLQkJCWN1cnJlbnRBZGRyZXNzZXMuYWRkKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKLQkJCUVudW1lcmF0aW9uIG5pcyA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKTsKLQkJCXdoaWxlIChuaXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlOZXR3b3JrSW50ZXJmYWNlIGludGVyID0gKE5ldHdvcmtJbnRlcmZhY2UpIG5pcy5uZXh0RWxlbWVudCgpOwotCQkJCUVudW1lcmF0aW9uPEluZXRBZGRyZXNzPiBpYXMgPSBpbnRlci5nZXRJbmV0QWRkcmVzc2VzKCk7Ci0JCQkJd2hpbGUgKGlhcy5oYXNNb3JlRWxlbWVudHMoKSkKLQkJCQkJY3VycmVudEFkZHJlc3Nlcy5hZGQoaWFzLm5leHRFbGVtZW50KCkpOwotCQkJfQotCQkJCi0JCQkvLyBjaGVjayBpZiBjYWNoZSBpcyBlbXB0eSBvciBvbGQgYW5kIHJlZmlsbCBpdCBpZiBuZWNlc3NhcnkKLQkJCWlmIChhZGRyZXNzQ2FjaGUgPT0gbnVsbCB8fCAhYWRkcmVzc0NhY2hlLmNvbnRhaW5zQWxsKGN1cnJlbnRBZGRyZXNzZXMpIHx8ICFjdXJyZW50QWRkcmVzc2VzLmNvbnRhaW5zQWxsKGFkZHJlc3NDYWNoZSkpIHsKLQkJCQlDYWNoZVRocmVhZCBjYWNoZVRocmVhZCA9IG51bGw7Ci0JCQkJcmVmcmVzaGVkQ2FjaGUgPSB0cnVlOwotCQkJCQotCQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCQlhZGRyZXNzQ2FjaGUgPSBjdXJyZW50QWRkcmVzc2VzOwotCQkJCQlub3RMb2NhbEhvc3RDYWNoZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQkJbG9jYWxIb3N0Q2FjaGUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KGN1cnJlbnRBZGRyZXNzZXMuc2l6ZSgpICogMyk7Ci0JCQkJCQotCQkJCQlJdGVyYXRvciBpdGVyID0gY3VycmVudEFkZHJlc3Nlcy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCUluZXRBZGRyZXNzIGFkZHIgPSAoSW5ldEFkZHJlc3MpIGl0ZXIubmV4dCgpOwotCQkJCQkJU3RyaW5nIGEgPSBhZGRyLmdldEhvc3RBZGRyZXNzKCk7Ci0JCQkJCQlpZiAoYSAhPSBudWxsICYmICFsb2NhbEhvc3RDYWNoZS5jb250YWlucyhhKSkKLQkJCQkJCQlsb2NhbEhvc3RDYWNoZS5hZGQoYSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWNhY2hlVGhyZWFkID0gbmV3IENhY2hlVGhyZWFkKGhvc3QsIGN1cnJlbnRBZGRyZXNzZXMsIGxvY2FsSG9zdENhY2hlLCBub3RMb2NhbEhvc3RDYWNoZSwgdGhyZWFkTWFwKTsKLQkJCQkJdGhyZWFkTWFwLnB1dChob3N0LCBjYWNoZVRocmVhZCk7Ci0JCQkJCWNhY2hlVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJCQkJY2FjaGVUaHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgLSAxKTsKLQkJCQkJY2FjaGVUaHJlYWQuc3RhcnQoKTsKLQkJCQl9Ci0JCQkJY2FjaGVUaHJlYWQuam9pbigyMDApOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkxvY2FsaG9zdCBjYWNoaW5nIGZhaWx1cmUiLCBlKTsKLQkJfQotCQkKLQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQlpZiAobG9jYWxIb3N0Q2FjaGUuY29udGFpbnMoaG9zdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAobm90TG9jYWxIb3N0Q2FjaGUuY29udGFpbnMoaG9zdCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkvLyBpZiB0aGUgY2FjaGUgaGFzbid0IGJlZW4gY2xlYXJlZCwgbWF5YmUgd2Ugc3RpbGwgbmVlZCB0byBsb29rdXAgdGhlIGhvc3QgIAotCQlpZiAoIXJlZnJlc2hlZENhY2hlICYmICFjdXJyZW50VGhyZWFkKSB7Ci0JCQl0cnkgewotCQkJCUNhY2hlVGhyZWFkIGNhY2hlVGhyZWFkID0gbnVsbDsKLQkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQkJY2FjaGVUaHJlYWQgPSBuZXcgQ2FjaGVUaHJlYWQoaG9zdCwgbnVsbCwgbG9jYWxIb3N0Q2FjaGUsIG5vdExvY2FsSG9zdENhY2hlLCB0aHJlYWRNYXApOwotCQkJCQl0aHJlYWRNYXAucHV0KGhvc3QsIGNhY2hlVGhyZWFkKTsKLQkJCQkJY2FjaGVUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQkJCQljYWNoZVRocmVhZC5zZXRQcmlvcml0eShUaHJlYWQuTk9STV9QUklPUklUWSAtIDEpOwotCQkJCQljYWNoZVRocmVhZC5zdGFydCgpOwotCQkJCX0KLQkJCQljYWNoZVRocmVhZC5qb2luKDc1KTsKLQkJCQkKLQkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQkJaWYgKGxvY2FsSG9zdENhY2hlLmNvbnRhaW5zKGhvc3QpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgbG9jYWxob3N0IiwgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9XZWJSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9XZWJSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGEwN2YyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvV2ViUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZTsKLS8qKgotICogQSBXZWIgbW9kdWxlIHJlc291cmNlLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJSZXNvdXJjZSBleHRlbmRzIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUgewotCXByaXZhdGUgSVBhdGggcGF0aDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyByZWZlcmVuY2UgdG8gYSBXZWIgcmVzb3VyY2UgKEhUTUwsIEdJRiwgZXRjLiBvbiBhIHNlcnZlcikuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBwYXRoIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZQotCSAqLwotCXB1YmxpYyBXZWJSZXNvdXJjZShJTW9kdWxlIG1vZHVsZSwgSVBhdGggcGF0aCkgewotCQlzdXBlcihtb2R1bGUpOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCX0KLQotCXB1YmxpYyBXZWJSZXNvdXJjZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGFydGlmYWN0IHdpdGhpbiB0aGUgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlbGF0aXZlIHBhdGgKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZHVsZUFydGlmYWN0RGVsZWdhdGUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgudG9TdHJpbmcoKS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGdldE1vZHVsZSgpLmdldE5hbWUoKTsKLQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kdWxlQXJ0aWZhY3REZWxlZ2F0ZSNkZXNlcmlhbGl6ZShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZGVzZXJpYWxpemUoU3RyaW5nIHMpIHsKLQkJaW50IGluZCA9IHMuaW5kZXhPZigiLy8iKTsKLQkJc3VwZXIuZGVzZXJpYWxpemUocy5zdWJzdHJpbmcoMCwgaW5kKSk7Ci0JCXBhdGggPSBuZXcgUGF0aChzLnN1YnN0cmluZyhpbmQrMikpOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2R1bGVBcnRpZmFjdERlbGVnYXRlI3NlcmlhbGl6ZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBzZXJpYWxpemUoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIuc2VyaWFsaXplKCkpOwotCQlzYi5hcHBlbmQoIi8vIik7Ci0JCXNiLmFwcGVuZChwYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIldlYlJlc291cmNlIFttb2R1bGU9IiArIGdldE1vZHVsZSgpICsgIiwgcGF0aD0iICsgcGF0aCArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkM2VkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+VXRpbGl0eSBjbGFzc2VzIGZvciB0aGUgc2VydmVyIHRvb2xzIGZyYW1ld29yay48L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5QaW5nVGhyZWFkIGlzIGEgdXRpbGl0eSBjbGFzcyBmb3IgcGluZ2luZyBhIHNlcnZlciB0byBkZXRlcm1pbmUgaWYKLWl0IGlzIHJ1bm5pbmcgYW5kIHVwZGF0aW5nIHRoZSBzZXJ2ZXIncyBzdGF0ZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5Tb2NrZXRVdGlsIGNvbnRhaW5zIHV0aWxpdHkgbWV0aG9kcyBmb3IgZGV0ZXJtaW5pbmcgaWYgcG9ydHMgYXJlCi1mcmVlIGFuZCB3aGV0aGVyIGEgZ2l2ZW4gaG9zdG5hbWUgaXMgYSBsb2NhbCBob3N0bmFtZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgZm91ciBYWFhBZGFwdGVyIGNsYXNzZXMgYXJlIGltcGxlbWVudGF0aW9ucyBvZiBzZXJ2ZXIgdG9vbHMKLWxpc3RlbmVyIGludGVyZmFjZXMgd2l0aCB0aGUgbWV0aG9kIGJvZGllcyBzdHViYmVkIGluOyB0aGV5IGNhbiBiZQotc3ViY2xhc3NlZCBieSBjbGllbnRzIHdobyBvbmx5IHdhbnQgdG8gaW1wbGVtZW50IGEgc2luZ2xlIGxpc3RlbmVyCi1pbnRlcmZhY2UgbWV0aG9kLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPlNlcnZlclBvcnQsIFRhc2ssIGFuZCBUYXNrTW9kZWwgYXJlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBvZgotb3RoZXIgaW50ZXJmYWNlIGNsYXNzZXMuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjI0NDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLTxoZWFkPgotCTwhLS0gIEVzY2FwZSB0byB0aGUgcm9vdCBvZiB5b3VyIHNvdXJjZSBmb2xkZXIgIC0tPgotCTxtZXRhCi0JCW5hbWU9InJvb3QiCi0JCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLQk8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08YWJzdHJhY3Q+VXRpbGl0eSBjbGFzc2VzIGZvciB0aGUgc2VydmVyIHRvb2xzIGZyYW1ld29yay48L2Fic3RyYWN0PgotCi08cD5QaW5nVGhyZWFkIGlzIGEgdXRpbGl0eSBjbGFzcyBmb3IgcGluZ2luZyBhIHNlcnZlciB0byBkZXRlcm1pbmUgaWYKLWl0IGlzIHJ1bm5pbmcgYW5kIHVwZGF0aW5nIHRoZSBzZXJ2ZXIncyBzdGF0ZS48L3A+Ci0KLTxwPlNvY2tldFV0aWwgY29udGFpbnMgdXRpbGl0eSBtZXRob2RzIGZvciBkZXRlcm1pbmluZyBpZiBwb3J0cyBhcmUKLWZyZWUgYW5kIHdoZXRoZXIgYSBnaXZlbiBob3N0bmFtZSBpcyBhIGxvY2FsIGhvc3RuYW1lLjwvcD4KLQotPHA+VGhlIGZvdXIgWFhYQWRhcHRlciBjbGFzc2VzIGFyZSBpbXBsZW1lbnRhdGlvbnMgb2Ygc2VydmVyIHRvb2xzCi1saXN0ZW5lciBpbnRlcmZhY2VzIHdpdGggdGhlIG1ldGhvZCBib2RpZXMgc3R1YmJlZCBpbjsgdGhleSBjYW4gYmUKLXN1YmNsYXNzZWQgYnkgY2xpZW50cyB3aG8gb25seSB3YW50IHRvIGltcGxlbWVudCBhIHNpbmdsZSBsaXN0ZW5lcgotaW50ZXJmYWNlIG1ldGhvZC48L3A+Ci0KLTxwPlNlcnZlclBvcnQsIFRhc2ssIGFuZCBUYXNrTW9kZWwgYXJlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBvZgotb3RoZXIgaW50ZXJmYWNlIGNsYXNzZXMuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTZkNDlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2RkN2RlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0YzE2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZTQzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyMDg1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjYzFkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgRmViIDIzIDIxOjExOjUyIEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE2MGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNTYXQgQXByIDIyIDE4OjM2OjE0IEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjMDM1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5jb21tYW5kO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMjA0LDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5NDlmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFjMWMxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9SFRUUCBTZXJ2ZXIgU3VwcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLXJ1bnRpbWVUeXBlSHR0cExhYmVsPUhUVFAgU2VydmVyCi1ydW50aW1lVHlwZUh0dHBEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgcHJvamVjdHMgb24gYW4gSFRUUCBzZXJ2ZXIuCi0KLWh0dHBTZXJ2ZXJUeXBlPUhUVFAgU2VydmVyCi1odHRwU2VydmVyRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIHByb2plY3RzIG9uIGFuIEhUVFAgc2VydmVyLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmJjYmZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlcyI+Ci0JICAgIDxydW50aW1lVHlwZQotCSAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUiCi0JICAgICAgIG5hbWU9IiVydW50aW1lVHlwZUh0dHBMYWJlbCIKLQkgICAgICAgZGVzY3JpcHRpb249IiVydW50aW1lVHlwZUh0dHBEZXNjcmlwdGlvbiIKLQkgICAgICAgZmFjZXRSdW50aW1lQ29tcG9uZW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAucnVudGltZSIKLQkgICAgICAgZmFjZXRSdW50aW1lVmVyc2lvbj0iMS4wIgotCSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWwuSHR0cFJ1bnRpbWUiPgotCSAgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAgIHR5cGVzPSJQSFAiCi0JICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotCSAgICAgICA8bW9kdWxlVHlwZQotCSAgICAgICAJIHR5cGVzPSJ3c3Qud2ViIgotCSAgICAgICAJIHZlcnNpb25zPSIxLjAiLz4KLQkgICAgPC9ydW50aW1lVHlwZT4KLSAgCTwvZXh0ZW5zaW9uPgotCi0gCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJUeXBlcyI+Ci0gICAgIDxzZXJ2ZXJUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5zZXJ2ZXIiCi0gICAgICAgbmFtZT0iJWh0dHBTZXJ2ZXJUeXBlIgotICAgICAgIGRlc2NyaXB0aW9uPSIlaHR0cFNlcnZlckRlc2NyaXB0aW9uIgotICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9InRydWUiCi0gICAgICAgcnVudGltZT0idHJ1ZSIKLSAgICAgICBpbml0aWFsU3RhdGU9InN0YXJ0ZWQiCi0gICAgICAgaGFzQ29uZmlndXJhdGlvbj0iZmFsc2UiCi0gICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLkh0dHBTZXJ2ZXIiCi0gICAgICAgYmVoYXZpb3VyQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLkh0dHBTZXJ2ZXJCZWhhdmlvdXIiLz4KLSAgCTwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lTG9jYXRvcnMiPgotICAgIDxydW50aW1lTG9jYXRvcgotICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAucnVudGltZS5sb2NhdG9yIgotICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5ydW50aW1lIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwUnVudGltZUxvY2F0b3IiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5ydW50aW1lIi8+Ci0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAucnVudGltZSIKLSAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9IndzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSJbMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmRlZmF1bHRGYWNldHMiPgotICAgIDxkZWZhdWx0LWZhY2V0cz4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUiLz4KLSAgICAgIDxmYWNldCBpZD0id3N0LmpzZHQud2ViIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L2RlZmF1bHQtZmFjZXRzPgotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmxhdW5jaGFibGVBZGFwdGVycyI+Ci0gICAgICA8bGF1bmNoYWJsZUFkYXB0ZXIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC53ZWIiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnNlcnZlciIvPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9IdHRwQ29yZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI3NzY4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9IdHRwQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0vKioKLSAqIFRoZSBIVFRQIHNlcnZlciBjb3JlIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIEh0dHBDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUiOwotCi0JcHJpdmF0ZSBzdGF0aWMgSHR0cENvcmVQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEh0dHBDb3JlUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBIdHRwQ29yZVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluc3RhbGwgbG9jYXRpb24gcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBydW50aW1lIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YWxsIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoaWQpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgaW5zdGFsbCBsb2NhdGlvbiBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgcnVudGltdCB0eXBlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcmVmZXJlbmNlKFN0cmluZyBpZCwgU3RyaW5nIHZhbHVlKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShpZCwgdmFsdWUpOwotCQlnZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL0h0dHBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYjgzZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5MYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLkh0dHBMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLldlYlJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgSHR0cExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgZXh0ZW5kcyBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIHsKLQkvKgotCSAqIEBzZWUgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSNnZXRMYXVuY2hhYmxlKElTZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoc2VydmVyID09IG51bGwgfHwgbW9kdWxlQXJ0aWZhY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSHR0cFNlcnZlciBzZXJ2ZXIyID0gKEh0dHBTZXJ2ZXIpIHNlcnZlci5sb2FkQWRhcHRlcihIdHRwU2VydmVyLmNsYXNzLCBudWxsKTsKLQkJaWYgKHNlcnZlcjIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBzZXJ2ZXIyLmdldE1vZHVsZVJvb3RVUkwobW9kdWxlQXJ0aWZhY3QuZ2V0TW9kdWxlKCkpOwotCQkJCi0JCQlpZiAobW9kdWxlQXJ0aWZhY3QgaW5zdGFuY2VvZiBXZWJSZXNvdXJjZSkgewotCQkJCVdlYlJlc291cmNlIHJlc291cmNlID0gKFdlYlJlc291cmNlKSBtb2R1bGVBcnRpZmFjdDsKLQkJCQlTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCQotCQkJCWlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkKLQkJCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwotCQkJCXVybCA9IG5ldyBVUkwodXJsLnRvRXh0ZXJuYWxGb3JtKCkgKyAiLyIgKyBwYXRoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgSHR0cExhdW5jaGFibGUodXJsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGluIGxhdW5jaGFibGUgYWRhcHRlciIsIGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFJ1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL0h0dHBSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmJiMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSHR0cFJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lRGVsZWdhdGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5ydW50aW1lIjsKLQotCXB1YmxpYyBIdHRwUnVudGltZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUnVudGltZURlbGVnYXRlI3NldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFJ1bnRpbWVXb3JraW5nQ29weSgpLnNldExvY2F0aW9uKG5ldyBQYXRoKCIiKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL0h0dHBSdW50aW1lTG9jYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFJ1bnRpbWVMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjU0NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFJ1bnRpbWVMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZUxvY2F0b3JEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwUnVudGltZUxvY2F0b3IgZXh0ZW5kcyBSdW50aW1lTG9jYXRvckRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHJ1bnRpbWVUeXBlcyA9IG5ldyBTdHJpbmdbXSB7IEh0dHBSdW50aW1lLklEIH07Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JUnVudGltZUZhY3RvcnlEZWxlZ2F0ZSNnZXRLbm93blJ1bnRpbWVzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWFyY2hGb3JSdW50aW1lcyhJUGF0aCBwYXRoLCBJUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNlYXJjaEZvclJ1bnRpbWVzMihwYXRoLCBsaXN0ZW5lciwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNlYXJjaEZvclJ1bnRpbWVzMihJUGF0aCBwYXRoLCBJUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUZpbGVbXSBmaWxlcyA9IG51bGw7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCUZpbGUgZiA9IHBhdGgudG9GaWxlKCk7Ci0JCQlpZiAoZi5leGlzdHMoKSkKLQkJCQlmaWxlcyA9IGYubGlzdEZpbGVzKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuOwotCQl9IGVsc2UKLQkJCWZpbGVzID0gRmlsZS5saXN0Um9vdHMoKTsKLQotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmaWxlcy5sZW5ndGg7Ci0JCQlpbnQgd29yayA9IDEwMCAvIHNpemU7Ci0JCQlpbnQgd29ya0xlZnQgPSAxMDAgLSAod29yayAqIHNpemUpOwotCQkJZm9yIChGaWxlIGZpbGUgOiBmaWxlcykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKQotCQkJCQlzZWFyY2hEaXIobGlzdGVuZXIsIGZpbGUsIDQsIG1vbml0b3IpOwotCQkJCW1vbml0b3Iud29ya2VkKHdvcmspOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQod29ya0xlZnQpOwotCQl9IGVsc2UKLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNlYXJjaERpcihJUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLCBGaWxlIGRpciwgaW50IGRlcHRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKCJodGRvY3MiLmVxdWFscyhkaXIuZ2V0TmFtZSgpKSkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gZ2V0UnVudGltZUZyb21EaXIoZGlyLmdldFBhcmVudEZpbGUoKSwgbW9uaXRvcik7Ci0JCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQkJbGlzdGVuZXIucnVudGltZUZvdW5kKHJ1bnRpbWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCWlmIChkZXB0aCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7Ci0JCQkJcmV0dXJuIGZpbGUuaXNEaXJlY3RvcnkoKTsKLQkJCX0KLQkJfSk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKEZpbGUgZmlsZSA6IGZpbGVzKSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQkJc2VhcmNoRGlyKGxpc3RlbmVyLCBmaWxlLCBkZXB0aCAtIDEsIG1vbml0b3IpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJUnVudGltZVdvcmtpbmdDb3B5IGdldFJ1bnRpbWVGcm9tRGlyKEZpbGUgZGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZm9yIChTdHJpbmcgcnQgOiBydW50aW1lVHlwZXMpIHsKLQkJCXRyeSB7Ci0JCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUocnQpOwotCQkJCVN0cmluZyBhYnNvbHV0ZVBhdGggPSBkaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJU3RyaW5nIGlkID0gYWJzb2x1dGVQYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnXycpLnJlcGxhY2UoJzonLCAnLScpOwotCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUoaWQsIG1vbml0b3IpOwotCQkJCXJ1bnRpbWUuc2V0TmFtZShkaXIuZ2V0TmFtZSgpKTsKLQkJCQlydW50aW1lLnNldExvY2F0aW9uKG5ldyBQYXRoKGFic29sdXRlUGF0aCkuYXBwZW5kKCJodGRvY3MiKSk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBydW50aW1lLnZhbGlkYXRlKG1vbml0b3IpOwotCQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SKQotCQkJCQlyZXR1cm4gcnVudGltZTsKLQkJCQkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkZhbHNlIHJ1bnRpbWUgZm91bmQgYXQgIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKQotCQkJCQkJKyAiOiAiICsgc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBmaW5kIHJ1bnRpbWUiLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFNlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTUxOTgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL0h0dHBTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVVSTFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5JU3RhdGljV2ViOwotLyoqCi0gKiBHZW5lcmljIEhUVFAgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgSHR0cFNlcnZlciBleHRlbmRzIFNlcnZlckRlbGVnYXRlIGltcGxlbWVudHMgSVVSTFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9VUkxfUFJFRklYID0gInVybFByZWZpeCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUE9SVCA9ICJwb3J0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9JU19QVUJMSVNISU5HID0gImlzUHVibGlzaGluZyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuc2VydmVyIjsKLQotCS8qKgotCSAqIEh0dHBTZXJ2ZXIuCi0JICovCi0JcHVibGljIEh0dHBTZXJ2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogQHNlZSBSdW50aW1lRGVsZWdhdGUjc2V0RGVmYXVsdHMoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc2V0UG9ydCg4MCk7Ci0JCXNldFVSTFByZWZpeCgiIik7Ci0JCXNldFB1Ymxpc2hpbmcodHJ1ZSk7Ci0JfQotCi0JcHVibGljIEh0dHBSdW50aW1lIGdldEh0dHBSdW50aW1lKCkgewotCQlpZiAoZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKEh0dHBSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoSHR0cFJ1bnRpbWUuY2xhc3MsIG51bGwpOwotCX0KLQotCS8qcHVibGljIHZvaWQgaW1wb3J0UnVudGltZUNvbmZpZ3VyYXRpb24oSVJ1bnRpbWUgYXJnMCwgSVByb2dyZXNzTW9uaXRvciBhcmcxKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRIdHRwUnVudGltZSgpICE9IG51bGwpIHsKLQkJCWlmICghZ2V0SHR0cFJ1bnRpbWUoKS5wdWJsaXNoVG9EaXJlY3RvcnkoKSkgewotCQkJCXNldEF0dHJpYnV0ZSgiYXV0by1wdWJsaXNoLXNldHRpbmciLCAxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0QXR0cmlidXRlKCJhdXRvLXB1Ymxpc2gtc2V0dGluZyIsIDIpOwotCQkJCXNldEF0dHJpYnV0ZSgiYXV0by1wdWJsaXNoLXRpbWUiLCAxKTsKLQkJCX0KLQkJCS8vc2V0UHVibGlzaERpcmVjdG9yeShnZXRIdHRwUnVudGltZSgpLmdldFB1Ymxpc2hMb2NhdGlvbigpKTsKLQkJfQotCX0qLwotCi0JcHVibGljIGJvb2xlYW4gZG9udFB1Ymxpc2goKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImF1dG8tcHVibGlzaC1zZXR0aW5nIiwgIjIiKS5lcXVhbHMoIjEiKTsKLQl9Ci0KLQkvLyBwdWJsaWMgdm9pZCBzZXREb2N1bWVudFJvb3QoU3RyaW5nIGRvY1Jvb3QpIHsKLQkvLyBzZXRBdHRyaWJ1dGUoSHR0cFNlcnZlci5ET0NVTUVOVF9ST09ULCBkb2NSb290KTsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50Um9vdCgpIHsKLQkvLyByZXR1cm4gZ2V0QXR0cmlidXRlKEh0dHBTZXJ2ZXIuRE9DVU1FTlRfUk9PVCwgIiIpOwotCS8vIH0KLQotCS8vIHB1YmxpYyBib29sZWFuIGNhblB1Ymxpc2goKSB7Ci0JLy8gcmV0dXJuIGdldEF0dHJpYnV0ZShIdHRwU2VydmVyLlBVQkxJU0gsIHRydWUpOwotCS8vIH0KLQotCS8vIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2goYm9vbGVhbiBwdWJsaXNoKSB7Ci0JLy8gc2V0QXR0cmlidXRlKEh0dHBTZXJ2ZXIuUFVCTElTSCwgcHVibGlzaCk7Ci0JLy8gfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIHRoZSBob3N0IHRvIHJldHVybiBJUHY2IGFkZHJlc3NlcyBpbiBzcXVhcmUgYnJhY2tldHMsIGUuZy4KLQkgKiAiWzRmZmU6ZmYyZjoxMDE6MjE6MjMwOjZlZmY6ZmUwNDpkOWZlXSIuIElmIHRoZSBob3N0IGlzIGp1c3QgYSBob3N0IG5hbWUKLQkgKiBvciBJUHY0IGFkZHJlc3MsIHRoZW4gaXQgaXMgcmV0dXJuZWQgYXMgaXMuCi0JICogCi0JICogQHBhcmFtIGhvc3QgdGhlIGhvc3QsIGFuIElQIGFkZHJlc3Mgb3IgaG9zdCBuYW1lCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VVJMSG9zdChTdHJpbmcgaG9zdCkgewotCQkvLyB1c2UgIjoiIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGFuIElQdjYgYWRkcmVzcyAKLQkJcmV0dXJuIChob3N0ICE9IG51bGwgJiYgaG9zdC5pbmRleE9mKCI6IikgPj0gMCkgPyAiWyIgKyBob3N0ICsgIl0iIDogaG9zdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvb3QgVVJMIG9mIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIHRoZSByb290IFVSTAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TW9kdWxlUm9vdFVSTChJTW9kdWxlIG1vZHVsZSkgewotCQl0cnkgewotCQkJU3RyaW5nIGJhc2UgPSAiaHR0cDovLyIgKyBnZXRVUkxIb3N0KGdldFNlcnZlcigpLmdldEhvc3QoKSk7Ci0JCQkKLQkJCWlmIChiYXNlLmVxdWFscygiIikpCi0JCQkJYmFzZSA9ICJodHRwOi8vIiArIGdldFVSTEhvc3QoZ2V0U2VydmVyKCkuZ2V0SG9zdCgpKTsKLQkJCQotCQkJaW50IHBvcnQgPSBnZXRQb3J0KCk7Ci0JCQlVUkwgdXJsID0gbnVsbDsKLQkJCWlmIChwb3J0ID09IDgwKQotCQkJCXVybCA9IG5ldyBVUkwoYmFzZSArICIvIik7Ci0JCQllbHNlCi0JCQkJdXJsID0gbmV3IFVSTChiYXNlICsgIjoiICsgcG9ydCArICIvIik7Ci0JCQkKLQkJCVN0cmluZyBwcmVmaXggPSBnZXRVUkxQcmVmaXgoKTsKLQkJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKQotCQkJCXVybCA9IG5ldyBVUkwodXJsLCBwcmVmaXggKyAiLyIpOwotCQkJCi0JCQlJU3RhdGljV2ViIHN0YXRpY1dlYiA9IChJU3RhdGljV2ViKSBtb2R1bGUubG9hZEFkYXB0ZXIoSVN0YXRpY1dlYi5jbGFzcywgbnVsbCk7Ci0JCQlyZXR1cm4gbmV3IFVSTCh1cmwsIHN0YXRpY1dlYi5nZXRDb250ZXh0Um9vdCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgcm9vdCBVUkwiLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGUocykgb2YgdGhpcyBtb2R1bGUuCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSByb290IG1vZHVsZShzKSBvZiB0aGlzIG1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldFJvb3RNb2R1bGVzKElNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwcm9qZWN0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHNlcnZlciwgYW5kIGZhbHNlCi0JICogb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGQgbW9kdWxlcwotCSAqIEBwYXJhbSByZW1vdmUgbW9kdWxlcwotCSAqIEByZXR1cm4gdGhlIHN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbk1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSkgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBIdHRwQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmNhbk1vZGlmeU1vZHVsZXMsIG51bGwpOwotCX0KLQotCXB1YmxpYyBTZXJ2ZXJQb3J0W10gZ2V0U2VydmVyUG9ydHMoKSB7Ci0JCWludCBwb3J0ID0gZ2V0UG9ydCgpOwotCQlTZXJ2ZXJQb3J0W10gcG9ydHMgPSB7IG5ldyBTZXJ2ZXJQb3J0KCJodHRwIiwgTWVzc2FnZXMuaHR0cFBvcnQsIHBvcnQsICJodHRwIikgfTsKLQkJcmV0dXJuIHBvcnRzOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShIdHRwU2VydmVyLlBST1BFUlRZX1BPUlQsIDgwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7Ci0JCXNldEF0dHJpYnV0ZShIdHRwU2VydmVyLlBST1BFUlRZX1BPUlQsIHBvcnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSTFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JCXNldEF0dHJpYnV0ZShIdHRwU2VydmVyLlBST1BFUlRZX1VSTF9QUkVGSVgsIHByZWZpeCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkxQcmVmaXgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoSHR0cFNlcnZlci5QUk9QRVJUWV9VUkxfUFJFRklYLCAiIik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoaW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX0lTX1BVQkxJU0hJTkcsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoaW5nKGJvb2xlYW4gc2hvdWxkUHVibGlzaCkgewotCQlzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfSVNfUFVCTElTSElORywgc2hvdWxkUHVibGlzaCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGNyZWF0ZUh0dHBTZXJ2ZXIoU3RyaW5nIGhvc3QsIFN0cmluZyBzZXJ2ZXJOYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKEh0dHBSdW50aW1lLklEKTsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZUNvcHkgPSBydW50aW1lVHlwZS5jcmVhdGVSdW50aW1lKEh0dHBSdW50aW1lLklELCBtb25pdG9yKTsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBydW50aW1lQ29weS5zYXZlKHRydWUsIG1vbml0b3IpOwotCQkJCi0JCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShJRCk7Ci0JCQlJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihJRCwgbnVsbCwgcnVudGltZSwgbW9uaXRvcik7Ci0JCQl3b3JraW5nQ29weS5zZXROYW1lKHNlcnZlck5hbWUpOwotCQkJd29ya2luZ0NvcHkuc2V0SG9zdChob3N0KTsKLQkJCQotCQkJcmV0dXJuIHdvcmtpbmdDb3B5LnNhdmUodHJ1ZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjcmVhdGluZyBzZXJ2ZXIiLCBlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGZpbmRIdHRwU2VydmVyKFN0cmluZyBpZCkgewotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlmb3IgKElTZXJ2ZXIgc2VydmVyIDogc2VydmVycykgewotCQkJaWYgKHNlcnZlci5nZXRJZCgpLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIHNlcnZlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKnB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEaXJlY3RvcnkoU3RyaW5nIHB1YkRpcikgewotCQlzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfUFVCX0RJUiwgcHViRGlyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hEaXJlY3RvcnkoKSB7Ci0JCWlmIChnZXRIdHRwUnVudGltZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX1BVQl9ESVIsIGdldEh0dHBSdW50aW1lKCkuZ2V0UHVibGlzaExvY2F0aW9uKCkpOwotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX1BVQl9ESVIsICIiKTsKLQl9Ki8KLQotCS8qCi0JICogcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUJhc2VVUkwoU3RyaW5nIGlkLCBTdHJpbmcgYmFzZVVSTCkgewotCSAqIHVwZGF0ZUJhc2VVUkwoY2hlY2tGb3JIdHRwU2VydmVyKGlkKSwgYmFzZVVSTCk7IH0KLQkgKi8KLQotCS8qCi0JICogcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUJhc2VVUkwoSVNlcnZlciBzZXJ2ZXIsIFN0cmluZyBiYXNlVVJMKSB7IGlmCi0JICogKHNlcnZlciA9PSBudWxsKSByZXR1cm47Ci0JICogCi0JICogSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JICogCi0JICogSHR0cFNlcnZlciBhcyA9IChIdHRwU2VydmVyKSB3b3JraW5nQ29weS5nZXRBZGFwdGVyKEh0dHBTZXJ2ZXIuY2xhc3MpOyBpZgotCSAqIChhcyA9PSBudWxsKSBhcyA9IChIdHRwU2VydmVyKSB3b3JraW5nQ29weS5sb2FkQWRhcHRlcihIdHRwU2VydmVyLmNsYXNzLAotCSAqIG51bGwpOwotCSAqIAotCSAqIFN0cmluZyBjdXJyZW50VVJMID0gYXMuZ2V0QmFzZVVSTCgpOwotCSAqIAotCSAqIGlmIChjdXJyZW50VVJMLmVxdWFscyhiYXNlVVJMKSkgcmV0dXJuOyBhcy5zZXRCYXNlVVJMKGJhc2VVUkwpOyB0cnkgewotCSAqIGFzLnNhdmVDb25maWd1cmF0aW9uKG51bGwpOyB3b3JraW5nQ29weS5zYXZlKHRydWUsIG51bGwpOyB9IGNhdGNoCi0JICogKENvcmVFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9IH0KLQkgKi8KLQotCXB1YmxpYyB2b2lkIG1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJIdHRwU2VydmVyIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFNlcnZlckJlaGF2aW91ci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvSHR0cFNlcnZlckJlaGF2aW91ci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGY3Y2UwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL0h0dHBTZXJ2ZXJCZWhhdmlvdXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5JU3RhdGljV2ViOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlB1Ymxpc2hVdGlsOwotLyoqCi0gKiBHZW5lcmljIEh0dHAgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgSHR0cFNlcnZlckJlaGF2aW91ciBleHRlbmRzIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIHsKLQkvLyB0aGUgdGhyZWFkIHVzZWQgdG8gcGluZyB0aGUgc2VydmVyIHRvIGNoZWNrIGZvciBzdGFydHVwCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBQaW5nVGhyZWFkIHBpbmcgPSBudWxsOwotCi0JLyoqCi0JICogSHR0cFNlcnZlci4KLQkgKi8KLQlwdWJsaWMgSHR0cFNlcnZlckJlaGF2aW91cigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIEh0dHBSdW50aW1lIGdldEh0dHBSdW50aW1lKCkgewotCQlpZiAoZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKEh0dHBSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoSHR0cFJ1bnRpbWUuY2xhc3MsIG51bGwpOwotCX0KLQotCXB1YmxpYyBIdHRwU2VydmVyIGdldEh0dHBTZXJ2ZXIoKSB7Ci0JCXJldHVybiAoSHR0cFNlcnZlcikgZ2V0U2VydmVyKCkuZ2V0QWRhcHRlcihIdHRwU2VydmVyLmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZXJ2ZXJTdGFydGVkKCkgewotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUQVJURUQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hTZXJ2ZXIoaW50IGtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCW1vbml0b3IuZG9uZSgpOwotCi0JCXNldFNlcnZlclB1Ymxpc2hTdGF0ZShJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSk7Ci0JfQotCi0JLyoKLQkgKiBQdWJsaXNoZXMgdGhlIGdpdmVuIG1vZHVsZSB0byB0aGUgc2VydmVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hNb2R1bGUoaW50IGtpbmQsIGludCBkZWx0YUtpbmQsIElNb2R1bGVbXSBtb2R1bGVUcmVlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFnZXRIdHRwU2VydmVyKCkuaXNQdWJsaXNoaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmcgY29udGV4dFJvb3QgPSBudWxsOwotCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZVRyZWVbbW9kdWxlVHJlZS5sZW5ndGggLSAxXTsgCi0JCUlTdGF0aWNXZWIgc3cgPSAoSVN0YXRpY1dlYikgbW9kdWxlLmxvYWRBZGFwdGVyKElTdGF0aWNXZWIuY2xhc3MsIG1vbml0b3IpOwotCQlpZiAoc3cgIT0gbnVsbCkKLQkJCWNvbnRleHRSb290ID0gc3cuZ2V0Q29udGV4dFJvb3QoKTsKLQkJZWxzZQotCQkJY29udGV4dFJvb3QgPSBtb2R1bGUuZ2V0TmFtZSgpOwotCQkKLQkJSVBhdGggdG8gPSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKGNvbnRleHRSb290ICE9IG51bGwgJiYgIWNvbnRleHRSb290LmVxdWFscygiIikpCi0JCQl0byA9IHRvLmFwcGVuZChjb250ZXh0Um9vdCk7Ci0JCQotCQlJTW9kdWxlUmVzb3VyY2VbXSByZXMgPSBnZXRSZXNvdXJjZXMobW9kdWxlVHJlZSk7Ci0JCUlTdGF0dXNbXSBzdGF0dXMgPSBQdWJsaXNoVXRpbC5wdWJsaXNoU21hcnQocmVzLCB0bywgbW9uaXRvcik7Ci0JCXRocm93RXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQotCQlzZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlVHJlZSwgSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHRocm93IGEgQ29yZUV4Y2VwdGlvbiBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgYSBsaXN0IG9mCi0JICogZXJyb3IgYW5kIHdhcm5pbmcgc3RhdHVzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMgYSBMaXN0IGNvbnRhaW5pbmcgZXJyb3IgYW5kIHdhcm5pbmcgSVN0YXR1cwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oSVN0YXR1c1tdIHN0YXR1cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKHN0YXR1cy5sZW5ndGggPT0gMSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1c1swXSk7Ci0JCQotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVycm9yUHVibGlzaDsKLQkJTXVsdGlTdGF0dXMgc3RhdHVzMiA9IG5ldyBNdWx0aVN0YXR1cyhIdHRwQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsIHN0YXR1cywgbWVzc2FnZSwgbnVsbCk7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1czIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVE9QUEVEKTsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVEVEKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhbmx5IHNodXRzIGRvd24gYW5kIHRlcm1pbmF0ZXMgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2UgPGNvZGU+dHJ1ZTwvY29kZT4gdG8ga2lsbCB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlKSB7Ci0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSHR0cFNlcnZlciI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGFlMWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FuTW9kaWZ5TW9kdWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBodHRwUG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Nb2RpZnlQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk1vZGlmeVByZWZpeFVSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Nb2RpZnlQdWJsaXNoaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQb3J0SW5Vc2U7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEh0dHBDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjBiYmU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1hY3Rpb25Nb2RpZnlQb3J0PXNldCBwb3J0IG51bWJlcgotYWN0aW9uTW9kaWZ5UHJlZml4VVJMPXNldCBVUkwgcHJlZml4Ci1hY3Rpb25Nb2RpZnlQdWJsaXNoaW5nPXNldCBwdWJsaXNoaW5nIGVuYWJsZW1lbnQKLWVycm9yUHVibGlzaD1FcnJvciBkdXJpbmcgcHVibGlzaAotCi1odHRwUG9ydD1IVFRQIFBvcnQKLWNhbk1vZGlmeU1vZHVsZXM9V2ViIG1vZHVsZXMgY2FuIGJlIG1vZGlmaWVkLgotCi1lcnJvclBvcnRJblVzZT1Qb3J0IHswfSByZXF1aXJlZCBieSB7MX0gaXMgYWxyZWFkeSBpbiB1c2UuIFRoZSBzZXJ2ZXIgbWF5IGFscmVhZHkgYmUgcnVubmluZyBpbiBhbm90aGVyIHByb2Nlc3MsIG9yIGEgc3lzdGVtIHByb2Nlc3MgbWF5IGJlIHVzaW5nIHRoZSBwb3J0LiBcCi0gIFRvIHN0YXJ0IHRoaXMgc2VydmVyIHlvdSB3aWxsIG5lZWQgdG8gc3RvcCB0aGUgb3RoZXIgcHJvY2VzcyBvciBjaGFuZ2UgdGhlIHBvcnQgbnVtYmVyKHMpLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL1BpbmdUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL1BpbmdUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzNjBjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9QaW5nVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLS8qKgotICogVGhyZWFkIHVzZWQgdG8gcGluZyBzZXJ2ZXIgdG8gdGVzdCB3aGVuIGl0IGlzIHN0YXJ0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQaW5nVGhyZWFkIHsKLQkvLyBkZWxheSBiZWZvcmUgcGluZ2luZyBzdGFydHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19ERUxBWSA9IDIwMDA7Ci0KLQkvLyBkZWxheSBiZXR3ZWVuIHBpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJTkdfSU5URVJWQUwgPSAyNTA7Ci0KLQkvLyBtYXhpbXVtIG51bWJlciBvZiBwaW5ncyBiZWZvcmUgZ2l2aW5nIHVwCi0JcHJpdmF0ZSBpbnQgbWF4UGluZ3MgPSA1NjsgLy8gdG90YWw6IDE2IHNlY29uZHMgKyBjb25uZWN0aW9uIHRpbWUKLQotCXByaXZhdGUgYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0KLQlwcml2YXRlIFN0cmluZyB1cmw7Ci0KLQlwcml2YXRlIElTZXJ2ZXIgc2VydmVyOwotCi0JcHJpdmF0ZSBIdHRwU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBQaW5nVGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gdXJsCi0JICogQHBhcmFtIG1heFBpbmdzCi0JICogQHBhcmFtIGJlaGF2aW91cgotCSAqLwotCXB1YmxpYyBQaW5nVGhyZWFkKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgdXJsLCBpbnQgbWF4UGluZ3MsCi0JCQlIdHRwU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cikgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JCXRoaXMubWF4UGluZ3MgPSBtYXhQaW5nczsKLQkJdGhpcy5iZWhhdmlvdXIgPSBiZWhhdmlvdXI7Ci0JCVRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JCXQuc2V0RGFlbW9uKHRydWUpOwotCQl0LnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogUGluZyB0aGUgc2VydmVyIHVudGlsIGl0IGlzIHN0YXJ0ZWQuIFRoZW4gc2V0IHRoZSBzZXJ2ZXIgc3RhdGUgdG8KLQkgKiBTVEFURV9TVEFSVEVELgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBpbmcoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoUElOR19ERUxBWSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQl3aGlsZSAoIXN0b3ApIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNvdW50ID09IG1heFBpbmdzKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzZXJ2ZXIuc3RvcChmYWxzZSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBjb3VsZCBub3Qgc3RvcCBzZXJ2ZXIiKTsKLQkJCQkJfQotCQkJCQlzdG9wID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNvdW50Kys7Ci0KLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBwaW5naW5nIik7Ci0JCQkJVVJMIHBpbmdVcmwgPSBuZXcgVVJMKHVybCk7Ci0JCQkJVVJMQ29ubmVjdGlvbiBjb25uID0gcGluZ1VybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCSgoSHR0cFVSTENvbm5lY3Rpb24pIGNvbm4pLmdldFJlc3BvbnNlQ29kZSgpOwotCi0JCQkJLy8gcGluZyB3b3JrZWQgLSBzZXJ2ZXIgaXMgdXAKLQkJCQlpZiAoIXN0b3ApIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogc3VjY2VzcyIpOwotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQkJYmVoYXZpb3VyLnNldFNlcnZlclN0YXJ0ZWQoKTsKLQkJCQl9Ci0JCQkJc3RvcCA9IHRydWU7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZmUpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQkJYmVoYXZpb3VyLnNldFNlcnZlclN0YXJ0ZWQoKTsKLQkJCQlzdG9wID0gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogZmFpbGVkIik7Ci0JCQkJLy8gcGluZ2luZyBmYWlsZWQKLQkJCQlpZiAoIXN0b3ApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVRocmVhZC5zbGVlcChQSU5HX0lOVEVSVkFMKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTIpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVsbCB0aGUgcGluZ2luZyB0byBzdG9wLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHN0b3BwaW5nIik7Ci0JCXN0b3AgPSB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODhhNjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFByb2dyZXNzIE1vbml0b3IgdXRpbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFByb2dyZXNzVXRpbCB7Ci0JLyoqCi0JICogUHJvZ3Jlc3NVdGlsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBQcm9ncmVzc1V0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmFsaWQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlIGN1cnJlbnQKLQkgKiBwcm9ncmVzcyBtb25pdG9yLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIHRpY2tzIGludAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcykgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKLQkJCXJldHVybiBtb25pdG9yOwotCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLXByb2dyZXNzIG1vbml0b3Igd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9uIHRoZSBjdXJyZW50Ci0JICogcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSB0aWNrcyBhIG51bWJlciBvZiB0aWNrcwotCSAqIEBwYXJhbSBzdHlsZSBhIHN0eWxlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzLAotCQkJaW50IHN0eWxlKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzLCBzdHlsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTc3Y2QwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCXB1YmxpYyBzdGF0aWMgYnl0ZSBDT05GSUcgPSAwOwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBXQVJOSU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgU0VWRVJFID0gMjsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgRklORVNUID0gMzsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgRklORVIgPSA0OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxldmVsTmFtZXMgPSBuZXcgU3RyaW5nW10geyAiQ09ORklHICAgIiwgIldBUk5JTkcgICIsCi0JCSJTRVZFUkUgICAiLCAiRklORVIgICAgIiwgIkZJTkVTVCAgICIgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCi0JCQkiZGQvTU0veXkgSEg6bW0uc3MuU1NTIik7Ci0KLQkvKioKLQkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgVHJhY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICogCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgewotCQlUcmFjZS50cmFjZShsZXZlbCwgcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwgdGhlIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAobGV2ZWwgPT0gU0VWRVJFKQotCQkJSHR0cENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBIdHRwQ29yZVBsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKLQkJCi0JCWlmICghSHR0cENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoSHR0cENvcmVQbHVnaW4uUExVR0lOX0lEKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChsZXZlbE5hbWVzW2xldmVsXSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQoc2RmLmZvcm1hdChuZXcgRGF0ZSgpKSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQocyk7Ci0JCS8vIFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFNlcnZlckNvcmUuUExVR0lOX0lEICsgIi8iICsgInJlc291cmNlcyIpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKLQkJaWYgKHQgIT0gbnVsbCkKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5UG9ydENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5UG9ydENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2MDIxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeVBvcnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIE1vZGlmeVBvcnRDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGludCBwb3J0OwotCXByb3RlY3RlZCBpbnQgb2xkUG9ydDsKLQotCS8qKgotCSAqIE1vZGlmeVBvcnRDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcG9ydCBuZXcgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZ5UG9ydENvbW1hbmQoSHR0cFNlcnZlciBzZXJ2ZXIsIGludCBwb3J0KSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuYWN0aW9uTW9kaWZ5UG9ydCk7Ci0JCXRoaXMucG9ydCA9IHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBmaW5kIG9sZCBwb3J0IG51bWJlcgotCQlTZXJ2ZXJQb3J0IHRlbXAgPSBzZXJ2ZXIuZ2V0U2VydmVyUG9ydHMoKVswXTsKLQkJb2xkUG9ydCA9IHRlbXAuZ2V0UG9ydCgpOwotCQkKLQkJLy8gbWFrZSB0aGUgY2hhbmdlCi0JCXNlcnZlci5zZXRQb3J0KHBvcnQpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJc2VydmVyLnNldFBvcnQob2xkUG9ydCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5UHVibGlzaGluZ0NvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5UHVibGlzaGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiMjc4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeVB1Ymxpc2hpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgcHVibGlzaGluZyBzdGF0ZS4KLSAqLwotcHVibGljIGNsYXNzIE1vZGlmeVB1Ymxpc2hpbmdDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUHVibGlzaDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBvbGRTaG91bGRQdWJsaXNoOwotCi0JLyoqCi0JICogTW9kaWZ5UHVibGlzaGluZ0NvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBzaG91bGRQdWJsaXNoIAotCSAqLwotCXB1YmxpYyBNb2RpZnlQdWJsaXNoaW5nQ29tbWFuZChIdHRwU2VydmVyIHNlcnZlciwgYm9vbGVhbiBzaG91bGRQdWJsaXNoKSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuYWN0aW9uTW9kaWZ5UHVibGlzaGluZyk7Ci0JCXRoaXMuc2hvdWxkUHVibGlzaCA9IHNob3VsZFB1Ymxpc2g7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRTaG91bGRQdWJsaXNoID0gc2VydmVyLmlzUHVibGlzaGluZygpOwotCQkKLQkJLy8gbWFrZSB0aGUgY2hhbmdlCi0JCXNlcnZlci5zZXRQdWJsaXNoaW5nKHNob3VsZFB1Ymxpc2gpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJc2VydmVyLnNldFB1Ymxpc2hpbmcob2xkU2hvdWxkUHVibGlzaCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5VVJMUHJlZml4Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlVUkxQcmVmaXhDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDc1OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlVUkxQcmVmaXhDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTW9kaWZ5VVJMUHJlZml4Q29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBTdHJpbmcgcHJlZml4OwotCXByb3RlY3RlZCBTdHJpbmcgb2xkUHJlZml4OwotCi0JLyoqCi0JICogTW9kaWZ5VVJMUHJlZml4Q29tbWFuZCBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgSFRUUCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHByZWZpeCBhIG5ldyBwcmVmaXgKLQkgKi8KLQlwdWJsaWMgTW9kaWZ5VVJMUHJlZml4Q29tbWFuZChIdHRwU2VydmVyIHNlcnZlciwgU3RyaW5nIHByZWZpeCkgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLmFjdGlvbk1vZGlmeVByZWZpeFVSTCk7Ci0JCXRoaXMucHJlZml4ID0gcHJlZml4OwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gZmluZCBvbGQgcHJlZml4Ci0JCW9sZFByZWZpeCA9IHNlcnZlci5nZXRVUkxQcmVmaXgoKTsKLQotCQkvLyBtYWtlIHRoZSBjaGFuZ2UKLQkJc2VydmVyLnNldFVSTFByZWZpeChwcmVmaXgpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJc2VydmVyLnNldFVSTFByZWZpeChvbGRQcmVmaXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NlcnZlckNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2VydmVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQzZjYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2VydmVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLkh0dHBTZXJ2ZXI7Ci0vKioKLSAqIFNlcnZlciBjb21tYW5kLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIHsKLQlwcm90ZWN0ZWQgSHR0cFNlcnZlciBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBsYWJlbCBhIGxhYmVsCi0JICovCi0JcHVibGljIFNlcnZlckNvbW1hbmQoSHR0cFNlcnZlciBzZXJ2ZXIsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKCk7Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWV4ZWN1dGUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgdW5kbygpOwotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl1bmRvKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2ZDQ5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkZDdkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhODc2OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIwODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTk0ZWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaHUgTWFyIDA4IDEzOjAyOjM5IFBTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE2MGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jU2F0IEFwciAyMiAxODozNjoxNCBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiOWQ4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS5pbnRlcm5hbC5IdHRwVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuZm9ybXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDQsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMywyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwZmJmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL2ljb25zL29iajE2L3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9pY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFhZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL2ljb25zL29iajE2L3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9pY29ucy93aXpiYW4vc2VydmVyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9pY29ucy93aXpiYW4vc2VydmVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZGU5MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvaWNvbnMvd2l6YmFuL3NlcnZlcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmZDA4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUhUVFAgU2VydmVyIFVJIFN1cHBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDJmMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotICAgICAgPGltYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUsb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnNlcnZlciIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgICA8aW1hZ2UgcnVudGltZS1jb21wb25lbnQtdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUiCi0gICAgICAgcGF0aD0iaWNvbnMvb2JqMTYvc2VydmVyLmdpZiIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICAgPGFkYXB0ZXI+Ci0gICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAucnVudGltZSIvPgotICAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLkZhY2V0UnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIiLz4KLSAgICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgICA8L2FkYXB0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmRGcmFnbWVudHMiPgotICAgICAgPGZyYWdtZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUud2l6YXJkIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnJ1bnRpbWUiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsLkh0dHBSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZEZyYWdtZW50cyI+Ci0gICAgICA8ZnJhZ21lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuc2VydmVyLndpemFyZCIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5zZXJ2ZXIiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsLkh0dHBTZXJ2ZXJXaXphcmRGcmFnbWVudCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yUGFnZVNlY3Rpb25zIj4KLSAgIAk8c2VjdGlvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5lZGl0b3IiCi0gICAgICAgICBvcmRlcj0iMTAiCi0gICAgICAgICBpbnNlcnRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXcubGVmdCIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5zZXJ2ZXIiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsLkh0dHBTZWN0aW9uIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NzI2NzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS5pbnRlcm5hbDsKLS8qKgotICogQ29uc3RhbnQgaWRzIGZvciBjb250ZXh0IGhlbHAuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dElkcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0VESVRPUiA9IEh0dHBVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlaWcwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX0NPTVBPU0lURSA9IEh0dHBVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnR3bnIwMDAwIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBSdW50aW1lQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBSdW50aW1lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMWM5ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwUnVudGltZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWwuSHR0cFJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogV2l6YXJkIHBhZ2UgdG8gc2V0IHRoZSBzZXJ2ZXIgaW5zdGFsbCBkaXJlY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwUnVudGltZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdDOwotCXByb3RlY3RlZCBIdHRwUnVudGltZSBydW50aW1lOwotCXByb3RlY3RlZCBUZXh0IG5hbWU7Ci0JcHJvdGVjdGVkIFRleHQgcHVibGlzaERpcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0KLQkvKioKLQkgKiBIdHRwUnVudGltZUNvbXBvc2l0ZQotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2l6YXJkIHRoZSB3aXphcmQgaGFuZGxlCi0JICovCi0JcHVibGljIEh0dHBSdW50aW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpemFyZFRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpemFyZERlc2NyaXB0aW9uKTsKLQkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihIdHRwVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEh0dHBVSVBsdWdpbi5JTUdfV0laX1NFUlZFUikpOwotCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSdW50aW1lKElSdW50aW1lV29ya2luZ0NvcHkgbmV3UnVudGltZSkgewotCQlpZiAobmV3UnVudGltZSA9PSBudWxsKSB7Ci0JCQlydW50aW1lV0MgPSBudWxsOwotCQkJcnVudGltZSA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlydW50aW1lV0MgPSBuZXdSdW50aW1lOwotCQkJcnVudGltZSA9IChIdHRwUnVudGltZSkgbmV3UnVudGltZS5sb2FkQWRhcHRlcihIdHRwUnVudGltZS5jbGFzcywgbnVsbCk7Ci0JCX0KLQkJCi0JCWluaXQoKTsKLQkJdmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlIGEgd2l6YXJkIHBhZ2UgdG8gY2hhbmdlIHRoZSBBcGFjaGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlDb21wb3NpdGUgbmFtZUdyb3VwID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCW5hbWVHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbmFtZUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuUlVOVElNRV9DT01QT1NJVEUpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwobmFtZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucnVudGltZU5hbWUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0VORCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJbmFtZSA9IG5ldyBUZXh0KG5hbWVHcm91cCwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCW5hbWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlydW50aW1lV0Muc2V0TmFtZShuYW1lLmdldFRleHQoKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQljcmVhdGVQdWJsaXNoTG9jYXRpb25Hcm91cChuYW1lR3JvdXApOwotCQkKLQkJaW5pdCgpOwotCQl2YWxpZGF0ZSgpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKLQkJCi0JCW5hbWUuZm9yY2VGb2N1cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgcnVudGltZVdDID09IG51bGwgfHwgcnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJbmFtZS5zZXRUZXh0KHJ1bnRpbWVXQy5nZXROYW1lKCkpOwotCQlpZiAocnVudGltZVdDLmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLQkJCXB1Ymxpc2hEaXIuc2V0VGV4dChydW50aW1lV0MuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAocnVudGltZSA9PSBudWxsKSB7Ci0JCQl3aXphcmQuc2V0TWVzc2FnZSgiIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQotCQlpZiAocnVudGltZVdDICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lMiA9IHJ1bnRpbWVXQy5nZXROYW1lKCk7Ci0JCQlpZiAobmFtZTIgPT0gbnVsbCB8fCBuYW1lMi50cmltKCkuZXF1YWxzKCIiKSkgewotCQkJCXdpemFyZC5zZXRNZXNzYWdlKE1lc3NhZ2VzLndpemFyZE1pc3NpbmdSdW50aW1lTmFtZSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQl9IGVsc2UgewotCQkJCWJvb2xlYW4gb2sgPSBjaGVja1J1bnRpbWVOYW1lKG5hbWUyKTsKLQkJCQlpZiAoIW9rKSB7Ci0JCQkJCXdpemFyZC5zZXRNZXNzYWdlKE1lc3NhZ2VzLndpemFyZER1cGxpY2F0ZU5hbWUsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQdWJsaXNoTG9jYXRpb25Hcm91cChDb21wb3NpdGUgcHVibGlzaEluZm9Hcm91cCkgewotCQlGb250IGZvbnQgPSBwdWJsaXNoSW5mb0dyb3VwLmdldEZvbnQoKTsKLQkJLy8gbG9jYXRpb24gbGFiZWwKLQkJTGFiZWwgbG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChwdWJsaXNoSW5mb0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0Rm9udChmb250KTsKLQkJbG9jYXRpb25MYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnB1Ymxpc2hEaXIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0VORCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkvLyBwcm9qZWN0IGxvY2F0aW9uIGVudHJ5IGZpZWxkCi0JCXB1Ymxpc2hEaXIgPSBuZXcgVGV4dChwdWJsaXNoSW5mb0dyb3VwLCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlwdWJsaXNoRGlyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1Ymxpc2hEaXIuc2V0Rm9udChmb250KTsKLQkJcHVibGlzaERpci5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlydW50aW1lV0Muc2V0TG9jYXRpb24obmV3IFBhdGgocHVibGlzaERpci5nZXRUZXh0KCkpKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIGJyb3dzZSBidXR0b24KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwdWJsaXNoSW5mb0dyb3VwLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRGb250KGZvbnQpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5icm93c2UpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKEh0dHBSdW50aW1lQ29tcG9zaXRlLnRoaXMuZ2V0U2hlbGwoKSk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuc2VsZWN0SW5zdGFsbERpcik7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgocHVibGlzaERpci5nZXRUZXh0KCkpOwotCQkJCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpCi0JCQkJCXB1Ymxpc2hEaXIuc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja1J1bnRpbWVOYW1lKFN0cmluZyBuYW1lMikgewotCQluYW1lMiA9IG5hbWUyLnRyaW0oKTsKLQkJaWYgKG5hbWUyLmVxdWFscyhydW50aW1lV0MuZ2V0TmFtZSgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWlmIChydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlmb3IgKElSdW50aW1lIHJ1bnRpbWUyIDogcnVudGltZXMpIHsKLQkJCQlpZiAobmFtZTIuZXF1YWxzKHJ1bnRpbWUyLmdldE5hbWUoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczOWIyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogSFRUUCBydW50aW1lIHdpemFyZCBmcmFnbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEh0dHBSdW50aW1lV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJvdGVjdGVkIEh0dHBSdW50aW1lQ29tcG9zaXRlIGNvbXA7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJXaXphcmRGcmFnbWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBIdHRwUnVudGltZVdpemFyZEZyYWdtZW50KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkudGFzay5XaXphcmRGcmFnbWVudCNjcmVhdGVDb21wb3NpdGUoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCWNvbXAgPSBuZXcgSHR0cFJ1bnRpbWVDb21wb3NpdGUocGFyZW50LCB3aXphcmQpOwotCQlyZXR1cm4gY29tcDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQjZW50ZXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQlpZiAoY29tcCAhPSBudWxsKSB7Ci0JCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQkJY29tcC5zZXRSdW50aW1lKHJ1bnRpbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBydW50aW1lLnZhbGlkYXRlKG51bGwpOwotCQlyZXR1cm4gKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDlkMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JRm9ybUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWwuSHR0cFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5jb21tYW5kLk1vZGlmeVBvcnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC5jb3JlLmludGVybmFsLmNvbW1hbmQuTW9kaWZ5UHVibGlzaGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLmNvcmUuaW50ZXJuYWwuY29tbWFuZC5Nb2RpZnlVUkxQcmVmaXhDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLlNlcnZlckVkaXRvclNlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBIdHRwU2VjdGlvbiBleHRlbmRzIFNlcnZlckVkaXRvclNlY3Rpb24gewotCXByb3RlY3RlZCBIdHRwU2VydmVyIGh0dHBTZXJ2ZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7Ci0JcHJvdGVjdGVkIFRleHQgdXJsUHJlZml4VGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hDaGVja0JveDsKLQlwcm90ZWN0ZWQgU3Bpbm5lciBwb3J0U3Bpbm5lcjsKLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBIdHRwU2VjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJaWYgKEh0dHBTZXJ2ZXIuUFJPUEVSVFlfUE9SVC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUludGVnZXIgaSA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlwb3J0U3Bpbm5lci5zZXRTZWxlY3Rpb24oaS5pbnRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKEh0dHBTZXJ2ZXIuUFJPUEVSVFlfVVJMX1BSRUZJWC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKHMgIT0gbnVsbCkKLQkJCQkJCXVybFByZWZpeFRleHQuc2V0VGV4dChzKTsKLQkJCQl9IGVsc2UgaWYgKEh0dHBTZXJ2ZXIuUFJPUEVSVFlfSVNfUFVCTElTSElORy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAoYiAhPSBudWxsKQotCQkJCQkJcHVibGlzaENoZWNrQm94LnNldFNlbGVjdGlvbihiLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJc2VydmVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVTZWN0aW9uKHBhcmVudCk7Ci0JCQotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTik7Ci0JCXNlY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5lZGl0b3JTZWN0aW9uVGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmVkaXRvclNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA4OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSA4OwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJCi0JCS8vIFVSTCBwcmVmaXgKLQkJTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLmVkaXRvclVSTFByZWZpeCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJLy9kYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl1cmxQcmVmaXhUZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCS8vZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXVybFByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdXJsUHJlZml4VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgTW9kaWZ5VVJMUHJlZml4Q29tbWFuZChodHRwU2VydmVyLCB1cmxQcmVmaXhUZXh0LmdldFRleHQoKSkpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gcG9ydAotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBjb21wb3NpdGUsIE1lc3NhZ2VzLmVkaXRvclBvcnQpOwotCQkKLQkJcG9ydFNwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlwb3J0U3Bpbm5lci5zZXRNaW5pbXVtKDApOwotCQlwb3J0U3Bpbm5lci5zZXRNaW5pbXVtKDk5OTk5OSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJcG9ydFNwaW5uZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcG9ydFNwaW5uZXIuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IE1vZGlmeVBvcnRDb21tYW5kKGh0dHBTZXJ2ZXIsIHBvcnRTcGlubmVyLmdldFNlbGVjdGlvbigpKSk7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBpcyBwdWJsaXNoaW5nCi0JCXB1Ymxpc2hDaGVja0JveCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlwdWJsaXNoQ2hlY2tCb3guc2V0VGV4dChNZXNzYWdlcy5lZGl0b3JTaG91bGRQdWJsaXNoKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJcHVibGlzaENoZWNrQm94LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1Ymxpc2hDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJQnV0dG9uIGIgPSAoQnV0dG9uKSBzZS5nZXRTb3VyY2UoKTsKLQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgTW9kaWZ5UHVibGlzaGluZ0NvbW1hbmQoaHR0cFNlcnZlciwgYi5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0KTsKLQkJbGFiZWwuc2V0Rm9yZWdyb3VuZCh0b29sa2l0LmdldENvbG9ycygpLmdldENvbG9yKElGb3JtQ29sb3JzLlRJVExFKSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgcGFydCB3aXRoIGEgc2l0ZSBhbmQgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCQotCQlodHRwU2VydmVyID0gKEh0dHBTZXJ2ZXIpIHNlcnZlci5sb2FkQWRhcHRlcihIdHRwU2VydmVyLmNsYXNzLCBudWxsKTsKLQkJYWRkQ2hhbmdlTGlzdGVuZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGZpZWxkcyBpbiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAodXJsUHJlZml4VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl1cGRhdGluZyA9IHRydWU7Ci0JCQotCQlTdHJpbmcgdXJsUHJlZml4ID0gaHR0cFNlcnZlci5nZXRVUkxQcmVmaXgoKTsKLQkJaWYgKHVybFByZWZpeCAhPSBudWxsKQotCQkJdXJsUHJlZml4VGV4dC5zZXRUZXh0KHVybFByZWZpeCk7Ci0JCXVybFByZWZpeFRleHQuc2V0RW5hYmxlZCghcmVhZE9ubHkpOwotCQkKLQkJcG9ydFNwaW5uZXIuc2V0U2VsZWN0aW9uKGh0dHBTZXJ2ZXIuZ2V0UG9ydCgpKTsKLQkJcG9ydFNwaW5uZXIuc2V0RW5hYmxlZCghcmVhZE9ubHkpOwotCQkKLQkJcHVibGlzaENoZWNrQm94LnNldFNlbGVjdGlvbihodHRwU2VydmVyLmlzUHVibGlzaGluZygpKTsKLQkJcHVibGlzaENoZWNrQm94LnNldEVuYWJsZWQoIXJlYWRPbmx5KTsKLQkJdXBkYXRpbmcgPSBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwU2VydmVyQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBTZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3ZTEyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBTZXJ2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAuY29yZS5pbnRlcm5hbC5IdHRwU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci0vKioKLSAqIFdpemFyZCBwYWdlIHRvIHNldCB0aGUgc2VydmVyIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwU2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldDOwotCXByb3RlY3RlZCBIdHRwU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgVGV4dCBwcmVmaXg7Ci0JcHJvdGVjdGVkIFNwaW5uZXIgcG9ydDsKLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hDaGVja0JveDsKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0KLQkvKioKLQkgKiBIdHRwU2VydmVyQ29tcG9zaXRlCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aXphcmQgdGhlIHdpemFyZCBoYW5kbGUKLQkgKi8KLQlwdWJsaWMgSHR0cFNlcnZlckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy53aXphcmRUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXphcmREZXNjcmlwdGlvbik7Ci0JCXdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoSHR0cFVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihIdHRwVUlQbHVnaW4uSU1HX1dJWl9TRVJWRVIpKTsKLQotCQljcmVhdGVDb250cm9sKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VydmVyKElTZXJ2ZXJXb3JraW5nQ29weSBuZXdTZXJ2ZXIpIHsKLQkJaWYgKG5ld1NlcnZlciA9PSBudWxsKSB7Ci0JCQlzZXJ2ZXJXQyA9IG51bGw7Ci0JCQlzZXJ2ZXIgPSBudWxsOwotCQl9IGVsc2UgewotCQkJc2VydmVyV0MgPSBuZXdTZXJ2ZXI7Ci0JCQlzZXJ2ZXIgPSAoSHR0cFNlcnZlcikgbmV3U2VydmVyLmxvYWRBZGFwdGVyKEh0dHBTZXJ2ZXIuY2xhc3MsIG51bGwpOwotCQl9Ci0JCQotCQlpZiAoIWlzRGlzcG9zZWQoKSkKLQkJCWluaXQoKTsKLQkJdmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlIGEgd2l6YXJkIHBhZ2UgdG8gY2hhbmdlIHRoZSBBcGFjaGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBDb250ZXh0SWRzLlJVTlRJTUVfQ09NUE9TSVRFKTsKLQkJCi0JCWNyZWF0ZVNlcnZlckluZm9Hcm91cChjb21wKTsKLQkJCi0JCUZvbnQgZm9udCA9IGNvbXAuZ2V0Rm9udCgpOwotCQlwdWJsaXNoQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCXB1Ymxpc2hDaGVja0JveC5zZXRUZXh0KE1lc3NhZ2VzLnNob3VsZFB1Ymxpc2gpOwotCQlwdWJsaXNoQ2hlY2tCb3guc2V0Rm9udChmb250KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJcHVibGlzaENoZWNrQm94LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlwdWJsaXNoQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCUJ1dHRvbiBiID0gKEJ1dHRvbikgc2UuZ2V0U291cmNlKCk7Ci0JCQkJc2VydmVyLnNldFB1Ymxpc2hpbmcoYi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlpbml0KCk7Ci0JCXZhbGlkYXRlKCk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCQkKLQkJcG9ydC5mb3JjZUZvY3VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJaWYgKHBvcnQgPT0gbnVsbCB8fCBzZXJ2ZXJXQyA9PSBudWxsIHx8IHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJcG9ydC5zZXRTZWxlY3Rpb24oc2VydmVyLmdldFBvcnQoKSk7Ci0JCXByZWZpeC5zZXRUZXh0KHNlcnZlci5nZXRVUkxQcmVmaXgoKSk7Ci0JCQotCQlib29sZWFuIGNhblB1Ymxpc2ggPSBzZXJ2ZXIuaXNQdWJsaXNoaW5nKCk7Ci0JCXB1Ymxpc2hDaGVja0JveC5zZXRTZWxlY3Rpb24oY2FuUHVibGlzaCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCS8qaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0JCQl3aXphcmQuc2V0TWVzc2FnZSgiIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ki8KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VydmVySW5mb0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJCi0JCS8vIHBvcnQgbGFiZWwKLQkJTGFiZWwgcG9ydExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlwb3J0TGFiZWwuc2V0Rm9udChmb250KTsKLQkJcG9ydExhYmVsLnNldFRleHQoTWVzc2FnZXMucG9ydCk7Ci0JCQotCQkvLyBwb3J0IGVudHJ5IGZpZWxkCi0JCXBvcnQgPSBuZXcgU3Bpbm5lcihwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlwb3J0LnNldE1pbmltdW0oMCk7Ci0JCXBvcnQuc2V0TWF4aW11bSg5OTk5OTkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzA1OwotCQlwb3J0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXBvcnQuc2V0Rm9udChmb250KTsKLQkJcG9ydC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlzZXJ2ZXIuc2V0UG9ydChwb3J0LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gcHJlZml4IGxhYmVsCi0JCUxhYmVsIHByZWZpeExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlwcmVmaXhMYWJlbC5zZXRGb250KGZvbnQpOwotCQlwcmVmaXhMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLlVSTFByZWZpeCk7Ci0JCQotCQkvLyBwcmVmaXggZW50cnkgZmllbGQKLQkJcHJlZml4ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDMwNTsKLQkJcHJlZml4LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXByZWZpeC5zZXRGb250KGZvbnQpOwotCQlwcmVmaXguYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2VydmVyLnNldFVSTFByZWZpeChwcmVmaXguZ2V0VGV4dCgpKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwU2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvdWkvaW50ZXJuYWwvSHR0cFNlcnZlcldpemFyZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYTEyMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwU2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiBIVFRQIHNlcnZlciB3aXphcmQgZnJhZ21lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwU2VydmVyV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJvdGVjdGVkIEh0dHBTZXJ2ZXJDb21wb3NpdGUgY29tcDsKLQotCS8qKgotCSAqIFNlcnZlcldpemFyZEZyYWdtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEh0dHBTZXJ2ZXJXaXphcmRGcmFnbWVudCgpIHsKLQkJc2V0Q29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkudGFzay5XaXphcmRGcmFnbWVudCNjcmVhdGVDb21wb3NpdGUoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCWNvbXAgPSBuZXcgSHR0cFNlcnZlckNvbXBvc2l0ZShwYXJlbnQsIHdpemFyZCk7Ci0JCXJldHVybiBjb21wOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudCNlbnRlcigpCi0JICovCi0JcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXJXb3JraW5nQ29weSBydW50aW1lID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQljb21wLnNldFNlcnZlcihydW50aW1lKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9IdHRwVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczYmZlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL0h0dHBVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgSHR0cFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpIjsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPiBpbWFnZURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZURlc2NyaXB0b3I+KCk7Ci0KLQkvLyBiYXNlIHVybCBmb3IgaWNvbnMKLQlwcml2YXRlIHN0YXRpYyBVUkwgSUNPTl9CQVNFX1VSTDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1dJWkJBTiA9ICJ3aXpiYW4vIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laX1NFUlZFUiA9ICJ3aXpTZXJ2ZXIiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEh0dHBVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSHR0cFVJUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEh0dHBVSVBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSHR0cFVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZVJlZ2lzdHJ5IGNyZWF0ZUltYWdlUmVnaXN0cnkoKSB7Ci0JCUltYWdlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfV0laX1NFUlZFUiwgVVJMX1dJWkJBTiArICJzZXJ2ZXJfd2l6LmdpZiIpOwotCQkKLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucGFydHMuSUltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnBhcnRzLklJbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlnZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKTsKLQkJCXJldHVybiBnZXRJbnN0YW5jZSgpLmltYWdlRGVzY3JpcHRvcnMuZ2V0KGtleSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYW4gaW1hZ2Ugd2l0aCB0aGUgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhcnRpYWxVUkwgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3RlckltYWdlKEltYWdlUmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBrZXksIFN0cmluZyBwYXJ0aWFsVVJMKSB7Ci0JCWlmIChJQ09OX0JBU0VfVVJMID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoU3VmZml4ID0gImljb25zLyI7Ci0JCQlJQ09OX0JBU0VfVVJMID0gcGx1Z2luLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBhdGhTdWZmaXgpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ldyBVUkwoSUNPTl9CQVNFX1VSTCwKLQkJCQkJcGFydGlhbFVSTCkpOwotCQkJcmVnaXN0cnkucHV0KGtleSwgaWQpOwotCQkJaW1hZ2VEZXNjcmlwdG9ycy5wdXQoa2V5LCBpZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgcmVnaXN0ZXJpbmcgaW1hZ2UiLCBlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDUwMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSTFByZWZpeDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG91bGRQdWJsaXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hEaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0SW5zdGFsbERpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXphcmREZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXphcmREdXBsaWNhdGVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpemFyZE1pc3NpbmdSdW50aW1lTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXphcmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JTZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclVSTFByZWZpeDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclNob3VsZFB1Ymxpc2g7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEh0dHBVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmludGVybmFsLk1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjY3Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcnVudGltZU5hbWU9TmEmbWU6Ci1icm93c2U9QiZyb3dzZS4uLgotcG9ydD1IVFRQICZQb3J0OgotVVJMUHJlZml4PSZVUkwgUHJlZml4OgotcHVibGlzaERpcj1QdWJsaXNoaW5nICZEaXJlY3Rvcnk6Ci1zaG91bGRQdWJsaXNoPUVuYWJsZSBwJnVibGlzaGluZyB0byB0aGlzIHNlcnZlcgotCi1zZWxlY3RJbnN0YWxsRGlyPVNlbGVjdCBIVFRQIHNlcnZlciBkb2N1bWVudCByb290LgotCi0jIEFwYWNoZSBzZXJ2ZXIgd2l6YXJkIGFuZCBlZGl0b3IKLXdpemFyZFRpdGxlPUhUVFAgU2VydmVyCi13aXphcmREZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBIVFRQIHNlcnZlciBpbmZvcm1hdGlvbgotd2l6YXJkRHVwbGljYXRlTmFtZT1EdXBsaWNhdGUgU2VydmVyIE5hbWUKLXdpemFyZE1pc3NpbmdSdW50aW1lTmFtZT1NaXNzaW5nIFJ1bnRpbWUgTmFtZQotCi1lZGl0b3JTZWN0aW9uVGl0bGU9SFRUUCBTZXJ2ZXIKLWVkaXRvclNlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHB1Ymxpc2hpbmcgZGlyZWN0b3J5IGFuZCBVUkwuCi1lZGl0b3JVUkxQcmVmaXg9VVJMIFByZWZpeDoKLWVkaXRvclBvcnQ9SFRUUCBQb3J0OgotZWRpdG9yU2hvdWxkUHVibGlzaD1FbmFibGUgcHVibGlzaGluZyB0byB0aGlzIHNlcnZlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvdWkvaW50ZXJuYWwvUnVudGltZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5odHRwLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2h0dHAvdWkvaW50ZXJuYWwvUnVudGltZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZjUwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL1J1bnRpbWVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIFN1cHBvcnQgZm9yIGFsbCBzZXJ2ZXIgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIHsKLQlwcml2YXRlIGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjOwotCi0JcHVibGljIFJ1bnRpbWVMYWJlbFByb3ZpZGVyKGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjKSB7Ci0JCXRoaXMucmMgPSByYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gcmMuZ2V0UHJvcGVydHkoInR5cGUiKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlci5jbGFzcyB9OwotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQkJZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmMgPSAoSVJ1bnRpbWVDb21wb25lbnQpIGFkYXB0YWJsZTsKLQkJCXJldHVybiBuZXcgUnVudGltZUxhYmVsUHJvdmlkZXIocmMpOwotCQl9Ci0KLQkJcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCQlyZXR1cm4gQURBUFRFUl9UWVBFUzsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuaHR0cC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9odHRwL3VpL2ludGVybmFsL1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMmMzMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvaHR0cC91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmh0dHAudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCXB1YmxpYyBzdGF0aWMgYnl0ZSBDT05GSUcgPSAwOwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBXQVJOSU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgU0VWRVJFID0gMjsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgRklORVNUID0gMzsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgRklORVIgPSA0OwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewotCQlpZiAobGV2ZWwgPT0gU0VWRVJFKQotCQkJSHR0cFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSHR0cFVJUGx1Z2luLlBMVUdJTl9JRCwgcywgdCkpOwotCQkKLQkJaWYgKCFIdHRwVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbihIdHRwVUlQbHVnaW4uUExVR0lOX0lEICsgIiAiICsgcyk7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NmQ0OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZGQ3ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmE5MjMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIE5vdiAxMCAxNzoxMTozNSBIU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIwODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotI1RodSBTZXAgMTMgMTU6MjU6MDYgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaCwqLnRlc3RzdWl0ZSwqLmRlcGxveSwqLmxvY2F0aW9uLCouZXhlY3V0aW9uLCouZGF0YXBvb2wsKi5hcnRpZmFjdCwqLmh0bWwsKi5zdmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NjMWQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBGZWIgMjMgMjE6MTE6NTIgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTYwZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI1NhdCBBcHIgMjIgMTg6MzY6MTQgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODdmMThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmUuUHJldmlld1BsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAzLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjMuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3YzVlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLwotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9pY29ucy9vYmoxNi9wcmV2aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvaWNvbnMvb2JqMTYvcHJldmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9pY29ucy9vYmoxNi9wcmV2aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzc5ZDgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1IVFRQIFByZXZpZXcgU3VwcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLXByZXZpZXdSdW50aW1lVHlwZU5hbWU9SFRUUCBQcmV2aWV3Ci1wcmV2aWV3UnVudGltZVR5cGVEZXNjcmlwdGlvbj1BIHJ1bnRpbWUgdG8gYnVpbGQgc3RhdGljIFdlYiBtb2R1bGVzLgotCi1wcmV2aWV3U2VydmVyVHlwZU5hbWU9SFRUUCBQcmV2aWV3Ci1wcmV2aWV3U2VydmVyVHlwZURlc2NyaXB0aW9uPUEgc2VydmVyIHRvIHByZXZpZXcgc3RhdGljIFdlYiBtb2R1bGVzLgotCi1wcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblR5cGU9SFRUUCBQcmV2aWV3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTY0YTdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlcyI+Ci0gICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIgotICAgICAgIG5hbWU9IiVwcmV2aWV3UnVudGltZVR5cGVOYW1lIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcHJldmlld1J1bnRpbWVUeXBlRGVzY3JpcHRpb24iCi0gICAgICAgZmFjZXRSdW50aW1lQ29tcG9uZW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcucnVudGltZSIKLQkgICAgZmFjZXRSdW50aW1lVmVyc2lvbj0iMS4wIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdSdW50aW1lIj4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9IndzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgPC9ydW50aW1lVHlwZT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzIj4KLSAgICAgPHNlcnZlclR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LnNlcnZlciIKLSAgICAgICBuYW1lPSIlcHJldmlld1NlcnZlclR5cGVOYW1lIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcHJldmlld1NlcnZlclR5cGVEZXNjcmlwdGlvbiIKLSAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSIKLSAgICAgICBydW50aW1lPSJ0cnVlIgotICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICBoYXNDb25maWd1cmF0aW9uPSJmYWxzZSIKLSAgICAgICBsYXVuY2hNb2Rlcz0icnVuLGRlYnVnLHByb2ZpbGUiCi0gICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcucnVudGltZSIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZS5QcmV2aWV3U2VydmVyIgotICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIgotICAgICAgIHZlcnNpb249IjEuMCIvPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJ3c3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGVzIj4KLSAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgIG5hbWU9IiVwcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgIGRlbGVnYXRlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlLlByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUiCi0gICAgICAgIG1vZGVzPSJydW4sZGVidWcscHJvZmlsZSIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzIj4KLSAgICA8bGF1bmNoYWJsZUFkYXB0ZXIKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXciCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZS5QcmV2aWV3TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIvPgotICA8L2V4dGVuc2lvbj4KLQotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4KLSAgICA8aW1hZ2UKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcudWkiCi0gICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcucnVudGltZSxvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuc2VydmVyIgotICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvcHJldmlldy5naWYiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmltYWdlcyI+Ci0gICAgPGltYWdlIHJ1bnRpbWUtY29tcG9uZW50LXR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIgotICAgICAgIHBhdGg9Imljb25zL29iajE2L3ByZXZpZXcuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LnJ1bnRpbWUiLz4KLSAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLkZhY2V0UnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIiLz4KLSAgICAgIDx0eXBlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIi8+Ci0gICAgPC9hZGFwdGVyPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5kZWZhdWx0RmFjZXRzIj4KLSAgICA8ZGVmYXVsdC1mYWNldHM+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5ydW50aW1lIi8+Ci0gICAgICA8ZmFjZXQgaWQ9IndzdC5qc2R0LndlYiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9kZWZhdWx0LWZhY2V0cz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZXMiPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UiCi0gICAgICBjb25maWdUeXBlSUQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgIGljb249Imljb25zL29iajE2L3ByZXZpZXcuZ2lmIj4KLSAgICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2U+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cHMiPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLnVpLlByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAiPgotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwPgotICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvSU1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvSU1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4MWFkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL0lNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmU7Ci0vKioKLSAqIEludGVyZmFjZSB0byBhIG1lbWVudG8gdXNlZCBmb3Igc2F2aW5nIHRoZSBpbXBvcnRhbnQgc3RhdGUgb2YgYW4gb2JqZWN0Ci0gKiBpbiBhIGZvcm0gdGhhdCBjYW4gYmUgcGVyc2lzdGVkIGluIHRoZSBmaWxlIHN5c3RlbS4KLSAqIDxwPgotICogTWVtZW50b3Mgd2VyZSBkZXNpZ25lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGluIG1pbmQ6Ci0gKiA8b2w+Ci0gKiAgPGxpPkNlcnRhaW4gb2JqZWN0cyBuZWVkIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgcGxhdGZvcm0gc2Vzc2lvbnMuCi0gKiAgICA8L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgYW4gYXBwcm9wcmlhdGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtaWdodCBub3QKLSAqICAgIGJlIGF2YWlsYWJsZS4gSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBza2lwIGFuIG9iamVjdCBpbiB0aGlzIGNhc2UuPC9saT4KLSAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgdGhlIG9iamVjdCBtYXkgYmUKLSAqICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2hlbiB0aGUgb2JqZWN0IHdhcyBvcmlnaW5hbGx5IHNhdmVkLiBJZiBzbywgdGhlCi0gKiAgICBuZXcgY2xhc3Mgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIGZvcm0gb2YgdGhlIGRhdGEuPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1lbWVudG9zIG1lZXQgdGhlc2UgcmVxdWlyZW1lbnRzIGJ5IHByb3ZpZGluZyBzdXBwb3J0IGZvciBzdG9yaW5nIGEKLSAqIG1hcHBpbmcgb2YgYXJiaXRyYXJ5IHN0cmluZyBrZXlzIHRvIHByaW1pdGl2ZSB2YWx1ZXMsIGFuZCBieSBhbGxvd2luZwotICogbWVtZW50b3MgdG8gaGF2ZSBvdGhlciBtZW1lbnRvcyBhcyBjaGlsZHJlbiAoYXJyYW5nZWQgaW50byBhIHRyZWUpLgotICogQSByb2J1c3QgZXh0ZXJuYWwgc3RvcmFnZSBmb3JtYXQgYmFzZWQgb24gWE1MIGlzIHVzZWQuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVtZW50byB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBvZiB0aGlzIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcwotCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50bwotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBpbnRlZ2VyLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludGVnZXIoU3RyaW5nIGtleSwgaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMzg2Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5Nb2RpZnlNb2R1bGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGh0dHBQb3J0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQb3J0SW5Vc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuY29yZS5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJlZDE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWh0dHBQb3J0PUhUVFAgUG9ydAotY2FuTW9kaWZ5TW9kdWxlcz1XZWIgbW9kdWxlcyBjYW4gYmUgbW9kaWZpZWQuCi0KLWVycm9yUHVibGlzaD1FcnJvciBkdXJpbmcgcHVibGlzaAotZXJyb3JQb3J0SW5Vc2U9UG9ydCB7MH0gcmVxdWlyZWQgYnkgezF9IGlzIGFscmVhZHkgaW4gdXNlLiBUaGUgc2VydmVyIG1heSBhbHJlYWR5IGJlIHJ1bm5pbmcgaW4gYW5vdGhlciBwcm9jZXNzLCBvciBhIHN5c3RlbSBwcm9jZXNzIG1heSBiZSB1c2luZyB0aGUgcG9ydC4gXAotICBUbyBzdGFydCB0aGlzIHNlcnZlciB5b3Ugd2lsbCBuZWVkIHRvIHN0b3AgdGhlIG90aGVyIHByb2Nlc3Mgb3IgY2hhbmdlIHRoZSBwb3J0IG51bWJlcihzKS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1BpbmdUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUGluZ1RocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDZhMGRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUGluZ1RocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLS8qKgotICogVGhyZWFkIHVzZWQgdG8gcGluZyBzZXJ2ZXIgdG8gdGVzdCB3aGVuIGl0IGlzIHN0YXJ0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQaW5nVGhyZWFkIHsKLQkvLyBkZWxheSBiZWZvcmUgcGluZ2luZyBzdGFydHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19ERUxBWSA9IDIwMDA7Ci0KLQkvLyBkZWxheSBiZXR3ZWVuIHBpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJTkdfSU5URVJWQUwgPSAyNTA7Ci0KLQkvLyBtYXhpbXVtIG51bWJlciBvZiBwaW5ncyBiZWZvcmUgZ2l2aW5nIHVwCi0JcHJpdmF0ZSBpbnQgbWF4UGluZ3M7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3RvcCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQlwcml2YXRlIElTZXJ2ZXIgc2VydmVyOwotCXByaXZhdGUgUHJldmlld1NlcnZlckJlaGF2aW91ciBiZWhhdmlvdXI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgUGluZ1RocmVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyCi0JICogQHBhcmFtIHVybAotCSAqIEBwYXJhbSBiZWhhdmlvdXIKLQkgKi8KLQlwdWJsaWMgUGluZ1RocmVhZChJU2VydmVyIHNlcnZlciwgU3RyaW5nIHVybCwgUHJldmlld1NlcnZlckJlaGF2aW91ciBiZWhhdmlvdXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMudXJsID0gdXJsOwotCQl0aGlzLmJlaGF2aW91ciA9IGJlaGF2aW91cjsKLQkJdGhpcy5tYXhQaW5ncyA9IGd1ZXNzTWF4UGluZ3MoKTsKLQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCJQcmV2aWV3IFBpbmcgVGhyZWFkIikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXBpbmcoKTsKLQkJCX0KLQkJfTsKLQkJdC5zZXREYWVtb24odHJ1ZSk7Ci0JCXQuc3RhcnQoKTsKLQl9Ci0KLQlwcml2YXRlIGludCBndWVzc01heFBpbmdzKCkgewotCQlpbnQgc3RhcnRUaW1lb3V0ID0gKChTZXJ2ZXIpc2VydmVyKS5nZXRTdGFydFRpbWVvdXQoKSAqIDEwMDA7Ci0JCWlmIChzdGFydFRpbWVvdXQgPiAwKQotCQkJcmV0dXJuIHN0YXJ0VGltZW91dCAvIFBJTkdfSU5URVJWQUw7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBQaW5nIHRoZSBzZXJ2ZXIgdW50aWwgaXQgaXMgc3RhcnRlZC4gVGhlbiBzZXQgdGhlIHNlcnZlcgotCSAqIHN0YXRlIHRvIFNUQVRFX1NUQVJURUQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGluZygpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChQSU5HX0RFTEFZKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXdoaWxlICghc3RvcCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoY291bnQgPT0gbWF4UGluZ3MpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNlcnZlci5zdG9wKGZhbHNlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IGNvdWxkIG5vdCBzdG9wIHNlcnZlciIpOwotCQkJCQl9Ci0JCQkJCXN0b3AgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY291bnQrKzsKLQkJCQkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBwaW5naW5nICIgKyBjb3VudCk7Ci0JCQkJVVJMIHBpbmdVcmwgPSBuZXcgVVJMKHVybCk7Ci0JCQkJVVJMQ29ubmVjdGlvbiBjb25uID0gcGluZ1VybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCSgoSHR0cFVSTENvbm5lY3Rpb24pY29ubikuZ2V0UmVzcG9uc2VDb2RlKCk7Ci0JCi0JCQkJLy8gcGluZyB3b3JrZWQgLSBzZXJ2ZXIgaXMgdXAKLQkJCQlpZiAoIXN0b3ApIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogc3VjY2VzcyIpOwotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQkJYmVoYXZpb3VyLnNldFNlcnZlclN0YXJ0ZWQoKTsKLQkJCQl9Ci0JCQkJc3RvcCA9IHRydWU7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZmUpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQkJYmVoYXZpb3VyLnNldFNlcnZlclN0YXJ0ZWQoKTsKLQkJCQlzdG9wID0gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogZmFpbGVkIik7Ci0JCQkJLy8gcGluZ2luZyBmYWlsZWQKLQkJCQlpZiAoIXN0b3ApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVRocmVhZC5zbGVlcChQSU5HX0lOVEVSVkFMKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTIpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVsbCB0aGUgcGluZ2luZyB0byBzdG9wLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHN0b3BwaW5nIik7Ci0JCXN0b3AgPSB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld0xhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzk4YmQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld0xhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgZXh0ZW5kcyBMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFUVVJUkVEX0JVTkRMRV9JRFMgPSBuZXcgU3RyaW5nW10gewotCQkib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmciLAotCQkiamF2YXguc2VydmxldCIsCi0JCSJqYXZheC5zZXJ2bGV0LmpzcCIsCi0JCSJvcmcubW9ydGJheS5qZXR0eSIsCi0JCSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXciCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGZnQ2FuZGlkYXRlSmF2YUZpbGVzID0geyJqYXZhdyIsICJqYXZhdy5leGUiLCAiamF2YSIsCi0JCSJqYXZhLmV4ZSIsICJqOXciLCAiajl3LmV4ZSIsICJqOSIsICJqOS5leGUifTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBmZ0NhbmRpZGF0ZUphdmFMb2NhdGlvbnMgPSB7ImJpbiIgKyBGaWxlLnNlcGFyYXRvckNoYXIsCi0JCSJqcmUiICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgImJpbiIgKyBGaWxlLnNlcGFyYXRvckNoYXJ9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fQ0xBU1MgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmludGVybmFsLlByZXZpZXdTdGFydGVyIjsKLQotCXB1YmxpYyB2b2lkIGxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwgSUxhdW5jaCBsYXVuY2gsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWwuZ2V0U2VydmVyKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxhdW5jaCBjb25maWd1cmF0aW9uIGNvdWxkIG5vdCBmaW5kIHNlcnZlciIpOwotCQkJLy8gdGhyb3cgQ29yZUV4Y2VwdGlvbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoc2VydmVyLnNob3VsZFB1Ymxpc2goKSAmJiBTZXJ2ZXJDb3JlLmlzQXV0b1B1Ymxpc2hpbmcoKSkKLQkJCXNlcnZlci5wdWJsaXNoKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbW9uaXRvcik7Ci0JCQotCQlQcmV2aWV3U2VydmVyQmVoYXZpb3VyIHByZXZpZXdTZXJ2ZXIgPSAoUHJldmlld1NlcnZlckJlaGF2aW91cikgc2VydmVyLmxvYWRBZGFwdGVyKFByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIuY2xhc3MsIG51bGwpOwotCQkKLQkJaW50IHNpemUgPSBSRVFVSVJFRF9CVU5ETEVfSURTLmxlbmd0aDsKLQkJLy9TdHJpbmdbXSBqYXJzID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJU3RyaW5nQnVmZmVyIGNwID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQnVuZGxlIGIgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUkVRVUlSRURfQlVORExFX0lEU1tpXSk7Ci0JCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJCWlmIChiICE9IG51bGwpCi0JCQkJcGF0aCA9IFByZXZpZXdSdW50aW1lLmdldEphcnJlZFBsdWdpblBhdGgoYik7Ci0JCQlpZiAocGF0aCA9PSBudWxsKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJldmlld1BsdWdpbi5QTFVHSU5fSUQsICJDb3VsZCBub3QgZmluZCByZXF1aXJlZCBidW5kbGUgIiArIFJFUVVJUkVEX0JVTkRMRV9JRFNbaV0pKTsKLQkJCQotCQkJaWYgKGkgPT0gNCAmJiBwYXRoLmFwcGVuZCgiYmluIikudG9GaWxlKCkuZXhpc3RzKCkpCi0JCQkJcGF0aCA9IHBhdGguYXBwZW5kKCJiaW4iKTsKLQkJCQotCQkJaWYgKGkgPiAwKQotCQkJCWNwLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3IpOwotCQkJY3AuYXBwZW5kKHBhdGgudG9PU1N0cmluZygpKTsKLQkJfQotCQkKLQkJTGlzdDxTdHJpbmc+IGNtZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCS8vIGpyZQotCQlGaWxlIGphdmEgPSBnZXRKYXZhRXhlY3V0YWJsZSgpOwotCQlpZiAoamF2YSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgIkNvdWxkIG5vdCBmaW5kIEpSRSBleGVjdXRhYmxlIikpOwotCQkKLQkJY21kcy5hZGQoamF2YS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQotCQljbWRzLmFkZCgiLWNsYXNzcGF0aCIpOwotCQljbWRzLmFkZChjcC50b1N0cmluZygpKTsKLQkJCi0JCWNtZHMuYWRkKE1BSU5fQ0xBU1MpOwotCQkKLQkJY21kcy5hZGQocHJldmlld1NlcnZlci5nZXRUZW1wRGlyZWN0b3J5KCkuYXBwZW5kKCJwcmV2aWV3LnhtbCIpLnRvT1NTdHJpbmcoKSk7Ci0JCQotCQkvL3NldERlZmF1bHRTb3VyY2VMb2NhdG9yKGxhdW5jaCwgY29uZmlndXJhdGlvbik7Ci0JCQotCQkvLyBsYXVuY2ggdGhlIGNvbmZpZ3VyYXRpb24KLQkJcHJldmlld1NlcnZlci5zZXR1cExhdW5jaChsYXVuY2gsIG1vZGUsIG1vbml0b3IpOwotCQkKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIGNtZExpbmUgPSBuZXcgU3RyaW5nW2NtZHMuc2l6ZSgpXTsKLQkJCWNtZHMudG9BcnJheShjbWRMaW5lKTsKLQkJCVByb2Nlc3MgcCA9IERlYnVnUGx1Z2luLmV4ZWMoY21kTGluZSwgbnVsbCk7Ci0JCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJSVByb2Nlc3MgcHIgPSBEZWJ1Z1BsdWdpbi5uZXdQcm9jZXNzKGxhdW5jaCwgcCwgY21kTGluZVswXSk7Ci0JCQkJcHIuc2V0QXR0cmlidXRlKElQcm9jZXNzLkFUVFJfQ01ETElORSwgcmVuZGVyQ29tbWFuZExpbmUoY21kTGluZSkpOwotCQkJCWxhdW5jaC5hZGRQcm9jZXNzKHByKTsKLQkJCQlwcmV2aWV3U2VydmVyLmFkZFByb2Nlc3NMaXN0ZW5lcihwcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJQcm9ibGVtIGNyZWF0aW5nIHByZXZpZXcgcHJvY2VzcyIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlcGFyZXMgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2Ygc3RyaW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZExpbmUKLQkgKiBAcmV0dXJuIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcmVuZGVyQ29tbWFuZExpbmUoU3RyaW5nW10gY29tbWFuZExpbmUpIHsKLQkJaWYgKGNvbW1hbmRMaW5lLmxlbmd0aCA8IDEpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY29tbWFuZExpbmUubGVuZ3RoOyBpKyspIHsKLQkJCWJ1Zi5hcHBlbmQoJyAnKTsKLQkJCWNoYXJbXSBjaGFyYWN0ZXJzPSBjb21tYW5kTGluZVtpXS50b0NoYXJBcnJheSgpOwotCQkJU3RyaW5nQnVmZmVyIGNvbW1hbmQ9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gY29udGFpbnNTcGFjZT0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNoYXJhY3RlcnMubGVuZ3RoOyBqKyspIHsKLQkJCQljaGFyIGNoYXJhY3Rlcj0gY2hhcmFjdGVyc1tqXTsKLQkJCQlpZiAoY2hhcmFjdGVyID09ICdcIicpIHsKLQkJCQkJY29tbWFuZC5hcHBlbmQoJ1xcJyk7Ci0JCQkJfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT0gJyAnKSB7Ci0JCQkJCWNvbnRhaW5zU3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCQljb21tYW5kLmFwcGVuZChjaGFyYWN0ZXIpOwotCQkJfQotCQkJaWYgKGNvbnRhaW5zU3BhY2UpIHsKLQkJCQlidWYuYXBwZW5kKCdcIicpOwotCQkJCWJ1Zi5hcHBlbmQoY29tbWFuZC50b1N0cmluZygpKTsKLQkJCQlidWYuYXBwZW5kKCdcIicpOwotCQkJfSBlbHNlIHsKLQkJCQlidWYuYXBwZW5kKGNvbW1hbmQudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0JCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZpbGUgZ2V0SmF2YUV4ZWN1dGFibGUoKSB7Ci0JCS8vIGRvIG5vdCBkZXRlY3Qgb24gdGhlIE1hYyBPUwotCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoQ29uc3RhbnRzLk9TX01BQ09TWCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vIHJldHJpZXZlIHRoZSAnamF2YS5ob21lJyBzeXN0ZW0gcHJvcGVydHkuIElmIHRoYXQgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIHJldHVybiBudWxsCi0JCUZpbGUgamF2YUhvbWU7IAotCQl0cnkgewotCQkJamF2YUhvbWUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpKS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghamF2YUhvbWUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vIGZpbmQgdGhlICdqYXZhJyBleGVjdXRhYmxlIGZpbGUgdW5kZXIgdGhlIGphdmEgaG9tZSBkaXJlY3RvcnkuIElmIGl0IGNhbid0IGJlCi0JCS8vIGZvdW5kLCByZXR1cm4gbnVsbAotCQlyZXR1cm4gZmluZEphdmFFeGVjdXRhYmxlKGphdmFIb21lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZpbGUgZmluZEphdmFFeGVjdXRhYmxlKEZpbGUgdm1JbnN0YWxsTG9jYXRpb24pIHsKLQkJLy8gdHJ5IGVhY2ggY2FuZGlkYXRlIGluIG9yZGVyLCB0aGUgZmlyc3Qgb25lIGZvdW5kIHdpbnMuIFRodXMsIHRoZSBvcmRlcgotCQkvLyBvZiBmZ0NhbmRpZGF0ZUphdmFMb2NhdGlvbnMgYW5kIGZnQ2FuZGlkYXRlSmF2YUZpbGVzIGlzIHNpZ25pZmljYW50Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdDYW5kaWRhdGVKYXZhRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmdDYW5kaWRhdGVKYXZhTG9jYXRpb25zLmxlbmd0aDsgaisrKSB7Ci0JCQkJRmlsZSBqYXZhRmlsZSA9IG5ldyBGaWxlKHZtSW5zdGFsbExvY2F0aW9uLCBmZ0NhbmRpZGF0ZUphdmFMb2NhdGlvbnNbal0gKyBmZ0NhbmRpZGF0ZUphdmFGaWxlc1tpXSk7Ci0JCQkJaWYgKGphdmFGaWxlLmlzRmlsZSgpKSB7Ci0JCQkJCXJldHVybiBqYXZhRmlsZTsKLQkJCQl9CQkJCQotCQkJfQotCQl9CQkKLQkJcmV0dXJuIG51bGw7CQkJCQkJCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMWQ5ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3TGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5IdHRwTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5XZWJSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIFByZXZpZXdMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIGV4dGVuZHMgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSB7Ci0JLyoKLQkgKiBAc2VlIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUjZ2V0TGF1bmNoYWJsZShJU2VydmVyLCBJTW9kdWxlQXJ0aWZhY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXVuY2hhYmxlKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsIHx8IG1vZHVsZUFydGlmYWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVByZXZpZXdTZXJ2ZXIgc2VydmVyMiA9IChQcmV2aWV3U2VydmVyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoUHJldmlld1NlcnZlci5jbGFzcywgbnVsbCk7Ci0JCWlmIChzZXJ2ZXIyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gc2VydmVyMi5nZXRNb2R1bGVSb290VVJMKG1vZHVsZUFydGlmYWN0LmdldE1vZHVsZSgpKTsKLQkJCQotCQkJaWYgKG1vZHVsZUFydGlmYWN0IGluc3RhbmNlb2YgV2ViUmVzb3VyY2UpIHsKLQkJCQlXZWJSZXNvdXJjZSByZXNvdXJjZSA9IChXZWJSZXNvdXJjZSkgbW9kdWxlQXJ0aWZhY3Q7Ci0JCQkJU3RyaW5nIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQkKLQkJCQlpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpCi0JCQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLQkJCQl1cmwgPSBuZXcgVVJMKHVybC50b0V4dGVybmFsRm9ybSgpICsgIi8iICsgcGF0aCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEh0dHBMYXVuY2hhYmxlKHVybCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBpbiBsYXVuY2hhYmxlIGFkYXB0ZXIiLCBlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1BsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNGFjOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotLyoqCi0gKiBUaGUgSFRUUCBzZXJ2ZXIgY29yZSBwbHVnaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgUHJldmlld1BsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgUHJldmlld1BsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJldmlld1BsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluc3RhbGwgbG9jYXRpb24gcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBydW50aW1lIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YWxsIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoaWQpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgaW5zdGFsbCBsb2NhdGlvbiBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgcnVudGltdCB0eXBlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcmVmZXJlbmNlKFN0cmluZyBpZCwgU3RyaW5nIHZhbHVlKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShpZCwgdmFsdWUpOwotCQlnZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3UnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmJlYzIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1J1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLS8qKgotICogSFRUUCBwcmV2aWV3IHJ1bnRpbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3UnVudGltZSBleHRlbmRzIFJ1bnRpbWVEZWxlZ2F0ZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LnJ1bnRpbWUiOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHByZXZpZXcgcnVudGltZS4KLQkgKi8KLQlwdWJsaWMgUHJldmlld1J1bnRpbWUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHNwZWNpZmllZCBidW5kbGUuCi0JICogCi0JICogQHJldHVybiBhIHBhdGgKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFBhdGggZ2V0UGx1Z2luUGF0aChCdW5kbGUgYnVuZGxlKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIGxvY2FsVVJMID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKGluc3RhbGxVUkwpOwotCQkJcmV0dXJuIG5ldyBQYXRoKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElQYXRoIGdldEphcnJlZFBsdWdpblBhdGgoQnVuZGxlIGJ1bmRsZSkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gRmlsZUxvY2F0b3IuZ2V0QnVuZGxlRmlsZShidW5kbGUpOwotCQkJcmV0dXJuIG5ldyBQYXRoKGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCByZXR1cm4gbnVsbAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZSgpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkgJiYgc3RhdHVzLmdldE1lc3NhZ2UoKS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gc3RhdHVzOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1NlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczN2I5OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVVSTFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5JU3RhdGljV2ViOwotLyoqCi0gKiBIVFRQIHByZXZpZXcgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgUHJldmlld1NlcnZlciBleHRlbmRzIFNlcnZlckRlbGVnYXRlIGltcGxlbWVudHMgSVVSTFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuc2VydmVyIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1BPUlQgPSAicG9ydCI7Ci0KLQkvKioKLQkgKiBQcmV2aWV3U2VydmVyLgotCSAqLwotCXB1YmxpYyBQcmV2aWV3U2VydmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgUHJldmlld1J1bnRpbWUgZ2V0UHJldmlld1J1bnRpbWUoKSB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIChQcmV2aWV3UnVudGltZSkgZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmxvYWRBZGFwdGVyKFByZXZpZXdSdW50aW1lLmNsYXNzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvb3QgVVJMIG9mIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcmV0dXJuIGphdmEubmV0LlVSTAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TW9kdWxlUm9vdFVSTChJTW9kdWxlIG1vZHVsZSkgewotCQl0cnkgewotCQkJU3RyaW5nIGJhc2UgPSAiaHR0cDovL2xvY2FsaG9zdCI7Ci0JCQkKLQkJCWludCBwb3J0ID0gZ2V0UG9ydCgpOwotCQkJVVJMIHVybCA9IG51bGw7Ci0JCQlpZiAocG9ydCA9PSA4MCkKLQkJCQl1cmwgPSBuZXcgVVJMKGJhc2UgKyAiLyIpOwotCQkJZWxzZQotCQkJCXVybCA9IG5ldyBVUkwoYmFzZSArICI6IiArIHBvcnQgKyAiLyIpOwotCQkJCi0JCQlTdHJpbmcgdHlwZSA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKTsKLQkJCWlmICgid3N0LndlYiIuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJSVN0YXRpY1dlYiBzdGF0aWNXZWIgPSAoSVN0YXRpY1dlYikgbW9kdWxlLmxvYWRBZGFwdGVyKElTdGF0aWNXZWIuY2xhc3MsIG51bGwpOwotCQkJCXJldHVybiBuZXcgVVJMKHVybCwgc3RhdGljV2ViLmdldENvbnRleHRSb290KCkpOwotCQkJfQotCQkJcmV0dXJuIHVybDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgcm9vdCBVUkwiLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGUocykgb2YgdGhpcyBtb2R1bGUuCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSByb290IG1vZHVsZShzKSBvZiB0aGlzIG1vZHVsZS4KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldFJvb3RNb2R1bGVzKElNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwcm9qZWN0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHNlcnZlciwgYW5kIGZhbHNlCi0JICogb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGQgbW9kdWxlcwotCSAqIEBwYXJhbSByZW1vdmUgbW9kdWxlcwotCSAqIEByZXR1cm4gdGhlIHN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbk1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSkgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuY2FuTW9kaWZ5TW9kdWxlcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIFNlcnZlclBvcnRbXSBnZXRTZXJ2ZXJQb3J0cygpIHsKLQkJaW50IHBvcnQgPSBnZXRQb3J0KCk7Ci0JCVNlcnZlclBvcnRbXSBwb3J0cyA9IHsgbmV3IFNlcnZlclBvcnQoImh0dHAiLCBNZXNzYWdlcy5odHRwUG9ydCwgcG9ydCwgImh0dHAiKSB9OwotCQlyZXR1cm4gcG9ydHM7Ci0JfQotCi0JcHVibGljIGludCBnZXRQb3J0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFByZXZpZXdTZXJ2ZXIuUFJPUEVSVFlfUE9SVCwgODA4MCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgewotCQlzZXRBdHRyaWJ1dGUoUHJldmlld1NlcnZlci5QUk9QRVJUWV9QT1JULCBwb3J0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgY3JlYXRlUHJldmlld1NlcnZlcihTdHJpbmcgc2VydmVyTmFtZSkgewotCQl0cnkgewotCQkJTnVsbFByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKFByZXZpZXdSdW50aW1lLklEKTsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZUNvcHkgPSBydW50aW1lVHlwZS5jcmVhdGVSdW50aW1lKFByZXZpZXdSdW50aW1lLklELCBtb25pdG9yKTsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBydW50aW1lQ29weS5zYXZlKHRydWUsIG1vbml0b3IpOwotCQkJCi0JCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShJRCk7Ci0JCQlJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihJRCwgbnVsbCwgcnVudGltZSwgbW9uaXRvcik7Ci0JCQl3b3JraW5nQ29weS5zZXROYW1lKHNlcnZlck5hbWUpOwotCQkJd29ya2luZ0NvcHkuc2V0SG9zdCgibG9jYWxob3N0Iik7Ci0JCQlyZXR1cm4gd29ya2luZ0NvcHkuc2F2ZSh0cnVlLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNyZWF0aW5nIHNlcnZlciIsIGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZmluZFByZXZpZXdTZXJ2ZXIoU3RyaW5nIGlkKSB7Ci0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWZvciAoSVNlcnZlciBzZXJ2ZXIgOiBzZXJ2ZXJzKSB7Ci0JCQlpZiAoc2VydmVyLmdldElkKCkuZXF1YWxzKGlkKSkKLQkJCQlyZXR1cm4gc2VydmVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJQcmV2aWV3U2VydmVyIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U2VydmVyQmVoYXZpb3VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwZjVlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1ByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSURlYnVnRXZlbnRTZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5JU3RhdGljV2ViOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlByb2plY3RNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLS8qKgotICogUHJldmlldyBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3U2VydmVyQmVoYXZpb3VyIGV4dGVuZHMgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUgewotCS8vIHRoZSB0aHJlYWQgdXNlZCB0byBwaW5nIHRoZSBzZXJ2ZXIgdG8gY2hlY2sgZm9yIHN0YXJ0dXAKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IFBpbmdUaHJlYWQgcGluZyA9IG51bGw7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBJRGVidWdFdmVudFNldExpc3RlbmVyIHByb2Nlc3NMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFByZXZpZXdTZXJ2ZXIuCi0JICovCi0JcHVibGljIFByZXZpZXdTZXJ2ZXJCZWhhdmlvdXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBQcmV2aWV3UnVudGltZSBnZXRQcmV2aWV3UnVudGltZSgpIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIChQcmV2aWV3UnVudGltZSkgZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmxvYWRBZGFwdGVyKFByZXZpZXdSdW50aW1lLmNsYXNzLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgUHJldmlld1NlcnZlciBnZXRQcmV2aWV3U2VydmVyKCkgewotCQlyZXR1cm4gKFByZXZpZXdTZXJ2ZXIpIGdldFNlcnZlcigpLmdldEFkYXB0ZXIoUHJldmlld1NlcnZlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBiYXNlIHBhdGggZm9yIHJlbGF0aXZlIHBhdGhzIGluIHRoZSBzZXJ2ZXIKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgcGF0aAotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFNldHVwIGZvciBzdGFydGluZyB0aGUgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2ggSUxhdW5jaAotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIFN0cmluZwotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwTGF1bmNoKElMYXVuY2ggbGF1bmNoLCBTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGNoZWNrIHRoYXQgcG9ydHMgYXJlIGZyZWUKLQkJU2VydmVyUG9ydFtdIHBvcnRzID0gZ2V0UHJldmlld1NlcnZlcigpLmdldFNlcnZlclBvcnRzKCk7Ci0JCWludCBwb3J0ID0gcG9ydHNbMF0uZ2V0UG9ydCgpOwotCQkKLQkJaWYgKFNvY2tldFV0aWwuaXNQb3J0SW5Vc2UocG9ydCwgNSkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByZXZpZXdQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclBvcnRJblVzZSwgbmV3IFN0cmluZ1tdIHtwb3J0ICsgIiIsIGdldFNlcnZlcigpLmdldE5hbWUoKX0pLCBudWxsKSk7Ci0JCQotCQkvLyBnZW5lcmF0ZSBwcmV2aWV3IGNvbmZpZyBmaWxlCi0JCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJzZXJ2ZXIiKTsKLQkJbWVtZW50by5wdXRJbnRlZ2VyKCJwb3J0IiwgcG9ydCk7Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlcyA9IGdldFNlcnZlcigpLmdldE1vZHVsZXMoKTsKLQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IG1vZHVsZXMpIHsKLQkJCUlNZW1lbnRvIG1vZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoIm1vZHVsZSIpOwotCQkJbW9kLnB1dFN0cmluZygibmFtZSIsIG1vZHVsZS5nZXROYW1lKCkpOwotCQkJU3RyaW5nIHR5cGUgPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCk7Ci0JCQlpZiAoIndzdC53ZWIiLmVxdWFscyh0eXBlKSkgewotCQkJCUlTdGF0aWNXZWIgc3RhdGljV2ViID0gKElTdGF0aWNXZWIpIG1vZHVsZS5sb2FkQWRhcHRlcihJU3RhdGljV2ViLmNsYXNzLCBudWxsKTsKLQkJCQlpZiAoc3RhdGljV2ViICE9IG51bGwpCi0JCQkJCW1vZC5wdXRTdHJpbmcoImNvbnRleHQiLCBzdGF0aWNXZWIuZ2V0Q29udGV4dFJvb3QoKSk7Ci0JCQkJbW9kLnB1dFN0cmluZygidHlwZSIsICJzdGF0aWMiKTsKLQkJCX0KLQkJCW1vZC5wdXRTdHJpbmcoInBhdGgiLCBnZXRNb2R1bGVQdWJsaXNoRGlyZWN0b3J5KG1vZHVsZSkudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJfQotCQl0cnkgewotCQkJbWVtZW50by5zYXZlVG9GaWxlKGdldFRlbXBEaXJlY3RvcnkoKS5hcHBlbmQoInByZXZpZXcueG1sIikudG9PU1N0cmluZygpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHdyaXRlIHByZXZpZXcgY29uZmlnIiwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByZXZpZXdQbHVnaW4uUExVR0lOX0lELCAwLCAiQ291bGQgbm90IHdyaXRlIHByZXZpZXcgY29uZmlndXJhdGlvbiIsIG51bGwpKTsKLQkJfQotCQkKLQkJc2V0U2VydmVyUmVzdGFydFN0YXRlKGZhbHNlKTsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVElORyk7Ci0JCXNldE1vZGUobGF1bmNoTW9kZSk7Ci0JCQotCQkvLyBwaW5nIHNlcnZlciB0byBjaGVjayBmb3Igc3RhcnR1cAotCQl0cnkgewotCQkJU3RyaW5nIHVybCA9ICJodHRwOi8vbG9jYWxob3N0IjsKLQkJCWlmIChwb3J0ICE9IDgwKQotCQkJCXVybCArPSAiOiIgKyBwb3J0OwotCQkJcGluZyA9IG5ldyBQaW5nVGhyZWFkKGdldFNlcnZlcigpLCB1cmwsIHRoaXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ2FuJ3QgcGluZyBmb3IgVG9tY2F0IHN0YXJ0dXAuIik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9jZXNzTGlzdGVuZXIoZmluYWwgSVByb2Nlc3MgbmV3UHJvY2VzcykgewotCQlpZiAocHJvY2Vzc0xpc3RlbmVyICE9IG51bGwgfHwgbmV3UHJvY2VzcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJcHJvY2Vzc0xpc3RlbmVyID0gbmV3IElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10gZXZlbnRzKSB7Ci0JCQkJaWYgKGV2ZW50cyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoRGVidWdFdmVudCBldmVudCA6IGV2ZW50cykgewotCQkJCQkJaWYgKG5ld1Byb2Nlc3MgIT0gbnVsbCAmJiBuZXdQcm9jZXNzLmVxdWFscyhldmVudC5nZXRTb3VyY2UoKSkgJiYgZXZlbnQuZ2V0S2luZCgpID09IERlYnVnRXZlbnQuVEVSTUlOQVRFKSB7Ci0JCQkJCQkJc3RvcCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZERlYnVnRXZlbnRMaXN0ZW5lcihwcm9jZXNzTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNlcnZlclN0YXJ0ZWQoKSB7Ci0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaFNlcnZlcihpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJbW9uaXRvci5kb25lKCk7Ci0KLQkJc2V0U2VydmVyUHVibGlzaFN0YXRlKElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKTsKLQl9Ci0KLQkvKgotCSAqIFB1Ymxpc2hlcyB0aGUgZ2l2ZW4gbW9kdWxlIHRvIHRoZSBzZXJ2ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaE1vZHVsZShpbnQga2luZCwgaW50IGRlbHRhS2luZCwgSU1vZHVsZVtdIG1vZHVsZVRyZWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZVRyZWVbbW9kdWxlVHJlZS5sZW5ndGggLSAxXTsKLQkJaWYgKGlzU2luZ2xlUm9vdFN0cnVjdHVyZShtb2R1bGUpKQotCQkJcmV0dXJuOwotCQkKLQkJSVBhdGggdG8gPSBnZXRNb2R1bGVQdWJsaXNoRGlyZWN0b3J5KG1vZHVsZSk7Ci0JCQotCQlpZiAoa2luZCA9PSBJU2VydmVyLlBVQkxJU0hfQ0xFQU4gfHwgZGVsdGFLaW5kID09IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLlJFTU9WRUQpIHsKLQkJCUlTdGF0dXNbXSBzdGF0dXMgPSBQdWJsaXNoVXRpbC5kZWxldGVEaXJlY3RvcnkodG8udG9GaWxlKCksIG1vbml0b3IpOwotCQkJdGhyb3dFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCQkKLQkJSU1vZHVsZVJlc291cmNlW10gcmVzID0gZ2V0UmVzb3VyY2VzKG1vZHVsZVRyZWUpOwotCQlJU3RhdHVzW10gc3RhdHVzID0gUHVibGlzaFV0aWwucHVibGlzaFNtYXJ0KHJlcywgdG8sIG1vbml0b3IpOwotCQl0aHJvd0V4Y2VwdGlvbihzdGF0dXMpOwotCQkKLQkJc2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZVRyZWUsIElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byB0aHJvdyBhIENvcmVFeGNlcHRpb24gYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIGEgbGlzdCBvZgotCSAqIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzIGEgTGlzdCBjb250YWluaW5nIGVycm9yIGFuZCB3YXJuaW5nIElTdGF0dXMKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uKElTdGF0dXNbXSBzdGF0dXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChzdGF0dXMubGVuZ3RoID09IDEpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXNbMF0pOwotCQkKLQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lcnJvclB1Ymxpc2g7Ci0JCU11bHRpU3RhdHVzIHN0YXR1czIgPSBuZXcgTXVsdGlTdGF0dXMoUHJldmlld1BsdWdpbi5QTFVHSU5fSUQsIDAsIHN0YXR1cywgbWVzc2FnZSwgbnVsbCk7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1czIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVE9QUEVEKTsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVEVEKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhbmx5IHNodXRzIGRvd24gYW5kIHRlcm1pbmF0ZXMgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2UgPGNvZGU+dHJ1ZTwvY29kZT4gdG8ga2lsbCB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlKSB7Ci0JCWludCBzdGF0ZSA9IGdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCk7Ci0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm47Ci0JCQotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQSU5HKTsKLQkJCi0JCWlmIChwaW5nICE9IG51bGwpIHsKLQkJCXBpbmcuc3RvcCgpOwotCQkJcGluZyA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChwcm9jZXNzTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZURlYnVnRXZlbnRMaXN0ZW5lcihwcm9jZXNzTGlzdGVuZXIpOwotCQkJcHJvY2Vzc0xpc3RlbmVyID0gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIktpbGxpbmcgdGhlIHByb2Nlc3MiKTsKLQkJCUlMYXVuY2ggbGF1bmNoID0gZ2V0U2VydmVyKCkuZ2V0TGF1bmNoKCk7Ci0JCQlpZiAobGF1bmNoICE9IG51bGwpCi0JCQkJbGF1bmNoLnRlcm1pbmF0ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Iga2lsbGluZyB0aGUgcHJvY2VzcyIsIGUpOwotCQl9Ci0JCQotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQRUQpOwotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBnZXRUZW1wRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0VGVtcERpcmVjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSBpbiB0aGUgd29ya3NwYWNlIGhhcyBhIHNpbmdsZQotCSAqIHJvb3Qgc3RydWN0dXJlIC0gaS5lLiBtYXRjaGVzIHRoZSBzcGVjIGRpc2sgbGF5b3V0IC0gYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2R1bGUgaW4gdGhlIHdvcmtzcGFjZSBoYXMgYSBzaW5nbGUKLQkgKiAgICByb290IHN0cnVjdHVyZSAtIGkuZS4gbWF0Y2hlcyB0aGUgc3BlYyBkaXNrIGxheW91dCAtIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpbmdsZVJvb3RTdHJ1Y3R1cmUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJUHJvamVjdE1vZHVsZSBwbSA9IChQcm9qZWN0TW9kdWxlKSBtb2R1bGUubG9hZEFkYXB0ZXIoUHJvamVjdE1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCWlmIChwbSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHBtLmlzU2luZ2xlUm9vdFN0cnVjdHVyZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSdzIHB1Ymxpc2ggcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHJldHVybiB0aGUgcHVibGlzaCBkaXJlY3RvcnkgZm9yIHRoZSBtb2R1bGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0TW9kdWxlUHVibGlzaERpcmVjdG9yeShJTW9kdWxlIG1vZHVsZSkgewotCQlpZiAoaXNTaW5nbGVSb290U3RydWN0dXJlKG1vZHVsZSkpIHsKLQkJCUlTdGF0aWNXZWIgd2ViTW9kdWxlID0gKElTdGF0aWNXZWIpIG1vZHVsZS5sb2FkQWRhcHRlcihJU3RhdGljV2ViLmNsYXNzLCBudWxsKTsKLQkJCWlmICh3ZWJNb2R1bGUgIT0gbnVsbCkgewotCQkJCS8vSUNvbnRhaW5lcltdIG1vZHVsZUZvbGRlciA9IHdlYk1vZHVsZS5nZXRSZXNvdXJjZUZvbGRlcnMoKTsKLQkJCQkvL2lmIChtb2R1bGVGb2xkZXIgIT0gbnVsbCAmJiBtb2R1bGVGb2xkZXIubGVuZ3RoID4gMCkKLQkJCQkvLwlyZXR1cm4gbW9kdWxlRm9sZGVyWzBdLmdldExvY2F0aW9uKCk7CQkJCQkJCQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0VGVtcERpcmVjdG9yeSgpLmFwcGVuZChtb2R1bGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJQcmV2aWV3U2VydmVyIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEobW9kdWxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U3RhcnR1cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9QcmV2aWV3U3RhcnR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjc5MmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJldmlld1N0YXJ0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU3RhcnR1cDsKLQotcHVibGljIGNsYXNzIFByZXZpZXdTdGFydHVwIGltcGxlbWVudHMgSVN0YXJ0dXAgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJ4eXoiOyAKLQotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCS8vIGNyZWF0ZSBydW50aW1lCi0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSBudWxsOwotCQkKLQkJZm9yIChJUnVudGltZSByIDogcnVudGltZXMpIHsKLQkJCWlmIChyLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCAmJiBQcmV2aWV3UnVudGltZS5JRC5lcXVhbHMoci5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpKSB7Ci0JCQkJaWYgKElELmVxdWFscyhyLmdldElkKCkpKQotCQkJCQlydW50aW1lID0gcjsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lVHlwZShQcmV2aWV3UnVudGltZS5JRCk7Ci0JCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUoSUQsIG51bGwpOwotCQkJCXdjLnNldE5hbWUoIk15IFByZXZpZXciKTsKLQkJCQl3Yy5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQlydW50aW1lID0gd2Muc2F2ZSh0cnVlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGNyZWF0ZSBkZWZhdWx0IHByZXZpZXcgcnVudGltZSIpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBjcmVhdGUgc2VydmVyCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoSVNlcnZlciBzIDogc2VydmVycykgewotCQkJaWYgKHMuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgUHJldmlld1NlcnZlci5JRC5lcXVhbHMocy5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSkpIHsKLQkJCQlpZiAoSUQuZXF1YWxzKHMuZ2V0SWQoKSkpCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCFmb3VuZCkgewotCQkJdHJ5IHsKLQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShQcmV2aWV3U2VydmVyLklEKTsKLQkJCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihJRCwgbnVsbCwgcnVudGltZSwgbnVsbCk7Ci0JCQkJd2Muc2V0TmFtZSgiTXkgcHJldmlldyIpOwotCQkJCXdjLnNldEhvc3QoImxvY2FsaG9zdCIpOwotCQkJCXdjLnNldFJlYWRPbmx5KHRydWUpOwotCQkJCXdjLnNhdmUodHJ1ZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBjcmVhdGUgZGVmYXVsdCBwcmV2aWV3IHNlcnZlciIpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJvZ3Jlc3NVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1Byb2dyZXNzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjc3YmVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvUHJvZ3Jlc3NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBQcm9ncmVzcyBNb25pdG9yIHV0aWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ncmVzc1V0aWwgewotCS8qKgotCSAqIFByb2dyZXNzVXRpbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgUHJvZ3Jlc3NVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZhbGlkIHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgaW50Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgYSBudW1iZXIgb2YgdGlja3MKLQkgKiBAcGFyYW0gc3R5bGUgYSBzdHlsZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcywgaW50IHN0eWxlKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzLCBzdHlsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWIxZjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9hZGFwdGVyL2ludGVybmFsL2NvcmUvVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmFkYXB0ZXIuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgQ09ORklHID0gMDsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgV0FSTklORyA9IDE7Ci0JcHVibGljIHN0YXRpYyBieXRlIFNFVkVSRSA9IDI7Ci0JcHVibGljIHN0YXRpYyBieXRlIEZJTkVTVCA9IDM7Ci0JcHVibGljIHN0YXRpYyBieXRlIEZJTkVSID0gNDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxldmVsTmFtZXMgPSBuZXcgU3RyaW5nW10geyAiQ09ORklHICAgIiwgIldBUk5JTkcgICIsCi0JCSJTRVZFUkUgICAiLCAiRklORVIgICAgIiwgIkZJTkVTVCAgICIgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoImRkL01NL3l5IEhIOm1tLnNzLlNTUyIpOwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKGxldmVsID09IFNFVkVSRSkKLQkJCVByZXZpZXdQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcmV2aWV3UGx1Z2luLlBMVUdJTl9JRCwgcywgdCkpOwotCQkKLQkJaWYgKCFQcmV2aWV3UGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybjsKLQkJCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoUHJldmlld1BsdWdpbi5QTFVHSU5fSUQpOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKGxldmVsTmFtZXNbbGV2ZWxdKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChzZGYuZm9ybWF0KG5ldyBEYXRlKCkpKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChzKTsKLQkJLy8gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oU2VydmVyQ29yZS5QTFVHSU5fSUQgKyAiLyIgKyAicmVzb3VyY2VzIik7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvY29yZS9YTUxNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1hNTE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3N2UzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC9jb3JlL1hNTE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLS8qKgotICogQSBNZW1lbnRvIGlzIGEgY2xhc3MgaW5kZXBlbmRlbnQgY29udGFpbmVyIGZvciBwZXJzaXN0ZW5jZQotICogaW5mby4gIEl0IGlzIGEgcmVmbGVjdGlvbiBvZiAzIHN0b3JhZ2UgcmVxdWlyZW1lbnRzLgotICoKLSAqIDEpICAgV2UgbmVlZCB0aGUgYWJpbGl0eSB0byBwZXJzaXN0IGFuIG9iamVjdCBhbmQgcmVzdG9yZSBpdC4gIAotICogMikgICBUaGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtYXkgYmUgYWJzZW50LiAgSWYgc28gd2Ugd291bGQgCi0gKiAgICAgIGxpa2UgdG8gc2tpcCB0aGUgb2JqZWN0IGFuZCBrZWVwIHJlYWRpbmcuIAotICogMykgICBUaGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtYXkgY2hhbmdlLiAgSWYgc28gdGhlIG5ldyBjbGFzcyAKLSAqICAgICAgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIHBlcnNpc3RlbmNlIGluZm8uCi0gKgotICogV2UgY291bGQgYXNrIHRoZSBvYmplY3RzIHRvIHNlcmlhbGl6ZSB0aGVtc2VsdmVzIGludG8gYW4gCi0gKiBPYmplY3RPdXRwdXRTdHJlYW0sIERhdGFPdXRwdXRTdHJlYW0sIG9yIEhhc2h0YWJsZS4gIEhvd2V2ZXIgCi0gKiBhbGwgb2YgdGhlc2UgYXBwcm9hY2hlcyBmYWlsIHRvIG1lZXQgdGhlIHNlY29uZCByZXF1aXJlbWVudC4KLSAqCi0gKiBNZW1lbnRvIHN1cHBvcnRzIGJpbmFyeSBwZXJzaXN0YW5jZSB3aXRoIGEgdmVyc2lvbiBJRC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTE1lbWVudG8gaW1wbGVtZW50cyBJTWVtZW50byB7Ci0JcHJpdmF0ZSBEb2N1bWVudCBmYWN0b3J5OwotCXByaXZhdGUgRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogQW5zd2VyIGEgbWVtZW50byBmb3IgdGhlIGRvY3VtZW50IGFuZCBlbGVtZW50LiAgRm9yIHNpbXBsaWNpdHkKLQkgKiB5b3Ugc2hvdWxkIHVzZSBjcmVhdGVSZWFkUm9vdCBhbmQgY3JlYXRlV3JpdGVSb290IHRvIGNyZWF0ZSB0aGUgaW5pdGlhbAotCSAqIG1lbWVudG9zIG9uIGEgZG9jdW1lbnQuCi0JICovCi0JcHJpdmF0ZSBYTUxNZW1lbnRvKERvY3VtZW50IGRvYywgRWxlbWVudCBlbCkgewotCQlmYWN0b3J5ID0gZG9jOwotCQllbGVtZW50ID0gZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNjcmVhdGVDaGlsZChTdHJpbmcpCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciBhIHJvb3QgbWVtZW50byBmb3Igd3JpdGluZyBhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIGEgdHlwZQotCSAqIEByZXR1cm4gYSBtZW1lbnRvCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVdyaXRlUm9vdChTdHJpbmcgdHlwZSkgewotCQlEb2N1bWVudCBkb2N1bWVudDsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpOwotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZG9jdW1lbnQsIGVsZW1lbnQpOyAgICAgICAgICAgIAotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludGVnZXIoU3RyaW5nIGtleSwgaW50IG4pIHsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcudmFsdWVPZihuKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgdGhpcyBNZW1lbnRvIHRvIGEgV3JpdGVyLgotCSAqIAotCSAqIEBwYXJhbSBvcyBhbiBvdXRwdXQgc3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7Ci0JCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGZhY3RvcnkpOwotCQl0cnkgewotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTgiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQiLCAiMiIpOwotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbWVtZW50byB0byB0aGUgZ2l2ZW4gZmlsZS4KLQkgKgotCSAqIEBwYXJhbSBmaWxlbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVRvRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gdyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpOwotCQkJc2F2ZSh3KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC91aS9QcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5hZGFwdGVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvYWRhcHRlci9pbnRlcm5hbC91aS9QcmV2aWV3TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGQ1MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2FkYXB0ZXIvaW50ZXJuYWwvdWkvUHJldmlld0xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuYWRhcHRlci5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci0vKioKLSAqIEEgZGVidWcgdGFiIGdyb3VwIGZvciBsYXVuY2hpbmcgdGhlIHByZXZpZXcgc2VydmVyLiAKLSAqLwotcHVibGljIGNsYXNzIFByZXZpZXdMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCB7Ci0JLyoKLQkgKiBAc2VlIElMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAjY3JlYXRlVGFicyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cgZGlhbG9nLCBTdHJpbmcgbW9kZSkgewotCQlJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdIHRhYnMgPSBuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbMl07Ci0JCXRhYnNbMF0gPSBuZXcgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYihuZXcgU3RyaW5nW10geyAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3IiB9KTsKLQkJdGFic1swXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCS8qdGFic1syXSA9IG5ldyBFbnZpcm9ubWVudFRhYigpOwotCQl0YWJzWzJdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsqLwotCQl0YWJzWzFdID0gbmV3IENvbW1vblRhYigpOwotCQl0YWJzWzFdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJc2V0VGFicyh0YWJzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhMmI3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlXzMuMC4wLmphcgotdGVtcC5mb2xkZXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZjgzOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcgcGx1Z2luCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDM3YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlNDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBOb3YgMTAgMTc6MTE6MzUgSFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIwODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSNUaHUgU2VwIDEzIDE1OjI1OjA2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gsKi50ZXN0c3VpdGUsKi5kZXBsb3ksKi5sb2NhdGlvbiwqLmV4ZWN1dGlvbiwqLmRhdGFwb29sLCouYXJ0aWZhY3QsKi5odG1sLCouc3ZnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTFhMDU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaHUgQXVnIDE2IDE3OjAwOjE1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTYwZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNTYXQgQXByIDIyIDE4OjM2OjE0IEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY2MWE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldzsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5pbnRlcm5hbC5QcmV2aWV3U2VydmVyUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5tb3J0YmF5LmpldHR5O2J1bmRsZS12ZXJzaW9uPSJbNS4xLjExLDYuMC4wKSIsCi0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmc7YnVuZGxlLXZlcnNpb249IlsxLjAuNCwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3OTM0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhMDgwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVByZXZpZXcgU2VydmVyIFN1cHBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZTgwNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIGlkPSJwcmV2aWV3IgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPgotICAgICAgPGFwcGxpY2F0aW9uIHZpc2libGU9ImZhbHNlIj4KLSAgICAgICAgIDxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5pbnRlcm5hbC5QcmV2aWV3QXBwbGljYXRpb24iLz4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvSU1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvSU1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlOGQ4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL0lNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5pbnRlcm5hbDsKLS8qKgotICogSW50ZXJmYWNlIHRvIGEgbWVtZW50byB1c2VkIGZvciBzYXZpbmcgdGhlIGltcG9ydGFudCBzdGF0ZSBvZiBhbiBvYmplY3QKLSAqIGluIGEgZm9ybSB0aGF0IGNhbiBiZSBwZXJzaXN0ZWQgaW4gdGhlIGZpbGUgc3lzdGVtLgotICogPHA+Ci0gKiBNZW1lbnRvcyB3ZXJlIGRlc2lnbmVkIHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgaW4gbWluZDoKLSAqIDxvbD4KLSAqICA8bGk+Q2VydGFpbiBvYmplY3RzIG5lZWQgdG8gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBwbGF0Zm9ybSBzZXNzaW9ucy4KLSAqICAgIDwvbGk+Ci0gKiAgPGxpPldoZW4gYW4gb2JqZWN0IGlzIHJlc3RvcmVkLCBhbiBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1pZ2h0IG5vdAotICogICAgYmUgYXZhaWxhYmxlLiBJdCBtdXN0IGJlIHBvc3NpYmxlIHRvIHNraXAgYW4gb2JqZWN0IGluIHRoaXMgY2FzZS48L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgdGhlIGFwcHJvcHJpYXRlIGNsYXNzIGZvciB0aGUgb2JqZWN0IG1heSBiZQotICogICAgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB3aGVuIHRoZSBvYmplY3Qgd2FzIG9yaWdpbmFsbHkgc2F2ZWQuIElmIHNvLCB0aGUKLSAqICAgIG5ldyBjbGFzcyBzaG91bGQgc3RpbGwgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgZm9ybSBvZiB0aGUgZGF0YS48L2xpPgotICogPC9vbD4KLSAqIDwvcD4KLSAqIDxwPgotICogTWVtZW50b3MgbWVldCB0aGVzZSByZXF1aXJlbWVudHMgYnkgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIHN0b3JpbmcgYQotICogbWFwcGluZyBvZiBhcmJpdHJhcnkgc3RyaW5nIGtleXMgdG8gcHJpbWl0aXZlIHZhbHVlcywgYW5kIGJ5IGFsbG93aW5nCi0gKiBtZW1lbnRvcyB0byBoYXZlIG90aGVyIG1lbWVudG9zIGFzIGNoaWxkcmVuIChhcnJhbmdlZCBpbnRvIGEgdHJlZSkuCi0gKiBBIHJvYnVzdCBleHRlcm5hbCBzdG9yYWdlIGZvcm1hdCBiYXNlZCBvbiBYTUwgaXMgdXNlZC4KLSAqIDwvcD48cD4KLSAqIFRoZSBrZXkgZm9yIGFuIGF0dHJpYnV0ZSBtYXkgYmUgYW55IGFscGhhIG51bWVyaWMgdmFsdWUuICBIb3dldmVyLCB0aGUKLSAqIHZhbHVlIG9mIDxjb2RlPlRBR19JRDwvY29kZT4gaXMgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZS4KLSAqIDwvcD48cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZW1lbnRvIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW4gdHlwZQotCSAqLwotCXB1YmxpYyBJTWVtZW50b1tdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogICBidXQgd2FzIG5vdCBhbiBpbnRlZ2VyCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SW50ZWdlcihTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKLQkgKiAgYnV0IHdhcyBub3QgYW4gaW50ZWdlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkM2I4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckxvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySlJFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lckRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhDb250YWluZXJVbmJvdW5kOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ29weWluZ0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDcmVhdGluZ1ppcEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEZWxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZW5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZWFkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1J1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JGYWNldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRlbGV0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm90QURpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1rZGlyOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhQcmV2aWV3U2VydmVyUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1YzYyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1jbGFzc3BhdGhDb250YWluZXJEZXNjcmlwdGlvbj1TZXJ2ZXIgTGlicmFyeQotY2xhc3NwYXRoQ29udGFpbmVyPXswfSBbezF9XQotY2xhc3NwYXRoQ29udGFpbmVyVW5ib3VuZD17MH0gW3sxfV0gKHVuYm91bmQpCi0KLWVycm9yTG9jYXRpb249SW52YWxpZCBsb2NhdGlvbi4KLWVycm9ySlJFPUludmFsaWQgSlJFLgotCi1jb3B5aW5nVGFzaz1Db3B5aW5nIGZyb20gezB9IHRvIHsxfQotZGVsZXRpbmdUYXNrPURlbGV0aW5nIHswfQotZXJyb3JDb3B5aW5nRmlsZT1FcnJvciBjb3B5aW5nIGZpbGUgezB9OiB7MX0KLWVycm9yQ3JlYXRpbmdaaXBGaWxlPUVycm9yIGNyZWF0aW5nIHppcCBmaWxlIHswfTogezF9Ci1lcnJvckRlbGV0ZT1Db3VsZCBub3QgZGVsZXRlIHByZXZpb3VzIGNvcHksIHdoaWNoIG1heSBiZSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLgotZXJyb3JSZW5hbWU9Q291bGQgbm90IHJlcGxhY2Ugd2l0aCB0ZW1wIGZpbGUgezB9LgotZXJyb3JSZWFkaW5nPUVycm9yIHJlYWRpbmcgZmlsZSB7MH0KLWVycm9yTm9SdW50aW1lPUNhbm5vdCB2ZXJpZnkgZmFjZXRzIGJlY2F1c2UgdGhlcmUgaXMgbm8gcnVudGltZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci4KLWVycm9yRmFjZXQ9UHJvamVjdCBmYWNldCB7MH0gdmVyc2lvbiB7MX0gaXMgbm90IHN1cHBvcnRlZC4KLWVycm9yRGVsZXRpbmc9Q291bGQgbm90IGRlbGV0ZSB7MH0uIE1heSBiZSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLgotZXJyb3JOb3RBRGlyZWN0b3J5PUNvdWxkIG5vdCBkZWxldGUgezB9IHNpbmNlIGl0IGlzIG5vdCBhIGRpcmVjdG9yeS4KLWVycm9yTWtkaXI9Q291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgezB9LgotCi11cGRhdGVDbGFzc3BhdGhDb250YWluZXJzPVVwZGF0aW5nIGNsYXNzcGF0aCBjb250YWluZXIgZm9yIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDU3ODRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy5pbnRlcm5hbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGUgewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzU3RhdGljOwotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvamVjdFBhdGg7Ci0KLQlwdWJsaWMgTW9kdWxlKFN0cmluZyBuYW1lLCBib29sZWFuIGlzU3RhdGljLCBTdHJpbmcgY29udGV4dCwgU3RyaW5nIHByb2plY3RQYXRoKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYzsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5wcm9qZWN0UGF0aCA9IHByb2plY3RQYXRoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0aWNXZWIoKSB7Ci0JCXJldHVybiBpc1N0YXRpYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHByb2plY3RQYXRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1ByZXZpZXdBcHBsaWNhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9pbnRlcm5hbC9QcmV2aWV3QXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmY2Y2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1ByZXZpZXdBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFByZXZpZXdBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7Ci0JcHJvdGVjdGVkIFByZXZpZXdTdGFydGVyIHN0YXJ0ZXI7Ci0KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0ZXIgPSBuZXcgUHJldmlld1N0YXJ0ZXIobnVsbCk7Ci0JCXN0YXJ0ZXIucnVuKCk7Ci0JCXJldHVybiBFWElUX09LOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCXN0YXJ0ZXIuc3RvcCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1ByZXZpZXdTZXJ2ZXJQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvUHJldmlld1NlcnZlclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTlkMmJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvUHJldmlld1NlcnZlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3U2VydmVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3IjsKLQotCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JcHJpdmF0ZSBzdGF0aWMgUHJldmlld1NlcnZlclBsdWdpbiBzaW5nbGV0b247Ci0KLQlwcm90ZWN0ZWQgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBKYXZhU2VydmVyUGx1Z2luLgotCSAqLwotCXB1YmxpYyBQcmV2aWV3U2VydmVyUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlzaW5nbGV0b24gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKgotCSAqIEByZXR1cm4gYSBzaW5nbGV0b24gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZXZpZXdTZXJ2ZXJQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0MikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQyKTsKLQkJY29udGV4dCA9IGNvbnRleHQyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0Mik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvUHJldmlld1N0YXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvUHJldmlld1N0YXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyMTQ0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1ByZXZpZXdTdGFydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuRmlsdGVyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcubW9ydGJheS5odHRwLkh0dHBDb250ZXh0OwotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuaGFuZGxlci5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLm1vcnRiYXkuamV0dHkuKjsKLWltcG9ydCBvcmcubW9ydGJheS5qZXR0eS5zZXJ2bGV0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFByZXZpZXdTdGFydGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBVkVSVEVEX0xPR1MgPSBuZXcgU3RyaW5nW10gewotCQkib3JnLm1vcnRiYXkudXRpbC5Db250YWluZXIiLCAib3JnLm1vcnRiYXkuaHR0cC5IdHRwU2VydmVyIiwKLQkJIm9yZy5tb3J0YmF5LnV0aWwuQ3JlZGVudGlhbCIsICJvcmcubW9ydGJheS5odHRwLlNvY2tldExpc3RlbmVyIiwKLQkJIm9yZy5tb3J0YmF5Lmh0dHAuSHR0cFNlcnZlciIsICJvcmcubW9ydGJheS5qZXR0eS5TZXJ2ZXIiCi0JfTsKLQotCXByb3RlY3RlZCBTdHJpbmcgY29uZmlnUGF0aDsKLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQotCXB1YmxpYyBQcmV2aWV3U3RhcnRlcihTdHJpbmcgY29uZmlnUGF0aCkgewotCQl0aGlzLmNvbmZpZ1BhdGggPSBjb25maWdQYXRoOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJUHJldmlld1N0YXJ0ZXIgYXBwID0gbmV3IFByZXZpZXdTdGFydGVyKGFyZ3NbMF0pOwotCQlhcHAucnVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVuKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHByZXZpZXcgc2VydmVyIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQl0cnkgewotCQkJU2VydmVyQ29uZmlnIGNvbmZpZyA9IG5ldyBTZXJ2ZXJDb25maWcoY29uZmlnUGF0aCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBvcnQgIiArIGNvbmZpZy5nZXRQb3J0KCkpOwotCQkJTW9kdWxlW10gbSA9IGNvbmZpZy5nZXRNb2R1bGVzKCk7Ci0JCQlpbnQgc2l6ZSA9IG0ubGVuZ3RoOwotCQkJaWYgKHNpemUgPiAwKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb2R1bGVzOiIpOwotCQkJCWZvciAoTW9kdWxlIG1tIDogbSkKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICIgKyBtbS5nZXROYW1lKCkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJCi0JCQlmb3IgKFN0cmluZyBsb2cgOiBBVkVSVEVEX0xPR1MpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihsb2cpOwotCQkJCWxvZ2dlci5zZXRGaWx0ZXIobmV3IEZpbHRlcigpIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gaXNMb2dnYWJsZShMb2dSZWNvcmQgcmVjb3JkKSB7Ci0JCQkJCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkF2ZXJ0ZWQgSmV0dHkgbG9nOiAiICsgcmVjb3JkLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYXZlcnRlZDogIiArIHJlY29yZC5nZXRMb2dnZXJOYW1lKCkgKyAiOiAiICsgcmVjb3JkLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCQotCQkJLy8gaGVscGVyIGNvZGUgdG8gZmluZCBqZXR0eSBsb2dnZXJzCi0JCQkvKkxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJvcmcubW9ydGJheS5odHRwLkh0dHBTZXJ2ZXIiKTsKLQkJCWxvZ2dlci5hZGRIYW5kbGVyKG5ldyBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZmx1c2goKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHB1Ymxpc2goTG9nUmVjb3JkIHJlY29yZCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvZ2dlciBmb3VuZDogIiArIHJlY29yZC5nZXRMb2dnZXJOYW1lKCkpOwotCQkJCX0KLQkJCX0pOyovCi0JCQkKLQkJCXNlcnZlciA9IG5ldyBTZXJ2ZXIoKTsKLQkJCXNlcnZlci5hZGRMaXN0ZW5lcigiOiIgKyBjb25maWcuZ2V0UG9ydCgpKTsKLQkJCXNlcnZlci5zZXRUcmFjZShmYWxzZSk7Ci0JCQlzZXJ2ZXIuc2V0U3RhdHNPbihmYWxzZSk7Ci0JCQkKLQkJCUh0dHBDb250ZXh0IGNvbnRleHQyID0gbmV3IEh0dHBDb250ZXh0KCk7Ci0JCQljb250ZXh0Mi5zZXRDb250ZXh0UGF0aCgiLyIpOwotCQkJY29udGV4dDIuYWRkSGFuZGxlcihuZXcgV1RQRXJyb3JQYWdlSGFuZGxlcigpKTsKLQkJCWNvbnRleHQyLnNldEF0dHJpYnV0ZShIdHRwQ29udGV4dC5fX0Vycm9ySGFuZGxlciwgbmV3IFdUUEVycm9yUGFnZUhhbmRsZXIoKSk7Ci0JCQlzZXJ2ZXIuYWRkQ29udGV4dChjb250ZXh0Mik7Ci0JCQlzZXJ2ZXIuc2V0Um9vdFdlYkFwcCgiLyIpOwotCQkJCi0JCQlmb3IgKE1vZHVsZSBtb2R1bGUgOiBtKSB7Ci0JCQkJaWYgKG1vZHVsZS5pc1N0YXRpY1dlYigpKSB7Ci0JCQkJCUh0dHBDb250ZXh0IGNvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTsKLQkJCQkJY29udGV4dC5zZXRDb250ZXh0UGF0aChtb2R1bGUuZ2V0Q29udGV4dCgpKTsKLQkJCQkJY29udGV4dC5zZXRSZXNvdXJjZUJhc2UobW9kdWxlLmdldFBhdGgoKSk7Ci0JCQkJCWNvbnRleHQuYWRkSGFuZGxlcihuZXcgUmVzb3VyY2VIYW5kbGVyKCkpOwotCQkJCQljb250ZXh0LmFkZEhhbmRsZXIobmV3IFdUUEVycm9yUGFnZUhhbmRsZXIoKSk7Ci0JCQkJCWNvbnRleHQuc2V0QXR0cmlidXRlKEh0dHBDb250ZXh0Ll9fRXJyb3JIYW5kbGVyLCBuZXcgV1RQRXJyb3JQYWdlSGFuZGxlcigpKTsKLQkJCQkJc2VydmVyLmFkZENvbnRleHQoY29udGV4dCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJV2ViQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQgPSBzZXJ2ZXIuYWRkV2ViQXBwbGljYXRpb24obW9kdWxlLmdldENvbnRleHQoKSwgbW9kdWxlLmdldFBhdGgoKSk7Ci0JCQkJCS8vY29udGV4dC5nZXRXZWJBcHBsaWNhdGlvbkhhbmRsZXIoKTsKLQkJCQkJLy9jb250ZXh0LmFkZEhhbmRsZXIobmV3IFdUUEVycm9yUGFnZUhhbmRsZXIoKSk7Ci0JCQkJCWNvbnRleHQuc2V0QXR0cmlidXRlKEh0dHBDb250ZXh0Ll9fRXJyb3JIYW5kbGVyLCBuZXcgV1RQRXJyb3JQYWdlSGFuZGxlcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJc2VydmVyLnN0YXJ0KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcCEiKTsKLQkJCXNlcnZlci5zdG9wKCk7Ci0JCQkvL0ZpbGUgY29udGV4dFdvcmtEaXIgPSBuZXcgRmlsZSh3b3JrRGlyLCBESVJfUFJFRklYICsgcGlkLmhhc2hDb2RlKCkpOwotCQkJLy9kZWxldGVEaXJlY3RvcnkoY29udGV4dFdvcmtEaXIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGRlbGV0ZURpcmVjdG9yeSBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byByZWN1cnNpdmVseSBkZWxldGUgYSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gZGlyZWN0b3J5IC0gdGhlIGRpcmVjdG9yeSB0byBkZWxldGUuCi0JICogQHJldHVybiB3YXMgdGhlIGRlbGV0ZSBzdWNjZXNmdWwKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWlmIChkaXJlY3RvcnkuZXhpc3RzKCkgJiYgZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkJCWZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKLQkJCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCWRlbGV0ZURpcmVjdG9yeShmaWxlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaWxlLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlyZWN0b3J5LmRlbGV0ZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1NlcnZlckNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9pbnRlcm5hbC9TZXJ2ZXJDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExY2M0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1NlcnZlckNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFNlcnZlckNvbmZpZyB7Ci0JcHJpdmF0ZSBTdHJpbmcgY29uZmlnUGF0aDsKLQlwcml2YXRlIE1vZHVsZVtdIG1vZHVsZXM7Ci0JcHJpdmF0ZSBpbnQgcG9ydCA9IDgwODA7Ci0KLQlwdWJsaWMgU2VydmVyQ29uZmlnKFN0cmluZyBjb25maWdQYXRoKSB7Ci0JCXRoaXMuY29uZmlnUGF0aCA9IGNvbmZpZ1BhdGg7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJRmlsZSBmID0gbmV3IEZpbGUoY29uZmlnUGF0aCk7Ci0JCWlmICghZi5leGlzdHMoKSkKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ29uZmlnIGRvZXNuJ3QgZXhpc3QgYXQgIiArIGNvbmZpZ1BhdGgpOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oZik7Ci0JCQkJSW50ZWdlciBwcnQgPSBtZW1lbnRvLmdldEludGVnZXIoInBvcnQiKTsKLQkJCQlpZiAocHJ0ICE9IG51bGwpCi0JCQkJCXBvcnQgPSBwcnQuaW50VmFsdWUoKTsKLQkJCQkKLQkJCQlJTWVtZW50b1tdIG1vZHVsZXMyID0gbWVtZW50by5nZXRDaGlsZHJlbigibW9kdWxlIik7Ci0JCQkJaW50IHNpemUgPSBtb2R1bGVzMi5sZW5ndGg7Ci0JCQkJTGlzdDxNb2R1bGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZT4oc2l6ZSk7Ci0JCQkJZm9yIChJTWVtZW50byBtb2QgOiBtb2R1bGVzMikgewotCQkJCQlTdHJpbmcgbmFtZSA9IG1vZC5nZXRTdHJpbmcoIm5hbWUiKTsKLQkJCQkJYm9vbGVhbiBpc1N0YXRpYyA9ICJzdGF0aWMiLmVxdWFscyhtb2QuZ2V0U3RyaW5nKCJ0eXBlIikpOwotCQkJCQlTdHJpbmcgcGF0aCA9IG1vZC5nZXRTdHJpbmcoInBhdGgiKTsKLQkJCQkJU3RyaW5nIGNvbnRleHQgPSBtb2QuZ2V0U3RyaW5nKCJjb250ZXh0Iik7Ci0JCQkJCU1vZHVsZSBtb2R1bGUgPSBuZXcgTW9kdWxlKG5hbWUsIGlzU3RhdGljLCBjb250ZXh0LCBwYXRoKTsKLQkJCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJbW9kdWxlcyA9IG5ldyBNb2R1bGVbbGlzdC5zaXplKCldOwotCQkJCWxpc3QudG9BcnJheShtb2R1bGVzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLQkJcmV0dXJuIHBvcnQ7Ci0JfQotCi0JcHVibGljIE1vZHVsZVtdIGdldE1vZHVsZXMoKSB7Ci0JCXJldHVybiBtb2R1bGVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODZkNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSB7Ci0JLyoqCi0JICogQ29uZmlnIHRyYWNpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ09ORklHID0gMDsKLQkvKioKLQkgKiBXYXJuaW5nIHRyYWNpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgV0FSTklORyA9IDE7Ci0JLyoqCi0JICogU2V2ZXJlIHRyYWNpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VWRVJFID0gMjsKLQkvKioKLQkgKiBGaW5lc3QgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGSU5FU1QgPSAzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFBVQkxJU0hJTkcgPSA0OwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGxldmVsIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzKSB7Ci0JCVRyYWNlLnRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIGxldmVsIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgU3RyaW5nCi0JICogQHBhcmFtIHQgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewotCQlpZiAoIVByZXZpZXdTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCQkKLQkJU3lzdGVtLm91dC5wcmludGxuKFByZXZpZXdTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEICsgIiAiICsgcyk7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJldmlldy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9wcmV2aWV3L2ludGVybmFsL1dUUEVycm9yUGFnZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvV1RQRXJyb3JQYWdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjc5ZWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvV1RQRXJyb3JQYWdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci0KLWltcG9ydCBvcmcubW9ydGJheS5odHRwLkh0dHBFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5IdHRwRmllbGRzOwotaW1wb3J0IG9yZy5tb3J0YmF5Lmh0dHAuSHR0cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5IdHRwUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLm1vcnRiYXkuaHR0cC5oYW5kbGVyLkFic3RyYWN0SHR0cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLm1vcnRiYXkudXRpbC5CeXRlQXJyYXlJU084ODU5V3JpdGVyOwotaW1wb3J0IG9yZy5tb3J0YmF5LnV0aWwuU3RyaW5nVXRpbDsKLQotcHVibGljIGNsYXNzIFdUUEVycm9yUGFnZUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEh0dHBIYW5kbGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCXB1YmxpYyB2b2lkIGhhbmRsZShTdHJpbmcgcGF0aEluQ29udGV4dCwgU3RyaW5nIHBhdGhQYXJhbXMsIEh0dHBSZXF1ZXN0IHJlcXVlc3QsCi0JCQlIdHRwUmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKEh0dHBGaWVsZHMuX19UZXh0SHRtbCk7Ci0JCUJ5dGVBcnJheUlTTzg4NTlXcml0ZXIgd3JpdGVyID0gbmV3IEJ5dGVBcnJheUlTTzg4NTlXcml0ZXIoMjA0OCk7Ci0JCXdyaXRlRXJyb3JQYWdlKHJlcXVlc3QsIHdyaXRlciwgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFJlYXNvbigpKTsKLQkJCi0JCS8vIHdvcmthcm91bmQgZm9yIElFLCB3aGljaCBvdmVycmlkZXMgNDA0IGVycm9ycyB0byBwcmVzZW50IGl0cyBvd24gcGFnZQotCQlpZiAocmVzcG9uc2UuZ2V0U3RhdHVzKCkgPT0gNDA0KQotCQkJcmVzcG9uc2Uuc2V0U3RhdHVzKDIwMCwgIk9LIik7IAotCQkKLQkJd3JpdGVyLmZsdXNoKCk7Ci0JCXJlc3BvbnNlLnNldENvbnRlbnRMZW5ndGgod3JpdGVyLnNpemUoKSk7Ci0JCXdyaXRlci53cml0ZVRvKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKLQkJd3JpdGVyLmRlc3Ryb3koKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUVycm9yUGFnZShIdHRwUmVxdWVzdCByZXF1ZXN0LCBXcml0ZXIgd3JpdGVyLCBpbnQgY29kZSwKLQkJCVN0cmluZyBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlID0gVVJMRGVjb2Rlci5kZWNvZGUobWVzc2FnZSwgIlVURi04Iik7Ci0JCQltZXNzYWdlID0gU3RyaW5nVXRpbC5yZXBsYWNlKG1lc3NhZ2UsICI8IiwgIiZsdDsiKTsKLQkJCW1lc3NhZ2UgPSBTdHJpbmdVdGlsLnJlcGxhY2UobWVzc2FnZSwgIj4iLCAiJmd0OyIpOwotCQl9Ci0JCVN0cmluZyB1cmkgPSByZXF1ZXN0LmdldFBhdGgoKTsKLQkJdXJpID0gU3RyaW5nVXRpbC5yZXBsYWNlKHVyaSwgIjwiLCAiJmx0OyIpOwotCQl1cmkgPSBTdHJpbmdVdGlsLnJlcGxhY2UodXJpLCAiPiIsICImZ3Q7Iik7Ci0JCXdyaXRlci53cml0ZSgiPGh0bWw+XG48aGVhZD5cbjx0aXRsZT5FcnJvciAiKTsKLQkJd3JpdGVyLndyaXRlKEludGVnZXIudG9TdHJpbmcoY29kZSkpOwotCQl3cml0ZXIud3JpdGUoJyAnKTsKLQkJd3JpdGVyLndyaXRlKG1lc3NhZ2UpOwotCQl3cml0ZXIud3JpdGUoIjwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbjxoMj5IVFRQIEVSUk9SOiAiKTsKLQkJd3JpdGVyLndyaXRlKEludGVnZXIudG9TdHJpbmcoY29kZSkpOwotCQl3cml0ZXIud3JpdGUoIjwvaDI+PHByZT4iKTsKLQkJd3JpdGVyLndyaXRlKG1lc3NhZ2UpOwotCQl3cml0ZXIud3JpdGUoIjwvcHJlPlxuIik7Ci0JCXdyaXRlci53cml0ZSgiPHA+UmVxdWVzdFVSST0iKTsKLQkJd3JpdGVyLndyaXRlKHVyaSk7Ci0JCXdyaXRlci53cml0ZSgiPC9wPiIpOwotCQl3cml0ZXIud3JpdGUoIlxuPC9ib2R5PlxuPC9odG1sPlxuIik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5wcmV2aWV3L3NyYy9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3ByZXZpZXcvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzEzNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcvc3JjL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvcHJldmlldy9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnByZXZpZXcuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotLyoqCi0gKiBBIE1lbWVudG8gaXMgYSBjbGFzcyBpbmRlcGVuZGVudCBjb250YWluZXIgZm9yIHBlcnNpc3RlbmNlCi0gKiBpbmZvLiAgSXQgaXMgYSByZWZsZWN0aW9uIG9mIDMgc3RvcmFnZSByZXF1aXJlbWVudHMuCi0gKgotICogMSkgICBXZSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcnNpc3QgYW4gb2JqZWN0IGFuZCByZXN0b3JlIGl0LiAgCi0gKiAyKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBiZSBhYnNlbnQuICBJZiBzbyB3ZSB3b3VsZCAKLSAqICAgICAgbGlrZSB0byBza2lwIHRoZSBvYmplY3QgYW5kIGtlZXAgcmVhZGluZy4gCi0gKiAzKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBjaGFuZ2UuICBJZiBzbyB0aGUgbmV3IGNsYXNzIAotICogICAgICBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgcGVyc2lzdGVuY2UgaW5mby4KLSAqCi0gKiBXZSBjb3VsZCBhc2sgdGhlIG9iamVjdHMgdG8gc2VyaWFsaXplIHRoZW1zZWx2ZXMgaW50byBhbiAKLSAqIE9iamVjdE91dHB1dFN0cmVhbSwgRGF0YU91dHB1dFN0cmVhbSwgb3IgSGFzaHRhYmxlLiAgSG93ZXZlciAKLSAqIGFsbCBvZiB0aGVzZSBhcHByb2FjaGVzIGZhaWwgdG8gbWVldCB0aGUgc2Vjb25kIHJlcXVpcmVtZW50LgotICoKLSAqIE1lbWVudG8gc3VwcG9ydHMgYmluYXJ5IHBlcnNpc3RlbmNlIHdpdGggYSB2ZXJzaW9uIElELgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHsKLQlwcml2YXRlIERvY3VtZW50IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBtZW1lbnRvIGZvciB0aGUgZG9jdW1lbnQgYW5kIGVsZW1lbnQuICBGb3Igc2ltcGxpY2l0eQotCSAqIHlvdSBzaG91bGQgdXNlIGNyZWF0ZVJlYWRSb290IGFuZCBjcmVhdGVXcml0ZVJvb3QgdG8gY3JlYXRlIHRoZSBpbml0aWFsCi0JICogbWVtZW50b3Mgb24gYSBkb2N1bWVudC4KLQkgKi8KLQlwcml2YXRlIFhNTE1lbWVudG8oRG9jdW1lbnQgZG9jLCBFbGVtZW50IGVsKSB7Ci0JCWZhY3RvcnkgPSBkb2M7Ci0JCWVsZW1lbnQgPSBlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBEb2N1bWVudCBmcm9tIGEgUmVhZGVyIGFuZCBhbnN3ZXIgYSByb290IG1lbWVudG8gZm9yIHJlYWRpbmcgCi0JICogYSBkb2N1bWVudC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVJlYWRSb290KElucHV0U3RyZWFtIGluKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQlOb2RlIG5vZGUgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCAoRWxlbWVudCkgbm9kZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCS8vIEdldCB0aGUgbm9kZXMuCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkKLQkJLy8gRmluZCB0aGUgZmlyc3Qgbm9kZSB3aGljaCBpcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KLQkJZm9yIChpbnQgblggPSAwOyBuWCA8IHNpemU7IG5YICsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5YKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgZWxlbWVudDIgPSAoRWxlbWVudClub2RlOwotCQkJCWlmIChlbGVtZW50Mi5nZXROb2RlTmFtZSgpLmVxdWFscyh0eXBlKSkKLQkJCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGVsZW1lbnQyKTsKLQkJCX0KLQkJfQotCQotCQkvLyBBIGNoaWxkIHdhcyBub3QgZm91bmQuCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBJTWVtZW50byBbXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSkgewotCQkvLyBHZXQgdGhlIG5vZGVzLgotCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG5ldyBJTWVtZW50b1swXTsKLQkKLQkJLy8gRXh0cmFjdCBlYWNoIG5vZGUgd2l0aCBnaXZlbiB0eXBlLgotCQlMaXN0PEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KHNpemUpOwotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQotCQkJCQlsaXN0LmFkZChlbGVtZW50Mik7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gQ3JlYXRlIGEgbWVtZW50byBmb3IgZWFjaCBub2RlLgotCQlzaXplID0gbGlzdC5zaXplKCk7Ci0JCUlNZW1lbnRvIFtdIHJlc3VsdHMgPSBuZXcgSU1lbWVudG9bc2l6ZV07Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgc2l6ZTsgeCArKykgewotCQkJcmVzdWx0c1t4XSA9IG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGxpc3QuZ2V0KHgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJbnRlZ2VyKFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCVN0cmluZyBzdHJWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihzdHJWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYSBtZW1lbnRvIGZyb20gdGhlIGdpdmVuIGZpbGUuCi0JICoKLQkgKiBAcGFyYW0gZmlsZSBhIGZpbGUKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAcmV0dXJuIGEgbWVtZW50bwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1lbWVudG8gbG9hZE1lbWVudG8oRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCQkJcmV0dXJuIFhNTE1lbWVudG8uY3JlYXRlUmVhZFJvb3QoaW4pOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=